美文网首页
iOS之App间的路由设计

iOS之App间的路由设计

作者: 大猿媛 | 来源:发表于2017-08-17 20:40 被阅读77次

    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

    相关文章

      网友评论

          本文标题:iOS之App间的路由设计

          本文链接:https://www.haomeiwen.com/subject/ndsgrxtx.html