App间的路由设计
URL Scheme方式
URL Scheme由运行iOS\macOS\watchOS 2等系统的App支持。原生iOS应用程序和运行在任何平台上的Safari的web应用程序,都可以使用 URL Scheme与系统App交互,并且为用户提供一个更加无缝衔接的体验
1、通过URL Scheme 调起App
比如说,在iPhone的Safari浏览器上面输入如下的命令,会自动打开一些App:
// 打开邮箱
mailto://
// 给110拨打电话
tel://110
同样的,自己的app也可以设置一个URL Scheme,这样就可以在其他app内跳转到自己的app
屏幕快照 2017-08-17 下午4.34.53.png 屏幕快照 2017-08-17 下午4.37.28.png
App内实现到另一个app的跳转
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"ThreadTest1001://"] options:@{} completionHandler:^(BOOL success) {
}];
关于如何获取其他App的URL Scheme,比如腾讯QQ 微信 微博等都有分享SDK,他们都有提供跳转的URL Scheme,而对于没有提供这种服务的App,也可以通过下载相应的ipa包,查看info.plist文件获取
2、App如何响应调起
当自己的app被其他程序通过 URL Scheme调起的时候会走这个方法,可以通过url判断要跳转的页面
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSLog(@"sourceApplication: %@", sourceApplication);
NSLog(@"URL scheme:%@", [url scheme]);
NSLog(@"URL query: %@", [url query]);
if ([sourceApplication isEqualToString:@"ThreadTest1001://Home"]){
// 允许打开
return YES;
}else{
return NO;
}
}
Universal Links方式,深层链接
一种能够方便的通过传统 HTTP 链接来启动 APP, 使用相同的网址打开网站和 APP
1、唯一:Universal Links不同于URL Scheme,他不会被其他App获取,他们只能使用标准的http和https链接访问你的网站
2、安全:当安装你的App,iOS检测你是否上传了apple-app-site-association到你的服务器,以确保你的app允许打开的url。由于这个文件只能由你创建和上传,所以是安全的
3、灵活:即使未安装你的app,当你点击访问的链接,Universal Links会在Safari中打开你要访问的内容,正如用户期待的
4、简单:一个url同时可以访问你的app和网页
5、隐私:一个app想和你的app交互,不需要知道是否安装了你的app
实现步骤
准备通用链接
实现通用链接不难, 但首先必须遵守一些先决条件。如下:
- 有一个注册的域名
- 通过 SSL 访问域名
- 支持上传一个 JSON 文件到你的域名
- 至少 iOS 9 beta 2 版本,这很重要, 因为如果是之前的测试版本你需要做额外的操作。
- 至少 Xcode 7 beta 2
1、开启Universal Links功能,首先, 你必须在 Xcode 的 capabilities 里 添加你的 APP 域名, 必须用 applinks: 前置它:还添加一些你可能拥有的子域和扩展(www.domain.com, news.domain.com 等等)。
屏幕快照 2017-08-17 下午6.10.07.png
这将使你的 APP 从你的域名请求一个特殊的 JSON 文件 apple-app-site-association。当你第一次启动 APP,它会从 https://domain.com/apple-app-site-association 下载这个文件。跳到下个步骤来了解如何构建这个文件。
2、上传 apple-app-site-association 文件
该文件必须存在且为了安全原因可使用SSL通过get请求访问到,这个文件格式大致如下:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.domain.App
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.domain.App",
"paths": [ "*" ]
}
]
}
}
根据 paths 键设定一个允许的路径列表(你希望APP 作出反应的路径), 或只是一个星号如果你想打开 APP 而不管路径是什么。appID从何而来, 基本上, 它是加入了你的团队标识(Team ID)的bundle id,团队标识在developer.apple.com的账户详情可找到;
最后, 上传这个文件到你的域名根目录。如果你打开 https://domain.com/apple-app-site-association 可以看到你的文件, 那么你就可以继续下一步了。
3、在 APP 里处理通用链接
//接收到通用链接Universal Links 会调用此方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler{
if (userActivity.activityType == NSUserActivityTypeBrowsingWeb) {
NSURL *pageUrl = userActivity.webpageURL;
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:pageUrl resolvingAgainstBaseURL:YES];
NSString *host = urlComponents.host;
NSArray *pathComponents = urlComponents.path.pathComponents;
if ([host isEqualToString:@"domain.com"]) {
//根据之前定好的pathComponents中的path路径,区分不同页面等
return YES;
}
return NO;
}
return YES;
}
如果提供的 userActivity 是 NSUserActivityTypeBrowsingWeb 类型, 那么意味着它已经由通用链接 API 代理。这样的话, 它保证用户打开的 URL 将有一个非空的 webpageURL 属性。解析当中的host和path就可以确定链接内容了
整个流程如下图:
1441174097574453.png参考文章:
http://www.cocoachina.com/ios/20150902/13321.html
http://blog.csdn.net/ycm1101743158/article/details/61925145
网友评论