美文网首页iOS开发知识小集
iOS:程序间互调和传值

iOS:程序间互调和传值

作者: 春暖花已开 | 来源:发表于2019-03-26 10:21 被阅读62次

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

    [[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加进去即可。

    相关文章

      网友评论

        本文标题:iOS:程序间互调和传值

        本文链接:https://www.haomeiwen.com/subject/ccnwvqtx.html