版本记录
版本号 | 时间 |
---|---|
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中,声明支持您的应用程序能够打开的文档类型。
- 在您的应用程序委托中,实现application:openURL:sourceApplication:annotation:方法。使用该方法接收其他应用程序发送的数据。
Xcode项目的Info
选项卡包含一个Document Type
s部分,用于指定您的应用程序支持的文档类型。至少,您必须为您的文档类型和代表数据类型的一个或多个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,tel
和sms
URL方案提供了内置支持。 它还支持针对Maps
,YouTube
和iPod
应用的基于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名称的字符串数组,例如http ,mailto ,tel 和sms 。 |
注意:如果有多个第三方应用程序注册处理相同的URL scheme,那么目前还没有确定将该scheme授予哪个应用程序的过程。
(2)Handling URL Requests - 处理URL请求
具有自己的自定义URL scheme的应用程序必须能够处理传递给它的URL。所有URLs都会在启动时或您的应用运行时或在后台传递给您的应用代理。要处理传入的URL,您的委托应该实现以下方法:
使用application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法来检索有关URL的信息并决定是否要打开它。如果任一方法返回NO,则不会调用您的应用程序的URL处理代码。
如果您的应用在URL请求到达时未运行,则会启动该应用并将其移至前台,以便它可以打开该URL。实现application:willFinishLaunchingWithOptions:
或application:didFinishLaunchingWithOptions:
方法应该从其option字典中检索URL,并确定应用程序是否可以打开它。如果可以的话,返回YES并让你的application:openURL:sourceApplication:annotation:
(或application:handleOpenURL :
)方法处理URL的实际开启。 (如果您实现了这两种方法,那么在打开URL之前,两者都必须返回YES。)。图6-1显示了被要求打开URL的应用程序的修改过的启动顺序。
如果您的应用程序正在运行,但处于后台或挂起,在URL请求到达时,则会将其移至前台以打开该URL。 此后不久,系统调用委托的application:openURL:sourceApplication:annotation:
,检查URL并将其打开。 图6-2显示了将应用程序移至前台并打开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间通信,感兴趣的给个赞或者关注~~~~