文章目录
一、前言
最近项目发布iOS
版本后,发现微信分享的时候,分享下方提示(为验证应用)
遇到微信相关问题,先上微信开放社区搜索,前往微信开放社区。搜到了微信官方说明:《微信开放平台移动应用 SDK 更新提醒》。
文中提到了一个叫Universal Link
的东西,下面就整理下如何弄这个Universal Link
。
在
iOS9
之前,要在浏览器中唤醒APP,我们通常使用scheme
。这种方式需要提前判断系统中是否安装了能够响应此scheme
的app
,并且这种方式在微信被禁用。
二、Universal Link原理
在安装某个app
的时候,iOS
系统会检查App bundle
中的Info.plist
文件。如果发现有Associated Domain
字段,会读取applinks
的地址,比如open.mycompany.com
,然后系统会去该域名根目录下寻找一个名为apple-app-site-association
的文件下,如果有,那么下载到本地,然后解析这个文件。根据path
建立与appid
的映射关系,保存在系统的数据库中。如果有访问https://open.mycompany.com/path/
的链接,系统会根据映射关系找到的appid
,启动该app
,实现Universal Link
。
Universal Link
可以链接到您应用中的内容并安全地共享数据. 当用户点击Universal Link
时,iOS
会将链接直接重定向到您的应用程序,而无需通过Safari
或您的网站进行路由。此外,由于Universal Link
是标准HTTP
或HTTPS
链接,因此一个URL
既适用于您的网站,也适用于您的应用程序。如果未安装您的应用程序,则系统会在Safari中
打开URL
,以使您的网站能够处理它。当用户安装您的应用程序时,iOS
会检查存储在Web
服务器上的文件,以验证您的网站是否允许您的应用程序代表其打开URL
。只有您才能将此文件存储在服务器上,以确保网站和应用程序之间的关联。
注意:设置支持Universal Link
你必须有一个支持https
的域名
为了方便大家理解,我画了张图:
三、Universal Link的应用
举个例子
我们知道,淘宝商品的链接无法在微信内打开,不管是分享还是朋友圈,使得淘宝的商品信息无法在微信内流转,直到出现了Universal Link
,完美的跳转链接方式。
四、Universal Link的缺陷
在用户点击了Universal Link
之后,iOS
会去检测用户最近一次是选择了直接打开app
还是打开网站。这个选择的步骤,实际上是在用户进入了app
之后,顶部bar
的右侧会出现一个通过网站打开的按钮选项。
一旦用户点击了这个选项,他就会通过Safiri
打开你的网站。并且在之后的操作中,默认一直延续这个选择,除非用户从你的webpage
上通过点击Smart App Banner
上的OPEN
按钮来打开。也就是说,用户非常容易在一次选择之后,使得Universal Link
唤醒app
的功能失效了。
五、关于微信使用Universal Link
微信之前是用URL Schemes
方式跳转APP
,在微信7.0.7
版本和微信SDK1.8.6
更新后,为了安全性等原因,改用Universal Link
方式。更新之后就必须用这种方式,要是不填Universal Link
,不管是分享、支付、登录都无法调起微信。
六、如何添加Universal Link
1、Associated Domains(关联域名)
登录苹果开发者后台,在设置证书的页面找到Identifiers -> App ID
(设置包名)里,在对应的BundleId
下勾选 Associated Domains
,如下图
保存设置,然后重新生成配置文件。
在Xcode(11)
里面添加Associated Domains
注意点:在 Associated Domains里面配置的域名必须要以applinks:
开头,后面写上域名,例如
applinks:www.apple.com
记住你这里配置的域名,下面需要上传apple-app-site-association
配置文件到这个域名根目录中(也可以是根目录的.well-known
子目录,苹果会访问两次,第一次是.well-known
子目录,第二次才是根目录)
注:该文件若改动过,建议卸载重新安装ipa
,苹果重新主动请求。
2、配置apple-app-site-association
自己创建一个名叫 apple-app-site-association
的json
格式文件,注意文件命不需要添加.json后缀。
{
"applinks": {
"apps": [],
"details": [
{
"appID": "D3KQX62K1A.com.example.photoapp",
"paths": ["/albums"]
},
{
"appID": "D3KQX62K1A.com.example.videoapp",
"paths": ["/videos"]
},
{
"appID": "D3KQX62K1A.com.example.cameraapp",
"paths": ["*"]
},
{
"appID": "D3KQX62K1A.com.example.iphoneapp",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
}
]
}
}
details
: 以键值对的形式添加为字典数组的JSON
表示,每个应用程序一个字典。对于每个特定于应用程序的词典(上面就表示了同一个teamid下的4个不同的应用)
appID
: 格式为TeamIdentifier.bundle identifier
(开发者账号teamID.app
的bundle identifier
)。
paths
: 应用程序支持的网站,以路径字符串数组形式指定。只有这些指定的路径的链接,才能被app
所处理,*
符号写法代表了可识别域名下所有链接。例如,附加
*
到特定的网址(例如/videos/samples/2015/*
)以videos/samples/2015/
下的所有路径。
使用?
匹配任何单个字符,如/photography/*/samples/201?/mypage
。
使用独立*
网站来指定整个网站。
在路径字符串的开头NOT
添加(包括T后面的空格)来标识不应处理的区域。
注意paths
路径字符串区分大小写。
3、上传apple-app-site-association到服务器(服务器需要支持https)
上传 apple-app-site-association
文件到域名的根目录或者.well-known
子目录下。
能打开https://你的https域名/apple-app-site-association
或 https://你的https域名/.well-known/apple-app-site-association
当我们的App
在设备上第一次运行时,如果支持Associated Domains
功能,那么iOS
会自动去获取域名下的apple-app-site-association
文件。
上传成功后,我们可以用苹果提供的验证网址来直接验证apple-app-site-association
设置是否生效。
注意事项 :
iOS 9.2
之前,不用跨域都可以跳转,iOS 9.2
之后,必须跨域才能进行跳转到原生app
上。
iOS
只会在App
第一次启动时请求一次apple-app-site-association
文件,服务器上该文件的更新不会让iOS
本地的文件同步更新。
4、工程中添加处理方法
现在用户点击我们配置的域名下的匹配的链接,直接可以进我们的app
了。但是,如果想要能够获取到用户进来的链接,根据链接来处理,需要展示给用户的信息,那么需要在工程里的AppDelegate
里实现 方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler
{
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webpageURL = userActivity.webpageURL;
NSString *host = webpageURL.host;
if ([host isEqualToString:@"你的域名"]) {
//利用这个webpageURL属性中的URL,就可以知道用户正在访问的URL地址
//进行我们需要的处理
}
else {
[[UIApplication sharedApplication]openURL:webpageURL];
}
}
return YES;
}
当userActivity
是 NSUserActivityTypeBrowsingWeb
类型, 则意味着它是由Universal Link
进来,也就是处理逻辑的时候。
5、在微信开放平台台配置Universal Links
微信开放平台地址:https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN
在微信开放平台登录你的开发者账号,进入你的应用配置
配置的地方如下图所示,注意这里配置的,是域名+path
注意,新版的微信SDK
,初始化接口,需要传UNIVERSAL_LINK
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//向微信注册
[WXApi registerApp:APP_ID universalLink:UNIVERSAL_LINK];
return YES;
}