• ios app真正的相互!!调用


    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 calledbefore 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(@"回调处理 backbefore 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方法只在需要的时候写,不需要就没必要写了
  • 相关阅读:
    趁热打铁(如何改bug)
    element el-input的autofocus失效问题解决
    为什么要将图片转为base64格式
    学习jdk1.8的Lambda和Stream
    (隐式参数)java8的方法引用之重新认识java的this关键字
    记一次惊奇面试,希望能为广大求职中的javaer提供一点经验。
    单机版ZooKeeper的安装教程
    两个对象值转换的方法(BeanUtils.copyProperties与JSONObject.parseObject对比)
    SpringBoot监控管理之Admin监管使用
    安利一个十分实用的IDEA插件--RestfulToolkit
  • 原文地址:https://www.cnblogs.com/sunjianfei/p/6709066.html
Copyright © 2020-2023  润新知