ios app相关跳转


跳转APP的方式目前主要有两种:URL Scheme和Universal Links


一、URL Scheme

  • scheme是iOS9之前比较主流的一种跳转方案了, 更多的是用在了两个APP相互跳转中。也可以在Safari中输入schema://跳转到App内部。
  • scheme跳转app会有提示框提示取消或者打开,如果没有安装app的会提示框提示无法打开网页(这一点不是很友好)。

1、app之间跳转:app1跳转至app2并传值
  • 在app1的target → info → url type 里创建一个url scheme为com.cs.app1(这个是app1的scheme)
  • 在app2的target → info → url type 里创建一个url scheme为com.cs.app2(这个是app2的scheme)
  • 在app1的info.plist里创建白名单Queried URL Schemes里添加app2的scheme
  • 在app2的info.plist里创建白名单Queried URL Schemes里添加app1的scheme
设置好以上步骤之后,在app1里完成如下代码(app2雷同)
//app1跳转app2方法
- (void)pushApp2:(UIButton *)sender
{
    NSURL *url = [NSURL URLWithString:@"com.cs.app2://cs?name=xiaoa&age=10&sex=1&address=22222"];
    
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        //设备安装了app2  //打开url
        if (@available(iOS 10.0, *)) {
            [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
        } else {
            [[UIApplication sharedApplication] openURL:url];
        }
    }else {
        //设备没有安装app2, 打开AppStore去下载
        NSString *appid = @"xxx";
        NSString *str = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/cn/app/id%@", appid];
        NSURL *url = [NSURL URLWithString:str];

        if (@available(iOS 10.0, *)) {
            [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
        } else {
            [[UIApplication sharedApplication] openURL:url];
        }
    }
}
在app2的AppDelegate里完成接收(app1雷同)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    //将url转为字符串
     NSString * urlString = url.absoluteString;
    //判断是通过什么跳转过来的
    if ([urlString containsString:@"com.cs.app2"] ) {
        NSLog(@"返回值转字典___%@",[self queryToDict:url.query]);
    }
    return YES;
}

//query转字典
- (NSDictionary *)queryToDict:(NSString *)query
{
    if (query.length == 0 || [query isEqualToString:@"nil"] || [query isEqualToString:@"null"] || [query isEqual:[NSNull null]]) {
        return nil;
    }else{
        NSMutableDictionary * paramsDict = [NSMutableDictionary dictionary];
        NSArray * temp = [query componentsSeparatedByString:@"&"]; //根据&分割字符串
        for (NSString * str in temp) {
            NSArray * tempStr = [str componentsSeparatedByString:@"="]; //根据=分割字符串
            [paramsDict setObject:tempStr[1] forKey:tempStr[0]];
        }
        return [paramsDict copy];
    }
}

2、Safari跳转app

按照app之间的跳转方法设置好url type后,只需调用url = com.cs.app1://cs?name=xiaoa&age=10&sex=1&address=22222 即可。

* 注意:

当设置的url type有大写字母,例如:com.cs.App1 时,在AppDelegate里接收数据判断url.absoluteString时,当app之间跳转时区分大小写(返回com.cs.App1),Safari跳转app时不区分大小写(返回com.cs.app1)。


二、Universal Links

  • 先看一下官方文档
  • Universal Links(通用链接)是iOS9.0出的技术。如果我们的应用支持通用链接,那么就可以通过https链接来打开APP(手机中已经安装此APP),或者跳转到https链接(手机中没有安装此APP),必须是https。

1、生成 apple-app-site-association 文件
  • 【原理】:在第一次安装APP的时候,手机的iOS系统会去指定的路径(这个路径是后面后端开发人员给的)下载apple-app-site-association文件。通过这个文件,iOS系统就会知道哪些URL是Universal Links,哪些不是Universal Links。从而我们指定的路径可以发生跳转。这个apple-app-site-association文件需要开发者去创建和放到一个苹果可以访问的服务器上。这个过程在xcode调试的时候也会发生。

  • 新建一个名字为apple-app-site-association的纯文本文件(Json格式),不要有任何后缀,文件内容如下:

