1.需求:A应用打开B。B回跳到A
 
2.问题:
看到网络上的文档讲的大多数都是app单向跳转的例子,而我们在跳转到第二个app的时候往往需要返回到原来的app,虽然支付宝微信等第三方等应用会有回调的函数,但是如果打开的应用是自己的app,那么如何实现从第二个应用返回原来的应用呢,作为一个新人真的有点搞不清楚了,但是经过一上午的摸索,也大概弄明白了。
 
3.基础
例子:A1,A2,A3,A4..... 为几个应用,B是需要被打开的应用,我们都知道要想在应用内打开其他B应用就需要让B规定一个协议,A遵循这个协议,这个协议就是下面图片的内容:
 
而A要是想打开B必须遵循这个协议,也就是下图:
注:我们这里先理解为 :LSApplicationQueriesSchemes是一个白名单,就是A中想打开的应用必须在白名单当中
至少我在网上看到的都是这么理解的。
 
完成后我们就可以在A内打开B了,打开不是重点,稍后再细说如何代码打开以及回调接收的事。
 
4.迷雾
 
现在要谈论的是怎么从B回到A,其实从B回到A就是在B中打开A应用,那么我们也同样需要A规定一个协议,其他遵循这个协议的APP(也就是B)可以打开A。
不知道你绕晕了没有,简单来说就是要想打开一个app,这个app要规定一个协议,同时其他app要遵循这个协议并且添加这个白名单才能够打开这个app。
 
那么要想从B跳转到A只需要在A中添加一个协议(这个好解决),同时B遵循这个协议设置白名单就可以了。
 
重点是设置白名单,有那么多的A,怎么在B内设置白名单,而且如果有用户注册了新的A,那么怎么在plist文件下添加白名单。
 
我开始的思路是,获取到info.plist 文件,跳转到其他app时用代码动态写入白名单,但是上网查询发现,系统的info.plist 文件
 
readonly,没办法,这个方法行不通。。。。。。
 
 
 
 
5.拨云见日
 
然后我继续在网上找资料发现,其实网上大多数文章根本没有理解LSApplicationQueriesSchemes 的真正含义,它是白名单,
但是他只有在判断是否手机安装了B应用的时候才有用,也就是说,如果不需要判断你根本没必要设置这个白名单。
 
现在重新梳理一下我们的需要:
A跳转到B,然后回跳到A。
A跳到B:需要判断是否安装了B,安装了就跳转,没有安装执行其他操作(加载网络端或者安装应用)
B回跳A:需要判断是否安装了A吗????需要吗???答案是不需要,不要要判断,那么B中的白名单也就不需要添加了。
 
6.总结:重点是对LSApplicationQueriesSchemes的理解,被网上的一些copy的文章弄晕了,只有需要判断本地是否安装了应用的时候才需要添加白名单
 
7.最后的Demo:
 
———————————————————A打开B—————————————————
 
A应用:
 
1.URL types 规定了一个协议,B打开A的时候需要用到back 
2.LSApplicationQueriesSchemes 添加B中协议为白名单,打开B时判断是否安装了B时需要
 
 
3.在A中需要打开B的位置添加如下代码,其中ssss是参数(随便写的,B中的host就是参数信息)
 
NSURL *url=[NSURL URLWithString:@"pay://ssss"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
        NSDictionary *options=@{};
        [[UIApplication sharedApplication] openURL:url options:options completionHandler:^(BOOL success) {
            NSLog(@"sucA");
        }];
    }
 
B应用:
 
      1. URL types 规定了一个协议,A打开B的时候需要用到,
 
     2.在delegate中添加如下代码,下面的代码会在A打开B的时候调用:
////iOS 4-9.0
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    NSLog(@"回调处理 be called,before 9.0  host:%@",url.host);
    if ([url.host isEqualToString:@"sucpay"]) {
        // 处理结果    
    }
   
    return YES;
}
//iOS 9.0 later
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    NSLog(@"回调处理be called ,after 9.0 host:%@",url.host);
    if ([url.host isEqualToString:@“sucpay"]) {
        // 处理支付结果   
    }
    return YES;
}
 
注:A调B,走的是B中的openURL方法()
 
———————————————————B打开A—————————————————
B打开A不需要判断是否安装了A,因为肯定安装了,所以不用添加白名单。
 
B应用:下面代码回到A(一定不要判断,因为没有白名单)
NSURL *url=[NSURL URLWithString:@"back://bbbb"];
        NSDictionary *options=@{};
        [[UIApplication sharedApplication] openURL:url options:options completionHandler:^(BOOL success) {
            NSLog(@"sucB");
        }];

A应用:

////iOS 4-9.0
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    NSLog(@"回调处理 back,before 9.0  host:%@",url.host);
    if ([url.host isEqualToString:@"sucpay"]) {
        // 处理结果    
    }
   
    return YES;
}
//iOS 9.0 later
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    NSLog(@"回调处理   back ,after 9.0 host:%@",url.host);
    if ([url.host isEqualToString:@“sucpay"]) {
        // 处理支付结果   
    }
    return YES;
}
 
