iOS-Inter-App Communication

iOS系统并不支持App之间进行直接的通信,如果想要进行App之间的通信,只能通过以下几种方式:AirDrop、URL Scheme、Document以及Socket。

AirDrop

发送文件和数据

发送的数据支持:images, strings, URLs等,对于自定义的Objects,需要适配UIActivityItemSource协议。

发送方式如下:

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

UIActivityViewController会根据数据类型展示不同的Activitys,对于某些不想展示的类型,可以设置excludedActivityTypes属性。

接受文件和数据

(1)首先,需要在Info.plist中设置属性,表示支持的文件类型:

1
Document types

例如,添加public.png声明支持接收PNG文件。

(2)在回调中,接收发送过来的数据:

1
application:openURL:sourceApplication:annotation:

如果App处于前台,需要打开该文件,并展现给用户,如果处于后台,可能需要标记该文件,并延迟处理。

(3)检查目录里的文件,需要时,可以将其移到其他目录:

1
Documents/Inbox

注意:该目录只支持读取和删除,不支持写入。

URL Schemes

通过URLSchemes可以在打开或者跳转App时,进行数据传递。但其中,有些是系统自带的,注意不要跟其命名相同,例如:http, mailto, tel和sms

发送URL

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

注意,双斜杠。

声明自定义的URL Schemes

在Info.plist中声明:

1
CFBundleURLTypes

处理URL Request

(1)如果App未启动,收到一个URL请求时,会被启动,流程如下:

URL Request

注意,如果application:willFinishLaunchingWithOptions:application:didFinishLaunchingWithOptions:方法,返回NO时,将不会调用application:openURL:sourceApplication:annotation:

(2)如果App处于后台或者被挂起时,收到一个URL请求时,会被切回前台,流程如下:
URL Request

启动图

当不同URL被打开时,可以设置不同的启动图,格式如下:

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

其中,basename是Info.plist中设置的UILaunchImageFile,如果没有申明该字段,则直接用“Default”,例如,对于支持Retina的,命名如下:

1
Default-myapp@2x.png

不支持的,命名如下:

1
Default-myapp.png

Socket

iOS的App中间是可以直接通过Socket进行通信的,但是由于只有一个App可以位于前台,所以,另一个App必须具备后台运行的能力。