美文网首页
app间的通信

app间的通信

作者: 微笑中的你 | 来源:发表于2018-06-26 15:15 被阅读0次

应用程序只能与设备上的其他应用程序进行间接通信。您可以使用AirDrop与其他应用程序共享文件和数据。您还可以定义一个自定义URL方案,以便应用程序可以使用URL向您的应用程序发送信息。

注意:您还可以使用 UIDocumentInteractionController 对象或 document picker 在应用程序之间发送文件。有关为文档交互控制器添加支持的信息,请参见 Document Interaction Programming Topics for iOS
。有关使用 document picker 打开文件的信息,请参阅 Document Picker Programming Guide

支持 AirDrop

AirDrop允许您与附近的设备共享照片、文档、url和其他类型的数据。AirDrop利用点对点网络找到附近的设备并连接它们。

向另一个应用程序发送文件和数据

要使用AirDrop发送文件和数据,请使用UIActivityViewController对象来显示用户界面的活动表。在创建这个视图控制器时,指定要共享的数据对象。视图控制器只显示那些支持指定数据的活动。对于AirDrop,您可以指定图像、字符串、url和其他几种类型的数据。您还可以传递采用UIActivityItemSource协议的自定义对象。

要显示活动视图控制器,可以使用类似于清单6-1的代码。活动视图控制器自动使用指定对象的类型来确定在活动表中显示什么活动。您不必明确指定AirDrop。但是,您可以使用视图控制器的excludedActivityTypes 属性来阻止表显示特定的类型。在iPad上显示活动视图控制器时,必须使用弹窗。

清单6-1

- (void)displayActivityControllerWithDataObject:(id)obj {
   UIActivityViewController* vc = [[UIActivityViewController alloc]
                                initWithActivityItems:@[obj] applicationActivities:nil];
    [self presentViewController:vc animated:YES completion:nil];
}

有关使用活动视图控制器的更多信息,请参见UIActivityViewController类引用。有关活动的完整列表及其支持的数据类型,请参见UIActivity类引用。

接收发送到应用程序的文件和数据

要接收通过AirDrop发送到应用程序的文件,请执行以下操作:

  • 在Xcode中,声明对应用程序能够打开的文档类型的支持。

  • 在 app delegate中 实现 [application:openURL:sourceApplication:annotation:] 方法. 使用该方法接收另一个应用程序发送的数据。

Xcode项目的Info选项卡包含一个文档类型部分,用于指定应用程序支持的文档类型。至少,您必须为文档类型指定一个名称,以及表示数据类型的一个或多个UTIs。例如,要声明对PNG文件的支持,需要包含public.png作为UTI字符串。iOS使用指定的UTIs来确定应用程序是否有资格打开给定的文档。

将符合条件的文档传输到应用程序的容器后,iOS将启动应用程序(如果需要),并调用application:openURL:sourceApplication:annotation:其应用程序委托的方法。如果您的应用程序在前台,您应该使用此方法打开文件并将其显示给用户。如果你的应用在后台,你可能只需要注意文件在那里,这样你就可以稍后打开它。由于通过AirDrop传输的文件是使用数据保护进行加密的,除非设备当前处于解锁状态,否则不能打开文件。

你的应用程序有读取和删除它接收到的文件的权限,但是它没有写入文件的权限。如果计划修改该文件,则必须将其从当前位置移出。建议以后删除文件的原始版本。

有关在应用程序中支持文档类型的更多信息,请参阅基于文档的iOS应用程序编程指南

使用 URL Scheme 与应用程序通信。

URL 允许您通过定义的协议与其他应用程序通信。要与实现这种Scheme的应用程序进行通信,您必须创建一个适当格式的URL并要求系统打开它。要实现对自定义Scheme的支持,您必须声明对该Scheme的支持,并处理使用该Scheme的传入url。

注意:Apple提供了对http、mailto、tel和sms URL模式的内置支持。它还支持针对地图、YouTube和iPod应用程序的基于http的url。这些Schemes的处理程序是固定的,不能更改。如果你的URL类型包含一个与苹果定义的方案相同的Scheme,那么苹果提供的应用程序将取代你的应用程序。

有关苹果支持的方案的信息,请参阅 Apple URL Scheme参考

向另一个应用程序发送URL

