您好,欢迎来到伴沃教育。
搜索
您的当前位置:首页iOS:程序间互调和传值

iOS:程序间互调和传值

来源:伴沃教育

相信你看到下面的代码肯定不陌生:

[[UIApplication sharedApplication] 
openURL:[NSURL URLWithString:@"tel://10086"] options:@{} completionHandler:nil];

是的,就是让我们的应用程序调起系统的拨打电话的应用,这就是应用之间的互相调起。那么,我们的应用是怎么识别到拨打电话的应用的呢?答案是Scheme,即这里的"tel"

一、自定义Scheme

添加方式一:

添加方式二:

info.plist

添加好之后,我们允许程序,自定义的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 里面建立一个叫 LSApplicationQueriesSchemesArray,把目标App的Scheme加进去即可。

Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务