应用间跳转

1、应用间跳转介绍git

1.一、什么是应用间跳转,有什么做用? 以下api

<1>、使用第三方用户登陆,须要用户受权,还须要"返回到调用的程序,同时返回受权的用户名"数组

<2>、应用程序推广,设置-推荐应用-有不少应用程序图标若是本机已经安装过,会直接跳转到另一个应用程序, 软件的广告,咱们在抖音或者进入头条均可以看到不少的点击事件进去其余的app或者去下载appstore下载app浏览器

<3>、平时 支付宝,微信支付 等等微信

1.二、如何实现应用程序间跳转 ?app

<1>、跳转appstore进入本身的app: 在咱们本身的app里面有时候咱们会有更新提醒,其实也就是打开咱们本身 app 的 url,以 itms-apps://或https://开头的应用详情页连接,跳转到AppStore,以下,其中url要进行转码,下面我就再也不转码了测试

OC 版本:微信支付

1url

2spa

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

NSURL *url = [NSURL URLWithString:@"itms-apps://itunes.apple.com/app/id1129144823"];

 

// 注意: 跳转以前, 可使用 canOpenURL: 判断是否能够跳转

if (![[UIApplication sharedApplication]canOpenURL:url]) {

        // 不能跳转就不要往下执行了

        return;

}

 

if (@available(iOS 10.0, *)){

 

      [[UIApplication sharedApplication]openURL:url options:@{UIApplicationOpenURLOptionsSourceApplicationKey:@YES} completionHandler:^(BOOL success) {

   

            if (success) {

                 NSLog(@"10之后能够跳转url");

            }else{

                NSLog(@"10之后不能够跳转url");

            }

      }];

 }else{

  

     BOOL success = [[UIApplication sharedApplication]openURL:url];

     if (success) {

         NSLog(@"10之前能够跳转url");

     }else{

         NSLog(@"10之前不能够跳转url");

     }

}

Swift 版本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

let url = URL(string: "itms-apps://itunes.apple.com/app/id1129144823")

 

// 注意: 跳转以前, 可使用 canOpenURL: 判断是否能够跳转

if !UIApplication.shared.canOpenURL(url!) {

     // 不能跳转就不要往下执行了

     return

}

 

if #available(iOS 10.0, *) {

   

      UIApplication.shared.open(url!, options: [:]) { (success) in

           if (success) {

                print("10之后能够跳转url")

           }else{

                print("10之后不能完成跳转")

           }

       }

else {

       // Fallback on earlier versions

       let success = UIApplication.shared.openURL(url!)

       if (success) {

             print("10如下能够跳转")

       }else{

             print("10如下不能完成跳转")

       }

 }

<2>、打电话:tel://电话号码,代码和上面的同样

<3>、发短信:sms://电话号码,代码和上面的同样

<4>、发邮件:mailTo://邮箱号,代码和上面的同样

提示:itms-apps、https、tel、sms、mailTo 都是协议,app之间跳转的协议是:Scheme,若是想要跳转到不一样app,就要打开对应的 URL(协议是:scheme), scheme是一个具体的字符串,并非scheme这几个字母,在下面会详细的介绍

1.三、URL : 统一资源定位符

<1>、咱们以淘宝网的一个连接为例:https://www.taobao.com/markets/bao/xiangbao?spm=a21bo.2017.201867-main.5.5af911d9blzLlJ

Swift版本

1

2

let url = URL(string: "https://www.taobao.com/markets/bao/xiangbao?spm=a21bo.2017.201867-main.5.5af911d9blzLlJ")

print("协议=",url!.scheme ?? "","IP或者是域名=",url!.host ?? "","路径=",url!.path ,"参数=",url!.query ?? "")

打印结果:协议= https IP或者是域名= www.taobao.com 路径= /markets/bao/xiangbao 参数= spm=a21bo.2017.201867-main.5.5af911d9blzLlJ

OC版本

1

2

NSURL *url = [NSURL URLWithString:@"https://www.taobao.com/markets/bao/xiangbao?spm=a21bo.2017.201867-main.5.5af911d9blzLlJ"];

