关于Universal links的一点总结
Universal links的来龙去脉就不说了,这里简单总结几点我认为比较容易让人困惑的事项,希望能给遇到困难的小伙伴们提供一点帮助。
2021-3-16更新:
如果你嫌配置这些东西太麻烦,用ShareSDK吧。它会帮你把这些东西都配置好,然后你复制它给你的链接直接用就好了,省去你研究格式的时间,也不用让后台帮你更新这个文件了。我底下写的这些东西你也就可以不看了...
先贴下苹果官方文档:点这里
一、 关于apple-app-site-association在服务器上的路径
上面这个文档里,苹果建议放在域名下的".well-known"文件夹里,比如:
https://<your-domain>/.well-known/apple-app-site-association
但从百度上的结果来看,".well-known"这个路径弄起来还挺麻烦的。所以还是推荐直接放在域名根目录底下,就是这样:
https://<your-domain>/apple-app-site-association
二、这个apple-app-site-association里面的json怎么写
上面文档推荐的格式是:
// 格式1
{
"applinks": {
"details": [
{
"appIDs": [ "ABCDE12345.com.example.app", "ABCDE12345.com.example.app2" ],
"components": [ // 相当于其他格式中的paths
{
"/": "/buy/*", // 具体的path
"comment": "Matches any URL whose path starts with /buy/" // 注释
},
{
"/": "/help/website/*",
"exclude": true, // 作用同其他格式具体path前面的那个"NOT"
"comment": "Matches any URL whose path starts with /help/website/ and instructs the system not to open it as a universal link"
}
]
}
]
}
}
可是你在网上绝大多数的文章里看到的都是这样的格式:
// 格式2
{
"applinks": {
"apps": [], // 空数组就好了
"details": [
{
"appID": "ABCDE12345.com.example.app",
"paths": [ "/universal_links_callback/*", "/qq_conn/666888666/*", "NOT /website/*" ]
}
]
}
}
你可能还会看到第3种格式:
// 格式3,知乎就是这样的格式
{
"applinks": {
"apps": [],
"details": { // 和格式2相比,details变成了字典,原本显式的"appID"直接变成了key
"ABCDE12345.com.example.app": {
"paths": [
"/universal-links-callback/*",
"/qq_conn/666888666/*",
"NOT /website/*"
]
}
}
}
}
看上去格式1比格式2、3更复杂点,但语义更清晰,可读性更高。"components"相当于其他格式中的"paths";"component"下的"exclude": true,相当于格式2、3中paths里具体path前的"NOT",意思是不把这个路径的链接当通用链接来处理。
按理这三种格式都是ok的。但是如果你用苹果最新推荐的“格式1”的话,当你在QQ互联中验证Universal link时会一直失败,会报一个大概意思是“在你的apple-app-site-association中找不到QQ相关的Universal link信息”的错误。微信是没问题的,因为微信不校验。
三、如果你用了友盟分享,还需要集成微信支付时的注意事项
第一个:pod友盟的精简版微信分享"ReducedWeChat",和最新的微信官方"WechatOpenSDK"
pod 'UMCShare/Social/ReducedWeChat'
pod 'WechatOpenSDK'
第二个:除了原本友盟的注册方法之外,你还需要再调用下微信sdk的注册方法。否则分享可以调起微信,但支付的时候调不起来。
// 原本友盟的注册方法
UMSocialGlobal.shareInstance()?.universalLinkDic =
[UMSocialPlatformType.wechatSession : universalLink_wx,
UMSocialPlatformType.QQ : universalLink_qq]
UMSocialManager.default().setPlaform(.wechatSession,
appKey: WXAppId,
appSecret: WXAppSecret,
redirectURL: nil)
// 微信sdk的注册方法
WXApi.registerApp(WXAppId, universalLink: universalLink_wx)