{
    "applinks": {
        "apps": [], //是限制只能在这几个app中使用, 基本是不填写,所以是空数组
        "details": [ //如果有多个App需要支持Universal,details数组中可配置多个App的信息
            {
                "appID": "ABCD1234.com.apple.cs1", //TeamID.BundleID格式自行替换TeamID和BundleID
                "paths": [ "/AHost/*", "/BHost/*"] //path 过滤需要处理的地址,不需要过滤处理则配置通配符*
            },
            {
                "appID": "EFGH5678.com.apple.cs2",
                "paths": [ "*" ]
            }
        ]
    }
}
  • appID:组成方式是 TeamID.BundleID。登陆开发者中心,在Account → Membership里面可以找到Team ID。
  • paths:设定App支持的路径,只有这些设定的路径的链接,才能被App所处理。通配符*代表支持域名下所有链接。如果是一个服务器对应一个APP跳转,那么这里其实填写一个 “ * ” 就可以了。
    如果一个服务器支持多个APP跳转,则需要用不同的专用路径节点(填写 “ /节点/ * ”)去互相屏蔽。比如地址:https://cs.com/AHost/XXX(paths填写 " /AHost/ * "只能用于A应用的跳转;地址 https://cs.com/BHost/XXX(paths填写 " /BHost/ * ")只能用于B应用的跳转。
* 注意:配置apple-app-association
  • 域名必须支持https
  • 域名根目录下放这个文件apple-app-site-association,不带任何后缀
  • 文件为json格式保存为文本即可
  • json按着官网的要求填写即可
  • 测试是否正确,直接访问域名+配置文件名如果能正确访问则放置的位置是正确的。例如你想通过访问”https://cs.com/xxx“来打开app,那么你要把配置文件放在”https://cs.com/“对应服务器根目录,通过访问”https://cs.com/apple-app-association“能直接访问配置文件则是正确的。

2、apple-app-site-association文件的存放
  • 这个文件创建好之后,交给后端人员。让他们把这个文件放到指定的url的根目录下(URL不一定要指定,可以后端人员给啥我们就用啥也行。这个URL在配置XCode会用到)。这个根目录下除了放这个文件不要放其他东西。我们的URL是 https://cs.com/

  • 【验证】:验证后端是否正确放置的方法,这是浏览器输入这个地址,会直接下载apple-app-site-association文件。如果没有下载到这个软件,说明服务器配置不对。
    可以使用apple的验证网站来验证文件是否能够被访问到。出现Error no apps with domain entitlements 是因为还没有发布,出现404错误,则说明apple-app-site-association文件未上传成功或者使用上面的域名不能访问到。

* 注意:

对于paths有填写专用路径节点的情况(比如我这里写的【"paths": [" /AHost/* "]】), 服务器不用在这个路径下添加真实的文件访问路径!访问applinks这个域名网址的时候,找不到的话不要重定向!!访问applinks网址的时候,找不到的话不要写一个专门的空白页!


3、Identifiers、Profiles相关配置
  • 登录Apple Developer,选择Identifiers,在Capabilities里勾选Associated Domains 然后点Save保存。
  • 选择Profiles重新选择上步设置好的Identifiers,之后下载配置文件双击安装。

4、app相关配置
  • 在target → signing&capabilities → associated domains里添加我们要访问的地址的url。
    配置associated domains的applinks,格式为:“applinks:xxx”。这里的xxx为一个域名,没有“https://”前缀,也没有“/”后缀。
    例如:我们访问的地址是https://cs.com/AHost/XXX,在associated domains里添加:applinks:cs.com 即可。
  • 然后在我们xxx.entitlements文件中查看associated domains里是否正确,不正确就修改。
  • 在AppDelegate里接收处理如下:
//Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *webpageURL = userActivity.webpageURL;
        NSString *host = webpageURL.host;
        // 在这里写需要的逻辑,比如跳转到某个详情页
        if ([host isEqualToString:@"cs.com"]) {
            
        } else{
            if (@available(iOS 10.0, *)) {
                [[UIApplication sharedApplication] openURL:webpageURL options:@{} completionHandler:nil];
            } else {
                [[UIApplication sharedApplication] openURL:webpageURL];
            }
        }
    }
    return YES;
}

5、完成跳转
  • 安装了 App 时,通过 domain + path ,系统软件内部能够直接跳转到 App。
  • 未安装 App 时,通过 domain + path ,跳转到 Safari 打开对应的引导页。
    例如:点击 https://cs.com/AHost/xxx 即可跳转我们设置好的domain的app。
    https://+applinks配置的域名+apple-app-site-association里的paths
* 注意:

首先如果使用 Universal Link ,那么就只用使用 domain/path 的路径来完成跳转。另外,又需要一个引导页,所以这个引导页必须发布到后端服务器对应的 path 中,或者使用前端路由到这个引导页。


6、最后问题
  • 有人说:因为xcode的签名用的自动签名(即勾选了Automatically manage siging),导致iOS 系统 直接没有在APP 安装的时候去请求apple-app-site-association文件。【解决】:取消勾选Automatically manage siging。

  • apple-app-site-association文件改动后重新放到服务器。电脑浏览器下载下来的 apple-app-site-association文件依旧是修改前的数据。浏览器清理缓存后,下载下来的最新的apple-app-site-association文件。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容