首页 技术 正文
技术 2022年11月19日
0 收藏 387 点赞 2,859 浏览 3011 个字

在 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。

iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

实现

在 Info.plist 里面设置完 URL types 之后,就可以在程序中处理这类 URL 的打开请求了。

在外部程序中,如果打开了指定自定义协议的 URL,程序中 application delegate 的 application:handleOpenURL: 方法就会被调用,在这个方法里,可以获取到触发这个方法的 URL,可以通过对这个 URL 进行判断,例如根据不同的 Host,不同的 Query String 来执行不同的动作。

iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

- (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];    }} 

iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

淘宝 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 上购买,收藏等,就可以使用下面的代码:

iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

- (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];    }}

iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

使用淘宝客户端来打开淘宝链接的好处就是可以让用户更加方便的去购买商品,而不需要再重新登录,或者把用户名密码给了第三方的网站而导致安全隐患。

扩展性

在淘宝客户端中,支持的 URL 往往是淘宝网站已经有的链接,这些链接的 QueryString 中所带的参数往往已经满足了使用本地代码显示内容的需要,但是为了扩展性考虑,就需要添加一些额外的参数,并且与原有 QueryString 中不冲突的参数名称。通过这些额外的参数,再实现客户端打开链接时更多的自定义行为。

例如,如果在打开特定 URL,进行一些操作后需要再返回原来的程序,就会需要在 URL 中添加类似于 callback 这样的参数,这样在客户端处理完用户的操作后,可以将用户操作的结果返回给原来的程序,从而实现程序间的通信。

示例:

iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

- (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];}

iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

注意:当前淘宝客户端并不支持这样的调用方式,这里仅是一个示例。

当然,在使用这种方式实现程序间通信的时候,需要考虑检查一下来源 URL 的合法性,防止一些非法的调用造成用户的损失。

结语

通过自定义协议地支持,可以将 iOS 程序的一些功能和服务提供给外部程序,也可以实现 Web 和本地应用之间的互相调用。

如果你的 iOS 程序有这些需求的话,那么就可以考虑在 iOS 程序中添加自定义协议的支持了。

参考资料

iOS Application Programming Guide: Implementing Custom URL Schemes

— EOF —

论坛原帖:http://www.cocoachina.com/bbs/read.php?tid=104689

来自:Architecting Life

花开花谢春不管,水暖水寒鱼自知.

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,994
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,507
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,350
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,135
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,768
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,845