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®istered=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]);returnYES;}else{returnNO;}}
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]){returnYES;}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服务器,开发者无需再自己搭服务器。具体使用可参考魔窗
从网页进入AppStore
一、获取要跳转的应用在AppStore中的AppID
01.打开AppStore,找到你要跳转的应用,进入应用介绍页面
02.点击“获取”按钮边上的“更多”,选择“分享App...”
03.点击“拷贝链接”
04.将此链接粘贴至任意处,即可看到idxxxxxx这样的字符串,这个就是该应用的AppID
二、创建跳转的URL
URL格式:itms-apps://itunes.apple.com/app/id
将“”替换为要跳转的AppID,例如跳转至微信:
itms-apps://itunes.apple.com/app/id414478124
作者:郭秀才、安静的程序员
链接:https://www.jianshu.com/p/bc2f7b2f4377、https://www.jianshu.com/p/d5b8bc3b2917
来源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。