当您想向实现自定义URL scheme的应用程序发送数据时,创建一个适当格式的URL并调用应用对象的openURL:方法。方法使用已注册的方案启动应用程序并将URL传递给它。此时,控制将传递到新的应用程序。

下面的代码片段说明了一个应用程序如何请求另一个应用程序的服务(本例中的“todolist”是一个假设的应用程序注册的自定义scheme):

NSURL *myURL = [NSURL URLWithString:@"todolist://www.acme.com?Quarterly%20Report#200806231300"];
[[UIApplication sharedApplication] openURL:myURL];

如果您的应用程序定义了一个自定义URL scheme,那么它应该为该模式实现一个处理程序,如 实现自定义URL方案 中所述。有关系统支持的URL scheme的更多信息,包括如何格式化URL的信息,请参阅 Apple URL Scheme Reference

实现自定义URL scheme

如果您的应用程序可以接收特殊格式的URL,您应该向系统注册相应的URL scheme。应用程序通常使用定制的URL模式来为其他应用程序提供服务。例如,地图应用程序支持url来显示特定的地图位置。

注册自定义URL scheme

为你的应用注册一个URL scheme,在你的应用程序的 info.plist文件中包含 CFBundleURLTypes 键。CFBundleURLTypes键包含一个字典数组,每个字典都定义了应用程序支持的URL scheme。表6-1描述了要包含在每个字典中的键和值。

表6-1

key value
CFBundleURLName 包含URL方案的抽象名称的字符串。为了确保惟一性,建议您指定一个反向DNS样式的标识符,例如com.ac .myscheme。
你指定的字符串也被用作应用程序信息列表中的键。字符串文件。密钥的值是人类可读的方案名。
CFBundleURLSchemes 包含URL Scheme名称(例如http、mailto、tel和sms)的字符串数组。

注意:如果有超过一个第三方应用程序注册来处理相同的URL方案,目前还没有确定哪个应用程序会被提供的过程。

处理URL请求

拥有自定义URL Scheme的应用程序必须能够处理传递给它的URL。所有的url都传递给你的应用委托,要么在启动时,要么在你的应用运行时,要么在后台。要处理传入的url,您的委托应该实现以下方法:

  • 使用 [application:willFinishLaunchingWithOptions:] 和
    [application:didFinishLaunchingWithOptions:] 方法检索URL的信息并决定是否要打开它。如果两个方法都返回“NO”,则不会调用应用程序的URL处理代码。

  • 使用 [application:openURL:sourceApplication:annotation:] 方法打开文件。

如果您的应用程序在URL请求到达时没有运行,它将被启动并移动到前台,以便它可以打开URL。实现application:willFinishLaunchingWithOptions:或application:didFinishLaunchingWithOptions:方法应该从它的options字典中检索URL,并确定应用程序是否可以打开它。如果可以,并让application:openURL:sourceApplication:annotation:(或application:handleOpenURL:)方法返回YES处理URL的实际打开。(如果实现了这两种方法,都必须在URL打开之前返回YES。)图6-1显示了请求打开URL的应用程序的修改后的启动序列。

图6-1

如果你的应用程序正在运行,但是在后台运行,或者当一个URL请求到达时被挂起,那么它将被移动到前台来打开URL。不久之后,系统调用委托的application:openURL:sourceApplication:annotation:检查URL并打开它。图6-2显示了将应用程序移动到前台以打开URL的修改过程。

图6-2

注意: 支持自定义URL schemes 的应用程序可以指定在启动应用程序以处理URL时要显示的不同启动图像。

所有url都被传递给NSURL对象中的应用程序。由您来定义URL的格式,但是NSURL类符合RFC 1808规范,因此支持大多数URL格式约定。具体地说,该类包含返回RFC 1808定义的URL的各个部分的方法,包括用户、密码、查询、片段和参数字符串。定制方案的“协议”可以使用这些URL部分来传递各种信息。

实现application:openURL:sourceApplication:annotation:如清单6-2所示,传入的URL对象在其查询和片段部分中传递特定于应用程序的信息。委托提取这些信息——在本例中是待办事项的名称和任务完成的日期——并使用它创建应用程序的模型对象。如果你的应用程序支持非公历日历,你需要相应地设计你的URL方案,并准备处理你代码中的其他日历类型。

