iOS 调用另一个程序
来源:互联网 发布:mysql输入密码后闪退 编辑:程序博客网 时间:2024/05/30 23:34
在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个程序。
例如在 iPad 上浏览网页,并且 iPad 已经安装了 淘宝 HD,那么就打开下面这个链接就会在淘宝 HD 中查看这个商品的详细信息,也可以方便的使用淘宝 HD 进行购买、收藏等操作。
在淘宝 HD 中查看商品“2012西藏卓明谷方舟登舰卡(船票)”
当然,如果你在 Mac OS X 中打开这个链接,或者在没有安装 淘宝 HD 的 iPad 中打开这个链接,会提示没有程序来打开这个链接。
配置
要为 iOS 程序添加自定义协议的支持是一件很方便的事,只需要在程序的 Info.plist 添加一个 URL types 节点就可以了。在这个节点里,可以设置这个程序所支持的自定义协议名称,像 http、ftp 这种,一般我们可以设置为程序英文名称,像淘宝客户端中就设置了 taobao,这样 taobao:// 这个形式的 URL 就会关联到淘宝客户端的 App。
实现
在 Info.plist 里面设置完 URL types 之后,就可以在程序中处理这类 URL 的打开请求了。
在外部程序中,如果打开了指定自定义协议的 URL,程序中 application delegate 的 application:handleOpenURL: 方法就会被调用,在这个方法里,可以获取到触发这个方法的 URL,可以通过对这个 URL 进行判断,例如根据不同的 Host,不同的 Query String 来执行不同的动作。
- (void)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
NSLog(@"%@", [url absoluteString]);
// 在 host 等于 item.taobao.com 时,说明一个宝贝详情的 url,
// 那么就使用本地的 TBItemDetailViewController 来显示
if ([[url host] isEqualToString:@"item.taobao.com"]) {
// 这里只是简单地假设 url 形式为 taobao://item.taobao.com/item.htm?id=12345678
// 先获取要查看的宝贝详情的 itemId
NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];
// 使用本地 ViewController 来显示淘宝商品详情
TBItemDetailViewController *controller = [[TBItemDetailViewController alloc] initWithItemId:itemId];
[self.navigationController pushViewController:controller animated:YES];
[controller release];
}
}
淘宝 for iOS
现在,淘宝 和 淘宝 HD 两个客户端都支持 taobao:// 协议,来打开特定的链接。目前已经支持的有:
宝贝详情 taobao://item.taobao.com/item.htm?id=12688928896
宝贝搜索 taobao://s.taobao.com/?q=iphone
店铺搜索 taobao://shopsearch.taobao.com/browse/shop_search.htm?q=iphone
例如,想要在自己的程序中,使用淘宝客户端来显示一个淘宝商品的详情,以支持用户可以直接在 iPhone 上购买,收藏等,就可以使用下面的代码:
- (void)showItemInTaobao4iOS:(NSString *)itemId {
// 构建淘宝客户端协议的 URL
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"taobao://item.taobao.com/item.htm?id=%@", itemId]];
// 判断当前系统是否有安装淘宝客户端
if ([[UIApplication sharedApplication] canOpenURL:url]) {
// 如果已经安装淘宝客户端,就使用客户端打开链接
[[UIApplication sharedApplication] openURL:url];
} else {
// 否则使用 Mobile Safari 或者内嵌 WebView 来显示
url = [NSURL URLWithString:[NSString stringWithFormat:@"http://item.taobao.com/item.htm?id=%@", itemId]];
[[UIApplication sharedApplication] openURL:url];
}
}
使用淘宝客户端来打开淘宝链接的好处就是可以让用户更加方便的去购买商品,而不需要再重新登录,或者把用户名密码给了第三方的网站而导致安全隐患。
扩展性
在淘宝客户端中,支持的 URL 往往是淘宝网站已经有的链接,这些链接的 QueryString 中所带的参数往往已经满足了使用本地代码显示内容的需要,但是为了扩展性考虑,就需要添加一些额外的参数,并且与原有 QueryString 中不冲突的参数名称。通过这些额外的参数,再实现客户端打开链接时更多的自定义行为。
例如,如果在打开特定 URL,进行一些操作后需要再返回原来的程序,就会需要在 URL 中添加类似于 callback 这样的参数,这样在客户端处理完用户的操作后,可以将用户操作的结果返回给原来的程序,从而实现程序间的通信。
示例:
- (void)buyItemInTaobao4iOS:(NSString *)itemId {
// 构建淘宝客户端协议的 URL
NSString *format = @"taobao://item.taobao.com/item.htm?id=%@&_action=buy&_callback=myapp://taobaobuysuccess";
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:format, itemId]];
// 使用淘宝客户端打开链接
[[UIApplication sharedApplication] openURL:url];
}
注意:当前淘宝客户端并不支持这样的调用方式,这里仅是一个示例。
当然,在使用这种方式实现程序间通信的时候,需要考虑检查一下来源 URL 的合法性,防止一些非法的调用造成用户的损失。
结语
通过自定义协议地支持,可以将 iOS 程序的一些功能和服务提供给外部程序,也可以实现 Web 和本地应用之间的互相调用。
如果你的 iOS 程序有这些需求的话,那么就可以考虑在 iOS 程序中添加自定义协议的支持了。
参考资料
iOS Application Programming Guide: Implementing Custom URL Schemes
- iOS 调用另一个程序
- IOS-如何在一个程序中调用另一个程序
- 使用QProcess调用另一个程序
- 一个程序调用另一个程序 linux平台
- Python程序调用另一个Python程序
- 自己的app调用另一个app程序
- 程序中调用另一个apk的方法
- main.c调用另一个.c程序
- android程序调用另一个android应用…
- Android调用另一个程序的方法
- 调用linux_shell、另一个可执行程序调用exec函数
- net Compact Framework中用一个程序调用另一个程序
- 在一个程序中控制另一个程序的函数调用
- IOS在一个程序中启动另一个程序
- IOS在一个程序中启动另一个程序
- IOS在一个程序中启动另一个程序
- 系统提示一个程序正在被另一个程序调用,如何知道是被哪个程序调用
- php调用一个c程序,c程序再调用另一个c程序在后台不间断运行
- ListView在显示的时候出现一行行包名
- eclipse中写java,html,css,javascript代码提示
- UVa 10369 Arctic Network (Kruskal+最小生成树的第K小边)
- DbgPrintEx
- Win7,Win8下多窗口运行Excel 2010
- iOS 调用另一个程序
- python中range和xrnage的区别
- oracle列相乘
- 南邮 OJ 1221 最少硬币问题
- Android之system_server与zygote之作用
- QT国际化
- HDU 2594 Simpsons’ Hidden Talents (KMP)
- 论 f.getModifiers() & Modifier.FINAL &Modifier.STATIC 如何成立
- Tesseract-OCR引擎试用 rebuild on vs2012【testing】