在SDK中打开其他接入应用的解决方案

一直以来,在iOS的开发中,在程序中打开另外一个应用是不允许。后来有正义之士用class-dump在私有API中找到了这样的功能。那就是使用UIApplication的launchApplicationWithIdentifier:suspended:来打开。

使用的办法如下:


NSString *identifier = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"];

[[UIApplication sharedApplication] launchApplicationWithIdentifier:identifier suspended:NO];

毕竟是私有API不是一个好的办法,至少你永远都得不到App Store的认可。

在某些时候是其实我们可能还是需要这样的功能。作为一个SDK,其实还是有一种比较好的解决方案的。那就是使用UIApplication的openURL:的方法。

我们先来了解一下openURL和实现的方案。OpenURL其实是有很丰富的功能,除了简单的调用safari打开网站,还可有google地图搜索,Mail,拨打电话,发送短信,打开AppStore。


-(IBAction)openMaps {//打开地图
    // Where is Apple on the map anyway?
    NSString* addressText = @”1 Infinite Loop, Cupertino, CA 95014″;
    // URL encode the spaces
    addressText =  [addressText stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];
    NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];
    // lets throw this text on the log so we can view the url in the event we have an issue
    NSLog(urlText);
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
    } 
    -(IBAction)openEmail {//打开mail
    // Fire off an email to apple support
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://[email protected]"]];
    } 
    -(IBAction)openPhone {//拨打电话
    // Call Google 411
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];
    } 
    -(IBAction)openSms {//打开短信
    // Text to Google SMS
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://466453"]];
    } 
    -(IBAction)openBrowser {//打开浏览器
    // Lanuch any iPhone developers fav site
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunesconnect.apple.com"]];
    }

那怎样来制作从一个应用打开其他应用,这其实很简单,打开info.plist,添加一项URL types,展开URL types,再展开Item1,将Item1下的URL identifier修改为URL Scheme,展开URL Scheme,将Item1的内容修改为myapp其他程序可通过myapp://访问此自定义URL。

其实就是类似下面的样式。

这样就只要open这个应用的自定义url,系统就可以帮我们找到并打开这个程序。


NSURL *url = [NSURL URLWithString:@" myapp:"];

[[UIApplication sharedApplication] openURL:url];

作为SDK比普通应用的优势在于,每一个接入的应用都有一个AppId用于区分,我们就可以充分利用这个AppId来制作。

我们可以要求第三方开发者需要在他们Info.Plist中配置这样的字段,这样我们就可以在我们的SDK界面中打开对应AppId的应用,当然,这需要设备中真的有安装这个程序。

例如某应用分配AppId为111122223333,我们要求其再Info.plist定义URL Schemes为NDSDK111122223333,这样,我们在内部代码就可以准确识别是否有这样的程序。

更有甚者,我们可以通过canOpenURL这个方法来判断这台设备是否安装了这个应用,如果可以打开,返回YES,那应该是有安装这样的程序,不管是ipa还是Pxl的程序,应该都是没有问题的。

如果我们真的选择这样子做,那就需要在文档中说明清楚。但是需要注意的是,也许作为程序员,可能不是很喜欢看文档,也许你费尽心思写的文档他并没有看到。这时我们应该来一点强硬的手段,于是有了下面这段代码的功能。

1:检查用户是否配置了AppId

2:有没有准确配置Info的CFBundleURLSchemes字段

3:是不是可以正确打开。


// Check App ID:

// This is really a warning for the developer, this should not

// happen in a completed app

if (!kAppId) {

UIAlertView *alertView = [[UIAlertView alloc]

initWithTitle:@"Setup Error"

message:@"Missing app ID. You cannot run the app until you provide this in the code."

delegate:self

cancelButtonTitle:@"OK"

otherButtonTitles:nil,

nil];

[alertView show];

[alertView release];

} else {

// Now check that the URL scheme fb[app_id]://authorize is in the .plist and can

// be opened, doing a simple check without local app id factored in here

NSString *url = [NSString stringWithFormat:@"fb%@://authorize",kAppId];

BOOL bSchemeInPlist = NO; // find out if the sceme is in the plist file.

NSArray* aBundleURLTypes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"];

if ([aBundleURLTypes isKindOfClass:[NSArray class]] &&

([aBundleURLTypes count] > 0)) {

NSDictionary* aBundleURLTypes0 = [aBundleURLTypes objectAtIndex:0];

if ([aBundleURLTypes0 isKindOfClass:[NSDictionary class]]) {

NSArray* aBundleURLSchemes = [aBundleURLTypes0 objectForKey:@"CFBundleURLSchemes"];

if ([aBundleURLSchemes isKindOfClass:[NSArray class]] &&

([aBundleURLSchemes count] > 0)) {

NSString *scheme = [aBundleURLSchemes objectAtIndex:0];

if ([scheme isKindOfClass:[NSString class]] &&

[url hasPrefix:scheme]) {

bSchemeInPlist = YES;

}

}

}

}

// Check if the authorization callback will work

BOOL bCanOpenUrl = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString: url]];

if (!bSchemeInPlist || !bCanOpenUrl) {

UIAlertView *alertView = [[UIAlertView alloc]

initWithTitle:@"Setup Error"

message:@"Invalid or missing URL scheme. You cannot run the app until you set up a valid URL scheme in your .plist."

delegate:self

cancelButtonTitle:@"OK"

otherButtonTitles:nil,

nil];

[alertView show];

[alertView release];

}

}

