首页 关于 微信公众号
欢迎关注我的微信公众号

通过链接启动App

需求

点击一个连接,如果手机上安装了软件A,则启动A,如果没有安装A,则去App Store中去下载A .

实现以上需求的技术有两种: 1. 使用 URL Scheme 2. 使用 ios9 之后得新特性,通用连接(Universal Links)

URL Scheme

首先是为应用添加一个 URL Scheme

如图:

设置完成之后在浏览器中输入:tvuanywhere://xxxx,如果手机上安装了tvuanywhere,则会直接打开。如图:

当app打开后,会自动调用Appdelegate中的如下方法:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
{
    if (!url) {
        return NO;
    }
    
    NSString *urlString = [url absoluteString];
    NSLog(@"openApp:%@",urlString);
    
    return YES;
}

这是iOS9推出的一项功能,如果你的应用支持Universal Links(通用链接),那么就能够方便的通过传统的HTTP链接来启动APP(如果iOS设备上已经安装了你的app,不需要额外做任何判断等), 或者打开网页(iOS设备上没有安装你的app)。

Universal Links(通用链接):一条普通的http链接,例如https://yohunl.com/openApp,当你支持通用链接的时候,系统中安装了你的app,那么用户点击链接,就直接进入到你的app中了,无论你是在微信中还是在其它哪里!!! 当你没有安装的时候,你可以去到你指定的页面(你可以直接展示你原来的H5页面,也可以跳转到下载页等).也就是说,用户无需知道你是否安装了app,如果安装了,这条链接就可以进app(进入你app了,你就可以以本地原生页面去展示信息给用户了),没有安装,就直接进原来的h5页面,对用户来说,是一个无缝的过程,非常顺畅!

universal Links的优点

首先让Associated Domans enable,如图所示:

必须有一个域名,且这个域名的网站需要支持https,然后拥有网站的上传到根目录的权限(这个权限是为了上传一个apple指定的文件)

创建一个json格式的命名为apple-app-site-association文件,注意这个文件必须没有后缀名,文件名必须为apple-app-site-association

{
"applinks": {
"apps": [],
"details": [
{
"appID": "XXXXXXXXXX.com.tvunetworks.TVUAnywherePro",
"paths": [ "/token/*"]
},
{
"appID": "XXXXXXXXXX.com.tvunetworks.TVUAnywherePro",
"paths": [ "*" ]
}
]
}
}

然后就是在xcode中做一些配置,首先是打开工程中的Associated Domains:

在其中的Domains中填入你想支持的域名(这里不是随便填的,是可以支持你需要的Universal Links的域名), 必须以 applinks: 为前缀 .

注意:当你打开Associated Domains后,xcode会在你的工程中添加.entitlements文件

测试

在记事本中输入链接https://domains/token/*,查看是否生效,如图:

用浏览器打开:

工程中添加处理方法

现在用户点击某个链接,直接可以进我们的app了,但是,这不是我们的最终目的,我们的目的是要能够获取到用户进来的链接,根据链接来处理,需要展示给用户的信息。

appdelegate中的下面方法中做处理:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
     if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
     
         NSURL *webpageURL = userActivity.webpageURL;
         NSString *host = webpageURL.absoluteString;
         NSString *dictValue = host;
         dispatch_async(TVUMainQueue, ^{
             [kTVUNotification postNotificationName:kDistributeMsg object:nil userInfo:@{@"Data" : dictValue}];
         });
         
     }
}

参考

Blog

Opinion

Project