iOS OpenURL方式吊起APP
[toc]
背景描述
假如我们有两个项目,一个是我们的主项目MainProject
,要通过系统提供的API OpenURL:
方式吊起另外的项目OtherProject
。
OtherProject项目配置
配置支持的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
的吊起。
常用URL Scheme
APP | scheme |
---|---|
WIFT | prefs:root=WIFI |
蜂窝数据 | prefs:root=MOBILE_DATA_SETTINGS_ID:// |
电池 | prefs:root=BATTERY_USAGE:// |
VPN | prefs:root=General&path=VPN:// |
mqq:// | |
weibo:// | |
wechat:// | |
支付宝 | alipay:// |
fb:// | |
twitter:// | |
Google Chrome | googlechrome:// |
Medium | medium:// |
Quora | quora:// |
知乎 | zhihu:// |
Uber | uber:// |
简书 | jianshu:// |