相信你看到下面的代码肯定不陌生:
[[UIApplication sharedApplication]
openURL:[NSURL URLWithString:@"tel://10086"] options:@{} completionHandler:nil];
是的,就是让我们的应用程序调起系统的拨打电话的应用,这就是应用之间的互相调起。那么,我们的应用是怎么识别到拨打电话的应用的呢?答案是Scheme
,即这里的"tel"
。
一、自定义Scheme
添加方式一:
添加方式二:
添加好之后,我们允许程序,自定义的scheme就注册到系统了。我们可以用Safari浏览器测试一下,在地址栏输入scheme://,这里我需要输入JumpMenu://
。
出现这样的提示,就代表我们创建成功了。
二、通过自定义的URL Scheme,向目标应用传值
在目标应用 ReceiverApp 的 AppDelegate 里实现如下方法:
// iOS 9以上的设备,用这个方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// options[UIApplicationOpenURLOptionsSourceApplicationKey] --> 调用方的bundleID
// 由于任何应用都能通过自定义 URL scheme 调用我们的应用,
// 我们无法阻止,但我们能通过获取到调用方的bundleID来决定是否响应
if ([options[UIApplicationOpenURLOptionsSourceApplicationKey] isEqualToString:@"com.lynnzhang.JumpMenu"]) {
NSLog(@"scheme: %@", url.scheme);
NSLog(@"query: %@", url.query);
return YES;
}
return NO;
}
调用方App JumpMenu 的调用示例:
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"ReceiverApp://"]]) {
// 格式为:目标App的Scheme://? + 传值,如下所示
// 必须在value前面加`?`
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"ReceiverApp://?name=SaySee&age=18"] options:@{} completionHandler:nil];
}
三、可能出现的错误
This app is not allowed to query for scheme xxxx
解决方法:iOS 9系统策略更新应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。在 Info.plist 里面建立一个叫 LSApplicationQueriesSchemes
的 Array
,把目标App的Scheme加进去即可。
网友评论