iOS OpenURL方式吊起APP
$[timeformat('2021-10-09T10:01:20+08:00')]
#openURL

[toc]

背景描述

假如我们有两个项目,一个是我们的主项目MainProject,要通过系统提供的API OpenURL:方式吊起另外的项目OtherProject

OtherProject项目配置

参考:iOS App 唤醒另一个App

配置支持的scheme

可以在info的 URL Type中配置,也可以直接在info.plist文件中修改

  • URL identifier只是一个区分不同scheme的唯一标示符,只要能唯一区分可随意填写,建议写成:com.tencent.wechat反转域名的方法保证该名字的唯一性
  • URL Scheme 就是你用来通信的命令前缀,用来定位一个应用。

配置接收信息的代码

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
  NSLog(@"Calling Application Bundle ID: %@", sourceApplication); 
  NSLog(@"URL scheme:%@", [url scheme]); 
  NSLog(@"URL query: %@", [url query]); 
 
// Customer Code
  return YES; 
} 
  • A: - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
  • B: - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
  • C: - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason

3个回调的功能基本一样,都是在别人通过URL Schemes打开应用的时候会执行的。 这几个回调是有优先级的。C>B>A。也就是说,如果你3个回调都实现了,那么程序只会执行C回调。其他回调是不会执行的。(当然,iOS9以下只会执行B回调)。

由于目前市面上的绝大多数APP都是支持到iOS7.0以上的 所以 推荐 实现B接口,A可以忽略。

MainProject项目配置和操作

唤起目标APP的代码

/// 是否能打开指定scheme的APP
+ (BOOL)_isInstalled_iPadeAppWithOpenURL {
    return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:kAppSchemeForIPad]];
}
/// 呼起APP
+ (void)_callUpHDAppWithOpenURL:(NSString *)openURL {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:openURL]];
}

白名单配置

  • LSApplicationQueriesSchemes iOS9之后提高了app的安全性,需要给出一个类似白名单的东西,在白名单里面的才能打开app。不然报错:

-canOpenURL: failed for URL: "OpenAppTest://mark?id=007" - error: "This app is not allowed to query for scheme OpenAppTest"

  • LSApplicationQueriesSchemes顺序问题,iOS 15前50个scheme白名单有效。所以,可以通过调整顺序的方式将重要的scheme放到前面。

经测试,目前只影响 canOpenURL: 的判断 不配置 LSApplicationQueriesSchemes 或者 放置的顺序 >= 50 ,canOpenURL return NO;不影响 openURL:OtherProject 的吊起。

LSApplicationQueriesSchemes配置
LSApplicationQueriesSchemes配置

iOS 15前50个scheme白名单有效
iOS 15前50个scheme白名单有效

常用URL Scheme

APP scheme
WIFT prefs:root=WIFI
蜂窝数据 prefs:root=MOBILE_DATA_SETTINGS_ID://
电池 prefs:root=BATTERY_USAGE://
VPN prefs:root=General&path=VPN://
QQ mqq://
WeiBo weibo://
Wechat wechat://
支付宝 alipay://
Facebook fb://
Twitter twitter://
Google Chrome googlechrome://
Medium medium://
Quora quora://
知乎 zhihu://
Uber uber://
简书 jianshu://