注:B调A,走的是A中的openURL方法()
 

无论是A应用还是B应用中,openURL方法只在需要的时候写,不需要就没必要写了

ios app真正的相互!!调用的更多相关文章

  1. Hybrid App开发模式中, IOS/Android 和 JavaScript相互调用方式

    IOS:Objective-C 和 JavaScript 的相互调用 iOS7以前,iOS SDK 并没有原生提供 js 调用 native 代码的 API.但是 UIWebView 的一个 dele ...

  2. IOS Object和javaScript相互调用

    在IOS开发中有时会用到Object和javaScript相互调用,详细过程例如以下: 1. Object中运行javascript代码,这个比較简单,苹果提供了非常好的方法 - (NSString ...

  3. iOS OC与swift相互调用

    小哥("我"的自称)个人混编的时候喜欢先创建OC项目,然后在项目中创建swift类.这样有个好处就是桥文件可以自动创建的同事路径不需要我手动去写了,另外还有个目的就是现在小哥自我感 ...

  4. iOS原生和H5的相互调用

    为什么现在越来越多的APP中开始出现H5页面? 1,H5页面开发效率更高,更改更加方便: 2,适当缩小APP安装包的大小: 3,蹭热点更加方便,比如五一,十一,双十一搞活动: 那么为什么说H5无法取代 ...

  5. Unity3d 与IOS 相互调用

    Unity3d 与IOS 相互调用 @灰太龙 群63438968 我用的Unity3d 4.2版本,这一节说一下IOS与U3D的交互! 首先在U3D中写个方法:这个时候导出为ios代码必须是真机,模拟 ...

  6. 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法

    OS js oc相互调用(JavaScriptCore)   接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...

  7. 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js

    iOS js oc相互调用(JavaScriptCore)   从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这 ...

  8. IOS App如何调用python后端服务

    本篇文章旨在通过一个小的Demo形式来了解ios app是如何调用python后端服务的,以便我们在今后的工作中可以清晰的明白ios app与后端服务之间是如何实现交互的,今天的示例是拿登录功能做一个 ...

  9. iOS app支付宝接口调用的一点总结(补充支付宝SDK&Demo下载地址)

    由于app内需要用到支付功能,选择了当前最流行的支付宝进行支付.在进行内嵌支付宝功能开发时,被它狠狠的耍了一把. 根据支付宝开发文档,参考demo代码.将相关支付功能加到了自己的代码中.一些根据文档来 ...

随机推荐

  1. 『原创』手把手教你搭建一个实用的油耗App(一)

    前言: 入行快10年,有点积蓄,三年前买了代步车.于是乎,汽车油耗开销就成了每个月都必须关注的问题.三年来,用过了无数油耗记录软件,比如最知名的“小熊油耗”,从第一次用,一直到最新一版,感觉越来越“臃 ...

  2. Visual Studio在Win10中以管理员方式运行

    在Win10中运行VS不是默认以管理员程序运行的,需要手动设置 第一步:将VS快捷方式设置为以管理员身份运行 第二部 在C:\Program Files\Microsoft Visual Studio ...

  3. Python os.path.join() 进行路径拼接

    在python 项目开发过程中,经常需要将获取到的路径进行拼接, # os.path.join(path1,path2) 将两个路径拼接起来 os.path.join("/usr" ...

  4. 程序猿的日常——Java基础之抽象类与接口、枚举、泛型

    再次回顾这些基础内容,发现自己理解的又多了一点.对于一些之前很模糊的概念,渐渐的清晰起来. 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化.接口仅仅是描述 ...

  5. yii2之ActiveForm表单使用

    因目前项目并非前后端分离模式,且用到PHP的yii2框架(所有html代码,js较多内嵌在.php文件内多少采用同步提交[喷墨中...]),遂对于前端面上需要用到的yii2小组件一些整理(因是前端若涉 ...

  6. 用c语言实现三子棋

    1 game.c://实现三子棋的.c文件 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void init_board(cha ...

  7. (转)rootvg镜像

    步骤1:查看当前还未加入到其它vg的可用PV  # lspv  hdisk0          00027c6a0507fe17                    rootvg          ...

  8. 关于offsetTop的误解

    一直以为offset是子元素相对于父元素的距离,后来用了才知道是一个坑,只存在于定位元素中 在做li的搜索的定位的时候,为了得到li相对于ul的距离,本来也可以用li的高度相乘,但是用了offsetT ...

  9. 《垃圾回收的算法与实现》——GC标记-压缩算法

    基本算法 Mark-Compact与Mark-Sweep的第一阶段均为标记活跃对象,第二阶段则不同,压缩算法则是将活跃对象逻辑上移到一起. Lisp2算法 对象头中增加forwarding指针,其用法 ...

  10. windows下安装并使用redis

    一.安装前首先了解一下phpinfo里面的一些信息,能否正确安装非常有帮助. (下图是我的本机环境) compiler :编译器 Architecture :CPU架构 Configuration F ...