UniversalLink
WWDC2015上苹果公司为iOS9引入的一个新功能,即可通过点击指向网站的链接无缝重定向到已安装的应用。如果用户没有安装对应应用,则点击链接会在Safari中打开对应的网页。
一.配置步骤
(一).创建和上传关联文件
- 创建一个
apple-app-site-association
文件,其中包含app可以处理的网址的JSON数据;
注意:
1.不要附加.json到apple-app-site-association文件名;
2.在iOS 9.3.1及更高版本中,该文件的未压缩大小不超过128KB;
数据格式示例:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2015/*", "/videos/wwdc/201?/*"]
},
{
"appID": "KKKKKKKKKK.com.XX.XXXXX",
"paths": [ "*" ]
}
]
}
}
数据格式要求:
1.apps键必须存在并且所对应的必须是一个空数组;
2.details键对应一个字典数组,数组中字典的顺序决定了系统在查找匹配时所遵循的顺序,每个字典中包含appID键和paths键;
3.appID对应的值由<Team Identifier>.<Bundle Identifier>(登录开发者账号可查看ID);
4.paths对应域名中的path,是一个字符串数组,限制哪些路径可以唤醒应用,哪些路径不能唤醒应用;
5.指定路径的多种方法:
a.如果要指定不作处理的链接,可以在路径字符串的开头添加 “ NOT ”(注意T后面要加空格);
b.使用*指定整个网站;
c.包含特定的URL,比如/wwdc/news/;
d.拼接*到特定的URL,例如/videos/wwdc/2015/*,指定网站中的一部分;
e.可以将两个通配符组合在一个路径中,可以使用?匹配任何单个字符,如/foo/*/bar/201?/mypage
6.注意:配置路径要区分大小写.
- 将
apple-app-site-association
文件上传到HTTPS Web服务器(该步骤需要将写好的apple-app-site-association
文件交给服务端人员,让他们完成上传过程。)。放在服务器的根目录或.well-known
子目录中。https://<domain>/apple-app-site-associationor https://<domain>/.well-known/apple-app-site-association
(二). App IDs设置及项目中的配置
App IDs 设置
进入开发者网站,找到对应的bundleId
,可以点击Edit
按钮,开启Associated Domains
.应用配置
在项目的Capabilities
中开启Associated Domains
,将apple-app-association
所在域名配置进去,前缀必须为applinks:
,后面为服务器域名; 域名可以添加多个,限制30个以内; 要匹配关联域的所有子域,可以在指定域名的开头添加*.前缀;
applinks:xxx.xxx.com
- 处理Universal Links
当点击universal link后启动应用程序时,将会接收到一个activityType
值为NSUserActivityTypeBrowsingWeb
的NSUserActivity
对象,其webpageURL
属性包含正在访问的URL
.
// 在AppDelegate中实现下面的方法,当使用Universal Links唤醒app时会执行此方法
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
if([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *url = userActivity.webpageURL;
//处理URL
}
return YES;
}
二. 配置验证及效果展示
当应用程序安装在iOS设备上时,系统会尝试从entitlement列出的域名中请求下载并验证关联文件。 验证可能会失败和关联将被拒绝的情况: 1.JSON文件无效或不包含应用程序标识符。 2.服务器返回300-499。 如果服务器返回500-599,系统假定该文件暂时不可用并再次尝试。默认情况下,系统每三小时重试一次,最多重试八次。
应用成功与域名关联后,它将保持关联状态,直到应用从设备中删除。在开发过程中,每次更新关联文件时都需要从测试设备中删除应用程序,以保证及时查看最新更改。
三.跨域问题
苹果官方文档:
When a user is browsing your website in Safari and they tap a universal link to a URL in the same domain as the current webpage, iOS respects the user’s most likely intent and opens the link in Safari. If the user taps a universal link to a URL in a different domain, iOS opens the link in your app.
For users who are running versions of iOS earlier than 9.0, tapping a universal link to your website opens the link in Safari.
在iOS9以上,当用户在Safari中浏览网站,点击与当前网页相同域名的URL的通用链接时,iOS会尊重用户最可能的意图,在Safari中打开链接。相反,iOS会在应用中打开该链接。对于运行9.0之前的iOS版本的用户,点击指向您网站的通用链接将在Safari中打开链接.
在safari中打开知乎链接,底部有个App内打开
的按钮,点击之后直接打开了App,就是利用了UniversalLink的跨域问题,实际上点击此按钮之后打开的是oia.zhihu.com
域名下的链接,知乎在oia.zhihu.com
和www.zhihu.com
域名下都配置了apple-app-site-association
关联文件,如果初次下载app没有下载到关联文件的话,点击App内打开
按钮,不会直接唤起app,会显示知乎的下载页面.
四.所有配置都正确但依然无法唤起App的解决方法
1.关闭代理;
2.清空safari缓存;
3.safari不要开启隐私模式;
4.重启手机;
5.重新安装App;
五.相关资料
苹果官方Universal Links配置介绍
2015 WWDC视频---Universal Links介绍及演示
Universal Link 前端部署采坑记
Web Credentials
WWDC17上,苹果发布了iOS11,其中有一项新功能是App密码自动填充,当用户填充用户名和密码时,在键盘的QuickType Bar(快速输入条)会给出候选的用户名与密码,使在应用上登录更容易。
用户在Safari登录网站时,通常会在iCloud钥匙串中保存用户名和密码。随后,用户可能会打开源于同一个开发者的应用程序来访问同一个帐户。使用webcredentials,应用可以访问为网站存储的证书,无需用户重新输入用户名和密码。用户还可以在应用内创建新帐户,更新密码或删除帐户,Safari会保存并使用这些修改。
一.配置步骤
(一).让键盘上方显示右侧带有🔑图标的QuickType bar.
创建QuickType bar
需要在 UITextField
或 UITextView
对象中设置对应的textContentType
属性。在iOS11中, UITextContentType
新增加了UITextContentTypeUsername
和UITextContentTypePassword
类型。
self.phoneNumTextField.textContentType = UITextContentTypeUsername;
self.passwordTextField.textContentType = UITextContentTypePassword;
在keychain中有密码存在时,iOS11的设备上将显示QuickType bar,用户点击🔑按钮后,会进行TouchID或者FaceID或者Password身份验证,随会显示所有保存的账号密码,用户可从中进行搜索和选择,点击相应的账号信息,就会自动填充。
但如果用户保存的密码很多,需要在列表中查找也并不很方便。我们需要在QuickType的候选区列出用户曾经在我们的网站保存过的密码。
(二).添加Associated Domains,将应用和网站链接关联在一起
前缀为webcredentials
, webcredentials
后填写我们网站的Domain,即我们要关联的域名。
webcredentials:xxx.xxx.com
(三).添加并上传关联文件(同UniversalLinks)
apps值对应的数据格式为<Team Identifier>.<Bundle Identifier>
{
"webcredentials": {
"apps": [ "D3KQX62K1A.com.example.DemoApp",
"D3KQX62K1A.com.example.DemoAdminApp" ]
}
}
二.相关资料
Shared Web Credentials
2017 WWDC视频 --- 自动填充密码
设置App’s Associated Domains
自定义密码自动填充规则
iOS Security