清单6-2

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([[url scheme] isEqualToString:@"todolist"]) {
        ToDoItem *item = [[ToDoItem alloc] init];
        NSString *taskName = [url query];
        if (!taskName || ![self isValidTaskString:taskName]) { // must have a task name
            return NO;
        }
        taskName = [taskName stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 
        item.toDoTask = taskName;
        NSString *dateString = [url fragment];
        if (!dateString || [dateString isEqualToString:@"today"]) {
            item.dateDue = [NSDate date];
        } else {
            if (![self isValidDateString:dateString]) {
                return NO;
            }
            // format: yyyymmddhhmm (24-hour clock)
            NSString *curStr = [dateString substringWithRange:NSMakeRange(0, 4)];
            NSInteger yeardigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(4, 2)];
            NSInteger monthdigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(6, 2)];
            NSInteger daydigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(8, 2)];
            NSInteger hourdigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(10, 2)];
            NSInteger minutedigit = [curStr integerValue];
 
            NSDateComponents *dateComps = [[NSDateComponents alloc] init];
            [dateComps setYear:yeardigit];
            [dateComps setMonth:monthdigit];
            [dateComps setDay:daydigit];
            [dateComps setHour:hourdigit];
            [dateComps setMinute:minutedigit];
            NSCalendar *calendar = [s[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
            NSDate *itemDate = [calendar dateFromComponents:dateComps];
            if (!itemDate) {
                return NO;
            }
            item.dateDue = itemDate;
        }
 
        [(NSMutableArray *)self.list addObject:item];
        return YES;
    }
    return NO;
}

打开URL时显示自定义启动映像

支持自定义URL模式的应用程序可以为每个模式提供自定义启动映像。当系统启动您的应用程序以处理URL而没有相关快照时,它将显示您指定的启动映像。要指定一个启动映像,请提供一个PNG图像,其名称使用以下命名约定:

<basename>-<url_scheme><other_modifiers>.png

在这个命名约定中,basename表示应用程序info.plist文件中UILaunchImageFile键指定的基本图像名称。如果不指定自定义基名,请使用字符串默认值。名称的部分是您的URL scheme名称。要为myapp URL scheme指定一个通用的启动映像,您需要包含一个名为Default-myapp@2x.png在应用包里。(@2x修饰符表示该图像是用于视网膜显示的。如果你的应用也支持标准的分辨率显示,你也要提供一个默认的myapp.png。)

免责声明:以上内容均来自官方文档 iOS App 编程指南,在 有道翻译 的基础上进行修改整理,仅用于个人学习。因个人水平有限,如果存在错误,请读者谅解并指出,非常感谢!

相关文章

  • app间的通信

    应用程序只能与设备上的其他应用程序进行间接通信。您可以使用AirDrop与其他应用程序共享文件和数据。您还可以定义...

  • iOS 进程间通信(APP间通信)

    进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内,iOS ...

  • Handler和Binder

    FrameWork层的Handler和Binder; 通信分为: App间的通信——BinderApp内部通信——...

  • 进程间通信-App Groups

    最简单的进程间的数据共享App Groups此事例对应屏幕共享数据传输、使用时请酌情处理 App Groups创建...

  • iOS - App间的通信方式

    iOS系统是相对封闭的系统,App各自在各自的沙盒(sandbox)中运行。每个App都只能读取iPhone上iO...

  • Binder在Android中的IPC使用

    介绍 通常在Android中,我们的每个App都是一个进程,App之间的通信是进程间通信(IPC),在Androi...

  • NSConnection进程间通信ios版

    之前逆向Mac上app时,发现有些app会用一个守护进程来和后开启的app来通信,虽然知道是进程间的通信,但是还是...

  • Activity-通讯

    1.Client >AMS APP 向 ActivityManagerService(简称AMS)发起进程间通信,...

  • iOS App间常用的通信方式

    背景:目前公司维护2个App,一个电商类项目,一个金融类项目;类似淘宝和支付宝,很多时候需要在App之间进行通信,...

  • iOS app 间的跳转及通信

    需要明白的名词 URL: 全球统一资源定位符 协议头: http:// https:// file:// ftp:...

网友评论

      本文标题:app间的通信

      本文链接:https://www.haomeiwen.com/subject/qvbpyftx.html