NSLog(@"协议=%@ IP或者是域名=%@ 路径=%@ 参数=%@",url.scheme,url.host,url.path,url.query);

打印结果和上面的同样

<2>、一个 url 分为如下部分

1

2

3

4

协议:https

IP或者是域名:www.taobao.com

路径:/markets/bao/xiangbao

参数:spm=a21bo.2017.201867-main.5.5af911d9blzLlJ

2、应用间跳转实现

2.一、咱们先以本身建立的app实现来回的跳转:Test1 与 Test2 两个项目

2.二、给Test2项目设置一个 URL Scheme,用来其余的app跳转到 Test2

image.png

给Test2项目设置一个 `URL Scheme`,用来其余的app跳转到 `Test2`

提示:设置 URL Scheme时, 不要加 ://,好比上面直接设置:test2 一个字符串就好

  • 再说一下不必定根据 URL Scheme进入不一样的界面的,也能够在Scheme后拼接参数,好比:test2://1234

  • URL scheme 的做用:咱们能够将应用“绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其余应用中启动本应用,同时跳转时也能够传递参数。好比,能够在网页上添加一个连接,点击这个连接后会自动打开对应的APP上。或者从一个 APP 跳转到另外一个 APP,用的也是 URL scheme。好比微博或者微信的登陆或者分享之类的。在选择登陆时就会跳到微信或者微博里,等登陆了之后就能够跳转回去。

2.三、在Test1项目里面设置白名单

<1>、解释一下什么是白名单:其实白名单是在 iOS9.0 之后提出的,它就是一个数组,里面放的是其余app的URL Scheme名字,在iOS9之前是不须要设置的,能够直接用canOpenURL判断是否能够跳转,可是在iOS9.0以后若是不添加白名单, openURL 是没法判断判断是否能够跳转的。

提示:不想添加白名单是能够的,其余的app分享到微信,它确信你的app存在,就不须要在白名单添其余app的URL Scheme,也就是不须要使用 canOpenURL判断是否能够跳转 是否能够跳转

<2>、设置白名单,若是你要跳转其余的app,就要在本身的app的 info.plist 设置白名单,添加其余app的URL Scheme,白名单的字段是:LSApplicationQueriesSchemes,下面咱们在 Test1添加白名单

image.png

白名单的设置

2.四、在Test1项目跳转到Test2项目测试,代码以下

咱们把上面 1.2中的<1>里面的url换为下面,在同一个手机上运行 Test1 和 Test2 两个项目

1728484-64c6a9b23abfc7c2.gif

跳转效果

OC 版本:后面的代码都是  1.2中的<1>里面的代码

1

2

3

4

5

6

7

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

// 注意: 跳转以前, 可使用 canOpenURL: 判断是否能够跳转

if (![[UIApplication sharedApplication]canOpenURL:url]) {

     // 不能跳转就不要往下执行了

     return;

}

------后面的代码都是  1.2中的里面的代码

Swift 版本:后面的代码都是  1.2中的<1>里面的代码

1

2

3

4

5

6

7

let url = URL(string: "test2://")

// 注意: 跳转以前, 可使用 canOpenURL: 判断是否能够

if !UIApplication.shared.canOpenURL(url!) {

    // 不能跳转就不要往下执行了

    return

}

-----后面的代码都是  1.2中的里面的代码

拓展:看到上面效果,咱们就简单的完成了app之间的跳转,这也是一些三方在分享的时候要求咱们app设置白名单,你要分享到哪些平台,你就要添加其余平台的 URL Scheme,这个不是随便填写的,其余平台设置的URL Scheme是什么,就在白名单就要添加什么,可不是本身随意写的

2.五、若是你想在Test2app再返回到Test1app,其实也就是反过来,在 Test2 的白名单里面添加Test1的URL Scheme,在跳转Test1的使用根据Test1的schmem用openURL返回,记得先用 canOpenURL判断一下

 

提示:在作分享的时候咱们会检测微信是否是安装了,跳到微信后把微信给的URL Scheme也带了过去,在从微信返回的时候不用再判断 本身的app是否安装了,直接用OpenURL返回便可,添加白名单的目的是为了检测其余的app是否安装,可不能够跳转;在本身的app跳转其余的app的必定要用canOpenURL检测一下,微信不在白名单添加其余app的URL Scheme的缘由是它确信你的app存在,不须要用canOpenURL判断

