标签存档: 淘宝

iOS App 自定义 URL Scheme 设计

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

实现

在 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:// 协议,来打开特定的链接。目前已经支持的有:

例如,想要在自己的程序中,使用淘宝客户端来显示一个淘宝商品的详情,以支持用户可以直接在 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 程序中添加自定义协议的支持了。

参考资料

  1. iOS Application Programming Guide: Implementing Custom URL Schemes

— EOF —

淘宝 for iOS 历程

这是在 [淘宝2011技术嘉年华](http://developerclub.taobao.com/) 上讲的关于淘宝 for iOS 开发过程的演示文稿。

View more presentations from ohdarling88.

— EOF —

iWangWang v0.3.0 Released

在上一个版本发布之后,过了两个月的时间,终于又有一个可以发布的版本了。

使用菜单中的“检查更新”既可完成更新,或者前往 Google Code 下载。

这次的更新如下:

  • [FIX] 修正在 Snow Leopard 中无法在 Dock 上显示未读消息数目的bug
  • [FIX] 修正在网页中点击旺旺图标无法打开聊天窗口的bug
  • [FIX] 修正无法使用“指定发送”和“添加好友”功能的bug
  • [FIX] 修正表情选择框在一些情况下引起程序崩溃的bug
  • [FIX] 修正在聊天窗口中无法指定发送功能无法使用的bug
  • [FIX] 修正一些菜单无法在所有窗口中使用的bug
  • [NEW] 现在可以使用 Ctrl+N 同时运行多个 iWangWang 来实现同时登录多个淘宝帐号
  • [NEW] 现在如果聊天时消息发送失败,可以重新输入验证码
  • [NEW] 登录后会恢复上一次退出时主窗口的位置
  • [NEW] 表情选择框现在可以用 ESC 键关闭
  • [NOTE] 有bug可以在 http://code.google.com/p/iwangwang/issues/entry 提出

这次主要修正了 iWangWang 在 Snow Leopard 下的兼容性,之前的开发环境是 Leopard,没能在 Snow Leopard 中好好测试。

如果有问题请邮件至 ohdarling88 at gmail dot com,或在 http://code.google.com/p/iwangwang/issues/entry 填写问题表单。

Enjoy it.

Xu Jiwei

[HOWTO] 在 Mac 下的 Safari 中直接打开 iWangWang 进行聊天

鉴于支付宝已经发布供 Safari 使用的安全登录控件,并且 Safari 可以自动调用关联程序来打开自定义协议,所有 Safari 下的点击旺旺图标打开 iWangWang 进行聊天比较容易实现,使用一个用户脚本就行。

要实现在 Safari 中点击旺旺图标进行聊天,步骤如下:

  1. 安装 SIMBL
    下载地址:http://www.culater.net/software/SIMBL/SIMBL.php
    SIMBL 可以理解为一个扩展加载器,因为 Safari 本身并不支持扩展机制,所有 SIMBL 使用了一种 Hack 的方式来方便加载第三方扩展。
  2. 安装 GreaseKit
    下载地址:http://8-p.info/greasekit/
    GreaseKit 是一个类似于 GreaseMonkey 的扩展,可以通过它在 Safari 运行用户脚本。
    如果你的系统是 Mac OS X Leopard,那么可能会出现安装 GreaseKit 失败的情况,这时可以试试一位网友重新编译的 GreaseKit,下载地址,关于这个问题的讨论可以看这里
  3. 最后,安装 iWangWang 聊天用户脚本
    安装地址:https://iwangwang.googlecode.com/hg/wwprotocol.user.js
    如果已经正确安装了 GreaseKit,那么在访问这个地址时,浏览器会询问是否安装“WangWang Protocol Handler”,选择“是”即可。

如果你已经将 iWangWang 放到了应用程序目录,那么在点击旺旺图标聊天时,会自动打开 iWangWang,如果 iWangWang 没有放到应用程序目录,那么你可能需要先运行 iWangWang 才可以使用点击旺旺图标进行聊天的功能。

如果有任何问题请联系我 ohdarling88 # gmail dot com