时间: 2025-01-13 18:05:41

在SDK中打开其他接入应用的解决方案的相关文章

微信或QQ中打开网址被拦截的解决方案

很多朋友问我,为什么我的微信域名或者QQ域名怎么总是提示拦截呢?在这里跟大家说一下吧: 第一点:就是域名里面的内容违规或者诱导被举报而导致的拦截 第二点:就是被用户或者同行恶意举报而导致的 第三点:服务商(例如腾讯,360一段时间的批量封杀域名)等等情况 第四点:你的网站,有强制分享,或者诱导分享, 有的人说:别人的也有这些,为什么不被拦截, 因为他们使用了防拦截程序,所以不会被拦截, 什么是防封? 答:简单来讲就是当你在推广时,域名不会被拦截,或者说,是个做推广的都知道,特别是灰色的,分分钟就

在高版本SDK中打开现存低版本SDK工程

直接打开低版本SDK工程会出现错误提示:“Unable to resolve target 'android-xx” 解决方法: 1.将project.properties文件中的“target=android-xx”更改为当前API所对应的版本 2.注意AndroidManifest.xml文件中“android:minSdkVersion="xx"”应该小于等于引入工程的API版本 注意:若更改后重新编译仍然报错,请删除gen目录下R.java与buildconfig.java文件

电脑桌面上的CAD图纸在CAD中打开看不见内容怎么办?

电脑桌面上的CAD图纸在CAD中打开看不见内容怎么办?在日常的工作中,我们在编辑CAD图纸的时候会遇到非常多的问题,有的时候把编辑完成的CAD图纸下载到电脑桌面上在CAD中打开之后就看不见内容怎么办?这是怎么回事了?具体要怎么来进行操作?是哪里出现问题了吗?下面我们就来一起看看解决办法吧! 第一步:首先,在电脑中的任意一个浏览器中搜索迅捷CAD编辑器,进入到迅捷CAD官网,点击下载最新版本的迅捷CAD编辑器,然后双击打开CAD编辑器,进入到软件的操作界面. 第二步:进入到软件的操作界面之后,鼠标

在SDK中使用Ubuntu仿真器

Ubuntu仿真器是开发过程中非常有用,尤其是在没有任何Ubuntu设备时.在将仿真器附加到SDK后,你便可以在上面运行程序,安装点击数据包,等等,类似在物理设备上的操作一样. 在这里,您可以了解如何从Ubuntu SDK使用Ubuntu仿真器,包括: 创建仿真器 启动仿真器 将仿真器附加到SDK 打开连接到仿真器的根shell 注意:Ubuntu仿真器正在进行快速开发,包括其在SDK中的支持.因此保持敏捷,时刻关注新信息,以及时刻注意最新变化! 提示:为获得一流的Ubuntu仿真器和SDK体验

在第三方应用中打开高德地图的特色功能页面

由于最近的项目中需要在第三方应用中直接打开高德地图的电子狗页面,在高德开发者论坛找了一遍无果之后,只能自己反编译高德地图来找了,现在记录下来方便大家有类似需求时可以直接找到,这样就不需要反编译了. 高德地图有一些非常方便的特色功能,我们可以直接在第三方应用中打开高德地图的这些特色功能页面方便大家使用,前提是手机上必须要安装高德地图. 首先反编译高德地图的APK得到AndroidMainfest.xml文件: <?xml version="1.0" encoding="u

关于iOS SDK中HTTPS强制握手的经验分享

因项目需要,对HTTPS强制握手作了研究,分享处理方法如下: 一. 问题与需求 问题:接入方可能对同个域名做了HTTPS证书验证,在缓存机制下,进入SDK中默认复用HTTPS握手;或者NSURLProtocol对验证作了拦截. 需求: 基于SDK方不信任接入方验证,需强制重新握手. 二.理论前提 1. 握手缓存以IP地址,DNS域名,端口为KEY对握手作缓存 2. “www.xxx.com”, “www.xxx.com.”会有相同的DNS解析结果 三.解决方案 1. 服务器方给出专用IP,域名或

Xamarin中打开别人项目找不到android.jar文件

Xamarin中打开别人项目找不到android.jar文件 错误信息:Could not find android.jar for API Level 23.打开非本机创建的Xamarin项目,编译的时候提示无法找到API.但是本机却没有这个问题.这是因为项目中保存其他计算机的Android SDK路径,而该路径和本地环境不符.这个时候,右击Android项目,选择清理命令即可.

.project sturcture和Project Structure 无论是按快捷键或者是从files中打开都不显示

project sturcture和Project Structure 无论是按快捷键或者是从files中打开都不显示 event log中报:IllegalArgumentException:Multiple entries with same key: Google Inc.:Google APIs:23=Google APIs (Google Inc.) (API 23) and Google Inc.:Google APIs:23=Google APIs (Google Inc.) (A

创建android 模拟器并在cmd中打开

因为在运行monkeyrunner之前必须先运行相应的模拟器或连接真机,否则monkeyrunner无法连接到设备,运行模拟器有两种方法:1.通过eclipse中执行模拟器 2.在CMD中通过命令调用模拟器,此处记录在cmd中打开模拟器时出现的问题及解决方法. 1.创建模拟器 安装android sdk后,可以创建模拟器,关于模拟器的创建,网上有一堆的材料,比如http://jingyan.baidu.com/article/c74d600068ad420f6a595dd2.html,此处我们创