iOS之App间的路由设计

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


iOS之App间的路由设计_第1张图片
屏幕快照 2017-08-17 下午4.34.53.png
iOS之App间的路由设计_第2张图片
屏幕快照 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 等等)。
    iOS之App间的路由设计_第3张图片
    屏幕快照 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就可以确定链接内容了

整个流程如下图:

iOS之App间的路由设计_第4张图片
1441174097574453.png

参考文章:
http://www.cocoachina.com/ios/20150902/13321.html
http://blog.csdn.net/ycm1101743158/article/details/61925145

你可能感兴趣的:(iOS之App间的路由设计)