概述

常见的涉及到应用程序之间的跳转场景,比如社交分享、支付宝、微信支付、链接跳转到应用。

在iOS中应用跳转的本质:打开一个应用只需要拿到对应应用的URL即可。

统一资源定位符

URL(统一资源定位符)的组成:协议头(scheme)+资源路径。

协议头:决定查找资源的的方式 比如 http:// 、https:// 、 file://

资源路径:path 路径

注意:一个有效的URL必须协议头,可以没有资源路径。也就是说我们只要知道一个应用的协议头就可以跳转到该应用。

默认一个iOS应用是没有URL的需要我们进行配置。

iOS实现应用程序跳转

第一步需要给被跳转应用配置URL。其它的应用才能通过该URL跳转到该应用。在TARGETS->Info->URL Types配置URL,可以只配置协议头。

如果别的应用跳转到该应用可以通过UIApplication的openURL:方法进行跳转

UIApplication *application = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"wechat://"];
if ([application canOpenURL:url]) {
[application openURL:url];
}else{
NSLog(@"不能打开微信应用");
}

同时我们也可以通过点击链接的方式打开该应用,比如在Safari浏览器输入wechat://也可以跳转。

通过上面的配置加代码实现跳转还是不够的,在跳转时控制台会输出

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

例如:如果是应用A应用想跳转到B应用,需要在A应用的“Info.plist”将B应用的URL Schemes列为白名单。

        <key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
</array>

这样就可以实现应用程序之间的跳转了。

iOS实现应用程序跳转指定页面

我们在App分享场景,可以分享到微信好友与微信朋友圈。这个就需要设计跳转应用指定的页面。这里需要用到UIApplication的代理方法。

目前已经有三代理方法,当应用是被其它应用共通过openURL方法打开回来到回调方法,前两个已经过期。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options

根据URL资源路径携带参数做判断

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
NSString *urlString = url.absoluteString;
NSLog(@"urlStr=%@", urlString); UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;
// 1.首先让导航控制器pop所有栈中的控制器 解决多次跳转出现上次push的页面没有pop 再一次push出现需要多次返回问题
[rootNav popToRootViewControllerAnimated:NO]; UIViewController *rootVC = [rootNav childViewControllers].firstObject; if ([urlString containsString:@"timeline"]) {
[rootVC performSegueWithIdentifier:@"HomeToTimeline" sender:nil];
NSLog(@"跳转到朋友圈");
}else if ([urlString containsString:@"session"]){
[rootVC performSegueWithIdentifier:@"HomeToSession" sender:nil];
NSLog(@"跳转到微信好友");
} return YES;
}

最新文章

  1. php 面试题收集-基础题
  2. 如何处理json数据
  3. 2016&quot;百度之星&quot; - 初赛(Astar Round2B)
  4. 设置mariadb字符集为utf8
  5. L007-oldboy-mysql-dba-lesson07
  6. WisDom.Net 框架设计(七) 验证框架
  7. 新安装ubuntu后几项配置
  8. Sql(in与exists)
  9. 原生js写ajax请求(复习)
  10. .NET平台开源项目速览(19)Power BI神器DAX Studio
  11. ProgressBar的简单使用
  12. gradle执行test任务报错
  13. ios实例开发精品源码文章推荐(8.28)
  14. A pointer is a variable whose value is the address of another variable 指针 null pointer 空指针 内存地址0 空指针检验
  15. Selenium+Python:下载文件(Firefox 和 Chrome)
  16. 100-days: Six
  17. 【转载】WINAPI宏
  18. idea中 读取mybatis的配置文件时候 如果放在文件下面 需要加上路径
  19. [转] Web移动端Fixed布局的解决方案
  20. tomcat源码阅读之Catalina和Bootstrap解析

热门文章

  1. CSS margin属性
  2. ollydbg调试PE文件
  3. Linux操作系统中对于NTFS读取目录功能的实现
  4. vmstat - 报告虚拟内存的统计信息
  5. 关于mysql的权限的问题
  6. js 购物车的数量加减,对应的总价也随机变化
  7. C/C++ warning C4251: class ... 需要有 dll 接口由 class“..” 的客户端使用
  8. storm集群的安装
  9. CommandLineToArgvW调EXE传入参数【转载】
  10. C++ 字符串的分割函数split 及 用法【转载】