从微信/H5中调起iOS应用

0x00 引言

为了推广产品,产品通常会设计一个二维码,扫描这个二维码进入一个H5页面,H5页面中提供一个链接按钮,点击这个按钮或者直接调起应用或者跳转至AppStore引导下载。

在国内,微信基本上已经变成了事实上的扫码工具(不得不说,微信的扫码模块算法优化的非常强悍,速度和识别率绝对是首屈一指),所有我们设计的H5页面绝大多数情况下是在微信中展示。因此我们研究的重点也会侧重于从微信中调起应用的方法。

下面会介绍几种从H5中调起iOS应用的几种方法。

0x01 URL Scheme

由于苹果的app都是在沙盒中,相互是不能访问数据的。但是苹果还是给出了一个可以在app之间跳转的方法:URL Scheme。简单的说,URL Scheme就是一个可以让app相互之间可以跳转的协议。

我们所使用的每一个app就相当于一个功能,app的跳转可以使得每个app就像一个功能组件一样,帮助我们完成需要做的事情,比如三方支付,搜索,导航,分享等等。

官方的参考文档:About Apple URL Scheme

在iOS系统中,通过URL Scheme的方式启动应用和参数的传递的步骤如下。

1 创建URL Scheme

首先在Info.plist中添加一行,选择URL types;

在展开的Item 0中填写URL identifier,这个用来唯一标识用户自定义的URL Scheme,推荐使用域名的反转形式,如:com.tsingwill.mylink;

在Item 0中添加新的一行,选择URL Schemes, 展开URL Schemes,在Item 0中输入自定义的Scheme的名称。在这里只需要输入自定义的Scheme的名称即可,不需要加上://,例如这里输入的是mylink,那么对应的自定义的URL就是mylink://,这里可以输入多个。
完整的示例图如下:

001.png

2 使用URL Scheme

(1)在Safari中直接在浏览器的地址栏中输入mylink://,即可启动刚才的应用;

(2)在其他的应用程序中使用,在需要调用的地方使用下面的代码即可实现调用。

NSString *customURL = @"mylink://";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];

如果需要传递参数,可以通过?传递,例如:

- (void)openOtherApp
{
    NSString *customURL = @"mylink://?token=123abct&registered=1";
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
}

(3)在AppDelegate中可以实现下面的代理方法

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([sourceApplication isEqualToString:@"com.devzeng.demo.urlscheme"]) {
        NSLog(@"调用的应用程序的Bundle ID是: %@", sourceApplication);
        NSLog(@"URL scheme:%@", [url scheme]);
        NSLog(@"URL query: %@", [url query]);
        return YES;
    } else {
        return NO;
    }
}

3 URL Scheme的限制

设计好H5页面并且配置了URL Scheme后,迫不及待地拿出微信扫下试试,结果发现并没有效果。原来微信对第三方应用的URL Scheme进行了屏蔽,只有加入白名单(交钱)后的URL Scheme才会被放行(可能微信的初衷是防止有人借助于微信平台恶意推广营销)。

如果不想合(交)作(钱),我们只能在H5页面中放上一个条件蒙版:如果是在微信中打开的H5,就展示蒙版,提示用户点击右上角“通过Safari打开”。

0x02 Universal Link

1 What is Universal Links?

通用链接:一种能够方便的通过传统HTTP链接来启动APP, 使用相同的网址打开网站和APP,旨在打造无缝链接APP的体验。首次出现在2015 WWDC上, 是Apple为iOS 9宣布的一个所谓通用链接的深层链接特性。

官方文档:Support Universal Links

2 配置支持Universal Link

(1)Universal Link最低支持iOS9。

(2)添加域名到 Capabilities。

Associated Domains设置为Enable

设置Capabilities -> Associated Domains ,例如:

applinks:domain.tsingwill.com
003.png

(3)创建apple-app-site-association文件

apple-app-site-association是一个纯文本json文件(注意不包含josn后缀名), 放置于服务器的/.well-known目录(开发者需要自己想办法搞一个https服务器)。例如:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "F7*******.com.tsingwill.mylink",
        "paths":[ "/mylink/*" ]
      }
    ]
  }
}

(4)前端调起方式

前端(H5)可以通过标准的HTTPS的方式进行调起,例如:

https://domian.tsingwill.com/mylink/scan

如果想要传递参数,同样可以通过?的方式进行传递。

(5)APPDelegate中响应回调

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return YES;
    }
    
    NSURL *webUrl = userActivity.webpageURL;
    // do what else about NSURL
    
}

(6)Universal Link的问题梳理

Universal Link是从iOS9开始支持的。但在iOS9.2中,苹果调整了一些规则(估计也是防止恶意推广链接),从iOS 9.2开始,在相同的domain内Universal Links是不work的,必须要跨域才生效,我们实测值需要跨子域名即可,比如 m.domain.com 跳转 o.domain.com 是可以触发跳转App。从iOS 9.2开始,直接把 Universal Link 拷贝到 Safari 的地址栏是无效的,在相同的 domain 内 Universal Links 是无效的,通过 js 调用也是无效的,真的是醉了。

(7)Universal Link的完整流程

002.png

0x03 URL Scheme + Universal Link

现阶段还是要提供对iOS8的支持,开发时可以对URL Scheme和Universal Link都提供支持,前端调用时判断系统的版本,如为iOS9以下则采用URL Scheme的方式调用,若为iOS9+则采用Universal Link的方式调用。

0x04 关于WXAppExtendObject

微信提供了SDK,成为付费开发者后,可以通过WXAppExtendObject中提供的API让自己的应用成为白名单应用。

0x05 使用第三方提供的方案

魔窗,企业级深度链接(Deeplink)解决方案,让App能像Web一样通过URL进行任意内容的分发、管理和一链直达 ,一键唤醒App内指定页。实质上也是对Universal Link等方式的包装,并提供WEB服务器,开发者无需再自己搭服务器。具体使用可参考魔窗

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容