从一个App跳转到另一APP

时间:2022-11-09 16:38:51

 应用场景:

       百度地图等

       第三方支付

       第三方分享登陆

下面先说几个概念性东西:

 

     1 URL :统一资源定位符(可以没有路径但是必须要有协议头)

     2 scheme: 协议头,用来决定查找资源的方式

     3 path:路径

     

     默认情况下应用程序没有URL,并且在iOS中打开一个应用程序只要能拿到这个应用程序协议头即可

iOS 从一个APP跳转到另一个APP,并带参数跳到指定页面.  https://blog.csdn.net/wangqinglei0307/article/details/78685058

     

开始实现:

  1 新建两个工程 AppTurnOne 和 AppTurnTwo   并在一中创建一个button 添加点击事件

  2 我们做的是从 one 跳到 two  需要在two中设置下scheme 如下图:(设置URL scheme) weichat qq weibo 都是统一的;

当另一个app需要设置跳转到本app需要获取本app的协议头如截图一

     //app AppTurnTwo另一个需要跳转的App需要这个scheme

从一个App跳转到另一APP :

 

3 回到Appone 在点击事件中:

  //跳转到另一个App (不加判断直接跳转)

   //[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"AppTurnTwo://"]];

    

4 先运行 two 再运行one 让这两个程序都安装到模拟机上 点击button就会跳转到另一个页面

5 判断手机中是否安装了需要跳转的APP 如果有跳转 没有就跳转到网页版 或者返回.

/1 获取对应程序的URL

    //NSURL *url= [NSURL URLWithString:@"AppTurnTwo://"];

    NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@"AppTurnTwo://"]];

    

    //2 判断手机中是否安装了对应的应用程序

   

    

    //1 获取对应程序的URL

    //NSURL *url= [NSURL URLWithString:@"AppTurnTwo://"];

    NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@"AppTurnTwo://"]];

    

    //2 判断手机中是否安装了对应的应用程序

    if ([[UIApplicationsharedApplication] canOpenURL:url]) {

      

        //3 打开应用程序

      [[UIApplicationsharedApplication] openURL:url];

        

    }else{

    

        //调转到网页版这儿以百度为例

        [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"http://www.baidu.com"]];

       }

    

这时运行会报以下错误:

This app is not allowed to query for scheme AppTurnTwo

这个程序是不允许AppTurnTwo查询方案

原因:

iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。

受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里配置


从一个App跳转到另一APP

配置: LSApplicationQueriesSchemes 

再运行就可以跳转了:

如果你的输出信息是-canOpenURL: failed for URL: "kindle://home" - error: "This app is not allowed to query for scheme kindle"

去你的 target 里面的 Build Settings 下的 Enable Bitcode,把它设置成 NO,这不一定会阻挡你的控制台继续输出这条信息,但是可以保证你的 App 正常运行

关于其他通过 WebView 访问 http 网址引发的控制台报错信息 什么info.plist 

这个错误是没有打开网络

<code class="xml">NSAppTransportSecurity</code>
<code class="xml"></code><pre class="hljs xml" name="code" style="white-space: pre-wrap; word-wrap: break-word; padding: 0.5em; font-size: 14px; line-height: 26px; background: rgb(255, 255, 255);"><code class="xml">NSAllowsArbitraryLoads</code>
OK!

 
iOS 从一个APP跳转到另一个APP,并带参数跳到指定页面

功能实现:A跳到B并打开B中指定页面

步骤:

1.首先创建两个项目(项目A,项目B),在项目B中的info.plist文件中添加URL Types,如下图所示:从一个App跳转到另一APP其中URL idenifier是项目B的bundle id ,URL Schemes 中添加一个命令前缀,我这里使用“projectB”,这个名字可以自己取,运行一下项目B。

2.在项目A中添加跳转代码

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"projectB://"]];
  • 1

这里的URL的命令前缀必须和之前自己定义的一致,我把这行代码加到了一个button的点击方法里,现在点击button就可以跳到项目B了。 
从一个App跳转到另一APP从一个App跳转到另一APP

3.现在说下app之间跳转的通信,其实跟传值差不多。项目A中第二个button的点击方法添加代码

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"projectB://openBSecondPage"]];
  • 1

4 . 项目B中在appDelegate中添加一个NSURL的属性,实现一个代理方法接收从项目A传过来的URL

-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    self.url = url;
    return YES;
}
  • 1
  • 2
  • 3
  • 4
  • 5

然后在B中第一个界面加上代码

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL * url = ((AppDelegate *)[UIApplication sharedApplication].delegate).url;
   ;
    if(url){
        //显示一下从A获取的url,url = projectB://openBSecondPage,host = openBSecondPage
        self.label.text = [NSString stringWithFormat:@"url = %@,host = %@",[url absoluteString],[url host]];
        //根据传过来的url的host进行一些操作
        if ([[url host]isEqualToString:@"openBSecondPage"]) {
            //跳转到第二个界面
            [self performSegueWithIdentifier:@"second" sender:nil];
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

从一个App跳转到另一APP 
从一个App跳转到另一APP 
简而言之,就是根据从A中传过来的URL打开项目B后进行一些自定义操作