iOS 应用之间的跳转(OC&Swift)

本文涉及的产品
.cn 域名,1个 12个月
简介: iOS 应用之间的跳转(OC&Swift)

一、应用间跳转介绍



  • 1.1、什么是应用间跳转,有什么作用? 如下
  • <1>、使用第三方用户登录,需要用户授权,还需要"返回到调用的程序,同时返回授权的用户名"
  • <2>、应用程序推广,设置-推荐应用-有很多应用程序图标如果本机已经安装过,会直接跳转到另外一个应用程序, 软件的广告,我们在抖音或者进入头条都可以看到很多的点击事件进去其他的app或者去下载appstore下载app
  • <3>、平时 支付宝和微信 的支付 等等


  • 1.2、如何实现应用程序间跳转 ?
  • <1>、跳转appstore进入自己的app: 在我们自己的app里面有时候我们会有更新提醒,其实也就是打开我们自己 app 的 url,以 itms-apps://https://开头的应用详情页链接,跳转到AppStore,如下,其中url要进行转码,下面我就不再转码了
    OC 版本:


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 版本:


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.3、URL : 统一资源定位符


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版本


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 分为以下部分


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


二、应用间跳转实现



  • 2.1、我们先以自己创建的app实现来回的跳转:Test1Test2 两个项目
  • 2.2、给Test2项目设置一个 URL Scheme,用来其他的app跳转到 Test2


image.png

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


  • 再说一下不一定根据 URL Scheme进入不同的界面的,也可以在Scheme后拼接参数,比如:test2://1234
  • URL scheme 的作用:我们可以将应用“绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用,同时跳转时也可以传递参数。比如,可以在网页上添加一个链接,点击这个链接后会自动打开对应的APP上。或者从一个 APP 跳转到另一个 APP,用的也是 URL scheme。比如微博或者微信的登录或者分享之类的。在选择登录时就会跳到微信或者微博里,等登录了以后就可以跳转回去。


  • 2.3、在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.4、在Test1项目跳转到Test2项目测试,代码如下

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


image.png



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


NSURL *url = [NSURL URLWithString:@"test2://"];
// 注意: 跳转之前, 可以使用 canOpenURL: 判断是否可以跳转
if (![[UIApplication sharedApplication]canOpenURL:url]) {
     // 不能跳转就不要往下执行了
     return;
}
------后面的代码都是  1.2中的<1>里面的代码
  • Swift 版本:后面的代码都是  1.2中的<1>里面的代码


let url = URL(string: "test2://")
// 注意: 跳转之前, 可以使用 canOpenURL: 判断是否可以
if !UIApplication.shared.canOpenURL(url!) {
    // 不能跳转就不要往下执行了
    return
}
-----后面的代码都是  1.2中的<1>里面的代码


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


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


提示:在做分享的时候我们会检测微信是不是安装了,跳到微信后把微信给的URL Scheme也带了过去,在从微信返回的时候不用再判断 自己的app是否安装了,直接用OpenURL返回即可,添加白名单的目的是为了检测其他的app是否安装,可不可以跳转;在自己的app跳转其他的app的一定要用canOpenURL检测一下,微信不在白名单添加其他app的URL Scheme的原因是它确信你的app存在,不需要用canOpenURL判断


  • 新浪


sinaweibo,
sinaweibohd,
sinaweibosso,
sinaweibohdsso,
weibosdk,
weibosdk2.5
  • 微信


wechat,
weixin
  • 支付宝


alipay,
alipayshare
  • QQ


mqqOpensdkSSoLogin,
mqqopensdkapiV2,
mqqopensdkapiV3,
wtloginmqq2,
mqq,
mqqapi
timapi


提示:微信,新浪,QQ它们设置很多的Scheme的原因是要根据这些不同的Scheme做什么操作,比如根据Scheme跳转到不同的界面等等


三、怎样跳转到不同界面?



  • 3.1、再建立一个项目 Test3 ,给它添加一个 URL Scheme,再给Test3添加两个控制器 ViewController2ViewController3


image.png

提示: 一个项目可以添加多个 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.2、在Test3处理其他Test1(或者其他的app通过openURL)进来的判断
  • OC 版本


// 即将过期,不建议使用(建议把这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<UIApplicationOpenURLOptionsKey,id> *)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 版本


// 最新的
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.3、在Test1里面的跳转代码
  • OC 版本


// 跳转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 版本


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.1、实现两个app之间跳转的步骤
  • <1>、在各自的app里面设置 URL scheme
  • <2>、在各自app的info.plist里面添加字段LSApplicationQueriesSchemes,类型为数组,数组中添加对方的 scheme 字符串(白名单的作用仅仅是iOS9.0方法canOpenURL要求的,因为我们在跳转前需要检查下设备有没有安装将要跳转的应用)
  • <3>、通过openURL 跳转对方的 URL Scheme 即可


  • 4.2、在最后我重复一下很多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
目录
相关文章
|
26天前
|
Web App开发 开发框架 前端开发
移动端window.open跳转链接时,iOS没有反应的问题
【10月更文挑战第9天】在移动端使用 `window.open` 跳转链接时,iOS 可能无响应,原因是 iOS 的安全策略和弹出窗口阻止功能。解决方法包括:确保在用户交互后触发 `window.open`,将目标设置为 `_self`,使用锚点链接模拟跳转,或利用专门的移动端框架。需综合考虑这些方案以优化用户体验。
348 61
|
28天前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
29天前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
52 1
|
3天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
8天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
30 5
|
24天前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
2月前
|
存储 IDE 开发工具
移动应用开发之旅:打造你的首个iOS应用
【9月更文挑战第23天】在数字化浪潮中,移动应用已成为连接用户与数字世界的关键桥梁。本文将带领读者踏上开发属于自己的第一个iOS移动应用的旅程,从理解移动操作系统的核心概念出发,逐步深入到实际的应用构建过程中。通过简洁明了的语言和具体的代码示例,我们将一起探索如何在苹果的iOS平台上实现一个简单的“待办事项列表”应用,让读者不仅能够学习到编程知识,还能体会到将想法转化为现实产品的成就感。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供一个实用的指南,帮助你迈出成为移动应用开发者的第一步。
|
2月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
44 4
|
2月前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
57 5
|
2月前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同双子星座般耀眼夺目,引领着移动应用的潮流。它们各自拥有独特的魅力和深厚的用户基础,为开发者提供了广阔的舞台。然而,正如每枚硬币都有两面,安卓与iOS在开发过程中也展现出了截然不同的特性。本文将深入剖析这两者在开发环境、编程语言、用户体验设计等方面的显著差异,并探讨如何根据目标受众和项目需求做出明智的选择。无论你是初涉移动应用开发的新手,还是寻求拓展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议,帮助你在安卓与iOS的开发之路上更加从容自信地前行。

相关课程

更多