程序员

ios app相关跳转

2022-09-21  本文已影响0人  tongyuling

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


一、URL Scheme


1、app之间跳转:app1跳转至app2并传值
设置好以上步骤之后,在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


1、生成 apple-app-site-association 文件
{
    "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": [ "*" ]
            }
        ]
    }
}
* 注意:配置apple-app-association

2、apple-app-site-association文件的存放
* 注意:

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


3、Identifiers、Profiles相关配置

4、app相关配置
//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、完成跳转
* 注意:

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


6、最后问题

上一篇 下一篇

猜你喜欢

热点阅读