APP编程指南 (六) —— 应用程序间通信(一)

版本记录

版本号 时间
V1.0 2018.06.01

前言

我们在做一个APP时候需要注意哪些方面呢,接下来我们就看一下APP编程指南。里面有些可能大家在平时编程中都经历过,但是再系统的了解下也不是坏事。感兴趣的可以看上面写的几篇。
1. APP编程指南 (一) —— 基本概览(一)
2. APP编程指南 (二) —— 应用程序必须实现的行为(一)
3. APP编程指南 (三) —— 应用程序的后台执行(一)
4. APP编程指南 (四) —— 处理应用程序状态转换的策略(一)
5. APP编程指南 (五) —— 实现特定应用程序功能的策略(一)

Inter-App Communication - 应用程序间通信

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

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


Supporting AirDrop - 支持AirDrop

AirDrop可让您与附近的设备共享照片,文档,URL和其他类型的数据。 AirDrop利用对等网络来查找附近的设备并连接到它们。

1. Sending Files and Data to Another App - 发送文件和数据到另一个应用程序

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

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

Listing 6-1  Displaying an activity sheet on iPhone
- (void)displayActivityControllerWithDataObject:(id)obj {
   UIActivityViewController* vc = [[UIActivityViewController alloc]
                                initWithActivityItems:@[obj] applicationActivities:nil];
    [self presentViewController:vc animated:YES completion:nil];
}

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

2. Receiving Files and Data Sent to Your App - 接收发送到您应用程序的文件和数据

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

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

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

您的应用有权读取和删除它收到的文件,但它没有写入该文件的权限。如果您打算修改该文件,则必须先将其移出当前位置。建议您以后删除文件的原始版本。

有关支持应用程序中文档类型的更多信息,请参阅Document-Based App Programming Guide for iOS


Using URL Schemes to Communicate with Apps - 使用URL Scheme进行App间通信

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

注意:Apple为http,mailto,telsms URL方案提供了内置支持。 它还支持针对MapsYouTubeiPod应用的基于http的URL。 这些scheme的处理程序是固定的,不能更改。 如果您的URL类型包含与Apple定义的方案相同的scheme,则会启动Apple提供的应用程序,而不是您的应用程序。 有关Apple支持的scheme的信息,请参阅Apple URL Scheme Reference

1. Sending a URL to Another App - 发送一个URL到另一个应用程序

如果要将数据发送到实现自定义URL scheme的应用程序,请创建格式正确的URL并调用应用程序对象的openURL:方法。 openURL:方法使用注册的scheme启动应用程序并将您的URL传递给它。 那时,控制权传递给新的应用程序。

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

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

如果您的应用定义了自定义URL scheme,则应按照Implementing Custom URL Schemes中的描述为该scheme实施处理程序。 有关系统支持的URL scheme的更多信息,包括有关如何格式化URLs的信息,请参阅Apple URL Scheme Reference

2. Implementing Custom URL Schemes - 实现自定义URL Scheme

如果您的应用可以接收特殊格式的URL,则应该向系统注册相应的URL scheme。 应用程序通常使用自定义URL scheme向其他应用程序请求服务。 例如,Maps应用支持URLs用于显示特定地图位置。

(1)Registering Custom URL Schemes - 注册自定义URL Scheme

要为您的应用注册一个URL类型,请在应用的Info.plist文件中包含CFBundleURLTypes键。 CFBundleURLTypes键包含一个字典数组,每个字典都定义了应用程序支持的URL scheme。 表6-1介绍了每个字典中包含的键和值。

Table 6-1 Keys and values of the CFBundleURLTypes property

key value
CFBundleURLName 包含URL scheme的抽象名称的字符串。 为确保唯一性,建议您指定反向DNS标识符样式,例如com.acme.myscheme。您指定的字符串也用作应用程序的InfoPlist.strings文件中的键。 key的值是人类可读的scheme名称。
CFBundleURLSchemes 包含URL scheme名称的字符串数组,例如httpmailtotelsms

注意:如果有多个第三方应用程序注册处理相同的URL scheme,那么目前还没有确定将该scheme授予哪个应用程序的过程。

(2)Handling URL Requests - 处理URL请求

具有自己的自定义URL scheme的应用程序必须能够处理传递给它的URL。所有URLs都会在启动时或您的应用运行时或在后台传递给您的应用代理。要处理传入的URL,您的委托应该实现以下方法:

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

Figure 6-1 Launching an app to open a URL

如果您的应用程序正在运行,但处于后台或挂起,在URL请求到达时,则会将其移至前台以打开该URL。 此后不久,系统调用委托的application:openURL:sourceApplication:annotation:,检查URL并将其打开。 图6-2显示了将应用程序移至前台并打开URL的修改过的过程。

Figure 6-2 Waking a background app to open a URL

注意:支持自定义URL scheme的应用程序可以指定在启动应用程序以处理URL时显示的不同启动图像。有关如何指定这些启动图像的详细信息,请参阅Displaying a Custom Launch Image When a URL is Opened

所有URLs都通过NSURL对象传递给您的应用。由您决定URL的格式,但NSURL类符合RFC 1808规范,因此支持大多数URL格式约定。具体而言,该类包括返回RFC 1808定义的URL各个部分的方法,包括user, password, query, fragment, and parameter字符串。您的自定义scheme的“protocol”可以使用这些URL部件来传递各种信息。

application:openURL:sourceApplication:annotation:实现如Listing 6-2所示,传入的URL对象在其查询和片段部分中传递特定于应用程序的信息。代理提取此信息(在本例中为待完成任务的名称和任务到期日期),并用它创建应用程序的模型对象。此示例假定用户正在使用公历。如果您的应用支持非公历日历,则需要相应地设计您的URL scheme,并准备在代码中处理其他日历类型。

Listing 6-2  Handling a URL request based on a custom scheme
- (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;
}

请务必验证您从传递到您的应用的URLs获得的输入; 请参阅Secure Coding Guide中的Validating Input and Interprocess Communication以了解如何避免与URL处理相关的问题。 要了解Apple定义的URL方案,请参阅Apple URL Scheme Reference

3. Displaying a Custom Launch Image When a URL is Opened - 显示URL打开时的自定义启动图像

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

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

在此命名约定中,basename表示应用程序的Info.plist文件中由UILaunchImageFile键指定的基本图像名称。如果您不指定自定义basename,那么使用字符串Default。名称的<url_scheme>部分是您的URL scheme名称。要为myapp URL scheme指定通用启动图像,您应该在应用程序的bundle包中包含名为Default-myapp@2x.png的映像文件。 (@ 2x修饰符表示该图像适用于Retina显示器,如果您的应用程序还支持标准分辨率显示器,则还会提供Default-myapp.png图像。)

有关可以包含在启动映像名称中的other modifiers的信息,请参阅Information Property List Key Reference中对UILaunchImageFile名称键的描述。

后记

本篇主要讲述了App间通信,感兴趣的给个赞或者关注~~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容