美文网首页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:程序间互调和传值

    相信你看到下面的代码肯定不陌生: 是的,就是让我们的应用程序调起系统的拨打电话的应用,这就是应用之间的互相调起。那...

  • iOS页面间传值详解(二)

    在iOS页面间传值详解(一)中,介绍了iOS界面间的正向传值以及逆向传值的两种方法,其实逆向传值还可以使用bloc...

  • IOS 界面之间传值总结

    iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单...

  • 微信小程序页面间的传值方式

    最新在学习微信小程序时联想到之前angular,vue在页面间的传值方式。想到小程序的几种页面间传值方式,于是总结...

  • 微信小程序中的传值方式,添加”主动技能”

    移动开发的页间传值方式 在移动开发过程中,这里以iOS原生开发为例,在整个开发中页面间有多种传值方式 属性传值 B...

  • iOS:添加书签到主屏幕

    图一的是我们操作完之后的 效果图。 写在最前:在阅读这篇文章的时候,你可能需要温习一下程序间的互调和传值,可以参考...

  • iOS ViewController间传值

    delegate方式和block方式 解决方案一:delegate方式 从当前页面传值给上一个页面,使用deleg...

  • iOS-对象间的传值

    iOS - 对象间传值 传值方式 个人把他们分为官方和非官方,可以看出官方版的传值方式均为两个对象之间通过系统特定...

  • iOS的五种传值

    前言 iOS常见的五种传值分别为属性传值,通知传值,代理传值,block传值,单例传值 属性传值 用于正向传值,简...

  • ios常用的三种传值方式

    iOS中有多种方案可以实现页面之间的传值,例如:属性传值、代理传值、block传值、单例传值...。常用的三种传值...

网友评论

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

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