2.六、经常使用白名单字段(更多的白名单字段在mob平台iOS开发文档查看)

新浪

1

2

3

4

5

6

sinaweibo,

sinaweibohd,

sinaweibosso,

sinaweibohdsso,

weibosdk,

weibosdk2.5

微信

1

2

wechat,

weixin

支付宝

1

2

alipay,

alipayshare

QQ

1

2

3

4

5

6

7

mqqOpensdkSSoLogin,

mqqopensdkapiV2,

mqqopensdkapiV3,

wtloginmqq2,

mqq,

mqqapi

timapi

提示:微信,新浪,QQ它们设置不少的Scheme的缘由是要根据这些不一样的Scheme作什么操做,好比根据Scheme跳转到不一样的界面等等

3、怎样跳转到不一样界面?

3.一、再创建一个项目 Test3 ,给它添加一个 URL Scheme,再给Test3添加两个控制器 ViewController2与ViewController3

image.png

再创建一个项目Test3,给它添加一个Url Scheme

提示: 一个项目能够添加多个 URL Scheme,举个例子,你在用支付宝支付,支付宝会给你一个 URL Scheme字符串,让你添加到本身URL Types 里面,到时候你在调用支付宝支付,在支付宝界面返回的时候用这个支付宝给你的 URL Scheme 返回;一样,微信也会给你一个URL Scheme字符串,当你跳转到微信里面,微信里面根据微信给你的URL Scheme返回到你的app;

  • 再解释一下:为何微信或者支付宝会给一个惟一的URL Scheme字符串,其目的是为了防止,从他们的应用返回到本身的应用时出错,根据URL Scheme字符串返回到本身的app的,若是手机里面有两个程序都有相同的一个 URL Scheme字符串,那么就出问题了,它就不知道返回哪一个app了,其实若是遇到相同的URL Scheme,谁的app先安装的,就返回到谁的app,这个我测试了

3.二、在Test3处理其余Test1(或者其余的app经过openURL)进来的判断

OC 版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

// 即将过时,不建议使用(建议把这3个方法同时实现)

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

    [self dealopenURL:url];

    return YES;

}

 

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{

    [self dealopenURL:url];

    return YES;

}

 

-(void)dealopenURL:(NSURL *)url{

     

    NSLog(@"协议=%@ IP或者是域名=%@ 路径=%@ 参数=%@",url.scheme,url.host,url.path,url.query);

     

    // 1.获取主控制器

    UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;

    // 拿到栈底的控制器

    ViewController *mainVc = [rootNav.childViewControllers firstObject];

    // 返回主控制器,防止屡次进入错乱

    [rootNav popToRootViewControllerAnimated:NO];

     

    // 利用 URL : 统一资源定位符来判断

    if ([url.path isEqualToString:@"/vc2"]) {

     

         ViewController2 *vc2 = [ViewController2 new];

         vc2.urlString = url.host;

         [mainVc.navigationController pushViewController:vc2 animated:YES];

     else if ([url.path isEqualToString:@"/vc3"]) {

   

         ViewController3 *vc3 = [ViewController3 new];

         vc3.urlString = url.host;

         [mainVc.navigationController pushViewController:vc3 animated:YES];

     }

}

Swift 版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

// 最新的

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

  

      dealopenURL(url: url as NSURL)

      return true

}

 

// 被遗弃的(最好两个都用)

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

  

      dealopenURL(url: url as NSURL)

      return true

}

 

// MARK:跳转的处理

func dealopenURL(url:NSURL){

  

      let nav: UINavigationController! = window?.rootViewController as? UINavigationController

  

      nav.popToRootViewController(animated: false)

  

      let rootVC = nav.children[0]

  

      if url.path == "/vc2" {

      

           let vc2 = ViewController2()

           vc2.urlString = url.host

           rootVC.navigationController?.pushViewController(vc2, animated: true)

      

       }else if url.path == "/vc3"{

      

           let vc3 = ViewController3()

           vc3.urlString = url.host

           rootVC.navigationController?.pushViewController(vc3, animated: true)

       }

  

}

