(八十五)应用程序间的跳转与消息传递

应用程序的跳转识别的是URL的协议头,每个应用都可以指定一个URL的协议头,以此作为跳转的依据,而URL的地址部分作为消息体。

【指定应用程序URL协议头的方法】

选择TARGETS->info->URL Types,添加URL Schemes:

【实现跳转的方法】

要实现应用级操作,需要借助UIApplication单例的openURL方法。

加入A要跳转到B,B的URL Schemes为app2,则实现跳转的URL应该为"app2://...",...部分随意,为要传递的消息。

注意在跳转前先用canOpenURL判断是否有这个app,没有应该打开App Store推荐用户下载。

UIApplication *app = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"app2://"]; // 有协议头即可打开app,后面的内容用于指示应该打开app的哪个功能。
if ([app canOpenURL:url]) {
    [app openURL:url];
}else{
    NSLog(@"根据App id打开App Store");
}

【接收跳转的方法】

在AppDelegate中有两个方法可以实现在跳转到自己后接收URL:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    return YES; // 代表是否成功处理
}

// 新方法会使得旧方法失效,建议两个都写
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    return YES;
}

第二个方法比较新,有sourceApplication参数来得到执行跳转的App的Bundle identifier,其中url就是执行跳转时打开的url,建议两个方法都实现。

【利用两个App演示应用跳转与消息传递】

App1:两个按钮,第一个点击后跳转到App2的主页,第二个点击后跳转到App2的另一个页面page1。

App2:有主页和page1和page2两个页面,通过NavigationController跳转。

①App1中实现跳转到App2的page1的代码:

// 应用级操作利用UIApplication单例完成
UIApplication *app = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"app2://page=1"]; // 有协议头即可打开app,后面的内容用于指示应该打开app的哪个功能。
if ([app canOpenURL:url]) {
    [app openURL:url];
}else{
    NSLog(@"根据App id打开App Store");
}

②App2中实现接收与页面跳转的方法:

在App2中,界面的关系是NavigationController->Home(show方式连接的page1和page2,page1和page2的segue分别为page1和page2)。

如果要实现给控制器传值,可以在performSegueWithIdentifier方法传入sender,在跳转前还会调用prepareForSegue::方法拿到sender,利用segue的sourceViewController和destinationViewController来赋值。

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

    NSLog(@"url = %@ id = %@",url.absoluteString,sourceApplication);

    // 为了实现跳转,应该拿到导航控制器,拿到首页的控制器,然后调用performSegueWithIdentifier::
    // 调用performSegueWithIdentifier跳转前会调用prepareForSegue,用来给要跳到的控制器传值。
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;

    ViewController *homeVc = (ViewController *)nav.topViewController;

    NSLog(@"%@",url);

    NSString *urlStr = url.absoluteString;
    if ([urlStr rangeOfString:@"page=1"].location != NSNotFound) {
        NSLog(@"跳转到页面1");
        if (![homeVc isKindOfClass:[ViewController class]]) return YES;
        [homeVc performSegueWithIdentifier:@"page1" sender:nil];
    }else{
        NSLog(@"跳转到页面2");
        if (![homeVc isKindOfClass:[ViewController class]]) return YES;
        [homeVc performSegueWithIdentifier:@"page2" sender:nil];
    }

    return YES;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-07 08:57:18

(八十五)应用程序间的跳转与消息传递的相关文章

第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

第三百八十五节,Django+Xadmin打造上线标准的在线教育平台-登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入django自在的include逻辑 from django.contrib import admin from django.views.generic import TemplateView # 导入django自带的TemplateView逻辑 import xadmin # 导入xadmin fr

“全栈2019”Java第八十五章:实现接口中的嵌套接口

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十五章:实现接口中的嵌套接口 下一章 "全栈2019"Java第八十六章:嵌套接口可以多继承吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组

IOS应用程序间相互跳转 与 传值

阅读本文之前建议参考:<Communicating with Other App程序间通信[翻译]> 在IOS中,实现在app1中打开app2,方法如下: 1,在app2中注册一个URL Schemes 注册的方法很简单,在XXX-info.plist文件中新增一个URL types数组元素,取一个名字,比如"tekuba_net".或者在工程的-TARGETS-Info,中找到URL Types添加一个URL Schemes,名为"tekuba_net"

一个屌丝程序猿的人生(八十五)

到了10点左右的时候,公司里的人已经全部到齐. 这期间,林萧一边安装着软件,一边接收着后来的同事好奇的目光,毕竟公司就这么几个人,突然来了个新人,大家自然一眼就注意到了林萧. 人到齐后没多久,程刚便从办公室走了出来,他先是扫视了一圈,随后来到林萧身边说道:"来吧,带你认识下大家." 林萧起身以后,程刚拍了拍手掌说道:"大家停一下手头的工作,咱们来欢迎一下新来的同事--林萧." 一阵零零散散的掌声响起过后,算是众人对林萧表示了欢迎. 紧接着程刚说道:"林萧,

Linux Linux程序练习十五(进程间的通信共享内存版)

/* * 题目: * 编写程序,要去实现如下功能: 父进程创建子进程1和子进程2.子进程1向子进程2发送可靠信号,并传送额外数据为子进程1的pid*2; 子进程2接受可靠信号的值,并发送给父进程,父进程把接受的值进行打印. 提示:用sigqueue和sigaction实现 * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include &

一起talk C栗子吧(第八十五回:C语言实例--使用信号进行进程间通信二)

各位看官们,大家好,上一回中咱们说的是使用信号进行进程间通信的样例,这一回咱们接着上一回的内容,继续说该样例.闲话休提.言归正转. 让我们一起talk C栗子吧. 我们在上一回中举了使用信号进行进程间通信的样例,在该样例中.我们通过终端发出信号.当进程收到该信号后让它运行系统对信号定义的默认动作.这一回.我们再来举一个使用信号进行进程间通信的样例,只是.我们发送和处理信号的方式和上一回的样例不一样.在接下来的样例中,我们在一个进程中使用kill产生信号.在另外一个进程中接收而且依照自己的方式处理

Swift学习笔记(十五)——程序猿浪漫之用Swift+Unicode说我爱你

程序猿经常被觉得是呆板.宅,不解风情的一帮人.可是有时候.我们也能够使用自己的拿手本领来表现我们的浪漫. 因为Swift语言是支持Unicode编码的,而Unicode最新已经支持emoji(绘文字)的表情符号.所以,我想.我们是不是能够使用Swift+Unicode来浪漫一把呢? 废话不说,直接上代码: let love = "某某某,我\u{1F491}\u{1F492}\u{1F493}\u{1F495}\u{1F496}\u{1F497}\u{1F498}\u{1F499}你!"

第一百八十五节,jQuery,Ajax 表单插件

jQuery,Ajax 表单插件 学习要点: 1.核心方法 2.option 参数 3.工具方法 传统的表单提交,需要多次跳转页面,极大的消耗资源也缺乏良好的用户体验.而这款 form.js 表单的 Ajax 提交插件将解决这个问题. 一.核心方法 官方网站:http://malsup.com/jquery/form/ form.js 插件有两个核心方法:ajaxForm()和 ajaxSubmit(),它们集合了从控制表单元素 到决定如何管理提交进行的功能.

Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). 回顾:Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上) 连接网络摄像头 正如上文所提,我们选用一款简单的D-Link DCS-7010L网络摄像头.关键原因在于它支持RTSP协议,因此服务