提示:上面跳转是利用 URL的path(统一资源定位符)来判断,我是把 带过来的 URL Scheme 放到了 IP或者是域名 的位置

3.三、在Test1里面的跳转代码

OC 版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

// 跳转Test3的ViewController2

[self jumpUrl:@"test3://test1/vc2"];

// 跳转Test3的ViewController3

[self jumpUrl:@"test3://test1/vc3"];

 

-(void)jumpUrl:(NSString *)urlStr{

 

      NSURL *url = [NSURL URLWithString:urlStr];

       

      // 注意: 跳转以前, 可使用 canOpenURL: 判断是否能够跳转

      if (![[UIApplication sharedApplication]canOpenURL:url]) {

            return;

      }

       

      if (@available(iOS 10.0, *)){

   

            [[UIApplication sharedApplication]openURL:url options:@{UIApplicationOpenURLOptionsSourceApplicationKey:@YES} completionHandler:^(BOOL success) {

       

                if (success) {

                        NSLog(@"10之后能够跳转url");

                }else{

                        NSLog(@"10之后不能够跳转url");

                }

            }];

       }else{

   

            BOOL success = [[UIApplication sharedApplication]openURL:url];

   

             if (success) {

                 NSLog(@"10之前能够跳转url");

             }else{

                NSLog(@"10之前不能够跳转url");

             }

        }

}

Swift 版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

jumpUrl(url: NSURL(string: "test3://test1/vc2")!)

jumpUrl(url: NSURL(string: "test3://test1/vc3")!)

 

func jumpUrl(url:NSURL){

  

     if !UIApplication.shared.canOpenURL(url as URL) {

          return

     }

  

     if #available(iOS 10.0, *) {

      

          UIApplication.shared.open(url as URL, options: [:]) { (success) in

          

              if (success) {

                   print("10之后能够跳转url")

              }else{

                   print("10之后不能完成跳转")

              }

          }

     else {

     // Fallback on earlier versions

          let success = UIApplication.shared.openURL(url as URL)

          if (success) {

               print("10如下能够跳转")

          }else{

               print("10如下不能完成跳转")

          }

     }

}

4、总结

4.一、实现两个app之间跳转的步骤

<1>、在各自的app里面设置 URL scheme

<2>、在各自app的info.plist里面添加字段LSApplicationQueriesSchemes,类型为数组,数组中添加对方的 scheme 字符串(白名单的做用仅仅是iOS9.0方法canOpenURL要求的,由于咱们在跳转前须要检查下设备有没有安装将要跳转的应用)

<3>、经过openURL 跳转对方的 URL Scheme 便可

4.二、在最后我重复一下不少app跳转到微信、支付宝、微博等等后,它们是怎么作到再回到咱们的app的,首先咱们知道这些app里面的白名单确定是没有咱们的 URL Scheme

答:首选咱们在其余平台注册本身的应用的时候,都会给咱们一个 URL Scheme 字符串,这个字符串咱们须要添加到咱们的 URL Scheme里面,想必你们也知道了,咱们须要添加多个URL Scheme,由于微博,微信,支付宝都会给咱们一个惟一的 URL Scheme 字符串,惟一是为了防止咱们跳转到他们的app后再返回的时候出错,还有其余设备的 URL Scheme与咱们的同样就会形成返回错乱的状况;再说支付宝微信在返回咱们的app的时候他们不去白名单里面添加咱们的 URL Scheme,那是由于他们知道咱们的设备确定有咱们的app,否则怎么会进入到微信和支付宝的?又有人说了我先进到微信,在弹出返回本身app和留在微信的界面弹出,我进入后台去把本身的app卸载,再去微信点击返回本身的app,其实我也是这么测试的,可是只要离开微信,返回本身app和留在微信的按钮就会消失,因此微信返回其余的app是不须要在白名单添加其余app的 URL Scheme。

测试的demo

到此结束这篇文章,但愿你可以经过这篇博客完全知道 URL Scheme做用和白名单是什么以及如何跳转在app之间跳转。有不理解的地方写下你的评论,看到后我会第一时间回答。

相关文章
相关标签/搜索