高级应用技巧
许多应用程序相关的任务依赖于应用程序中您要创建的类型。本章介绍如何实现一些在iOS应用程序中发现的常见行为。
配置你的应用程序,以支持iPhone 5
应用程序对链接的iOS 6和更高版本应该准备支持iPhone 5和iPod touch(第5代)设备的屏幕尺寸较大。为了支持在您的代码中的大屏幕正常,从不会使当前设备的屏幕尺寸假设。相反,永远撷取的画面,窗口的大小,或查看动态,并使用该尺寸的信息来配置你的接口。你也应该使用基于视图的限制,这使得它更容易管理的改变你的看法层次在运行时构建的用户界面。
为了让系统知道你的应用程序支持iPhone 5的屏幕尺寸,包括在您的应用程序的包有适当命名的启动图像。在运行时,系统会寻找一个启动图像,其名称中包含-568h
修改。如果这样的形象出现时,系统会假设您的应用程序支持iPhone 5的明确,并运行它以全屏模式。如果这样的形象是不存在,系统运行与上面和下面与大屏幕设备的应用程序的内容黑皮棒你的应用程序; 它也报告您的应用程序的屏幕大小为320×480点,让您的应用程序的屏幕为基础的计算仍然是正确的。
有关指定启动映像为您的应用程序的更多信息,请参阅“应用程序启动(默认)影像。”
创建通用应用程序
通用应用程序是一个单一的应用程序是为iPhone,iPod touch和iPad设备进行了优化。提供了一个单一的二进制文件,能够适应当前设备提供最佳的用户体验,但是,当然,涉及你的一部分额外的工作。因为在设备的屏幕尺寸上的差异,大部分的窗口,查看,以及iPad的视图控制器的代码很可能是来自于iPhone和iPod touch的代码非常不同。此外,有一些事情你必须做,以确保您的应用程序正常运行在每一个设备类型。
Xcode中提供了配置的通用应用程序的内置支持。当你创建一个新的项目,您可以选择是否要创建一个设备特定的项目或通用的项目。当你创建你的项目,你可以改变设备的设置支持使用摘要窗格您的应用程序的目标。当从一个单一设备项目转变为一个通用的项目,必须填写信息要为其添加支持的设备类型。
以下各节将突出您必须对现有的应用程序,以确保其顺利运行的任何类型的设备的变化。
更新您的Info.plist设置
最通用的应用程序的现有密钥的Info.plist的
文件应该保持不变。然而,对于那些需要在iPhone上不同的价值观与iPad设备的任何按键,你可以添加设备修饰符的键名。当你阅读的钥匙的Info.plist
文件,系统会将使用以下格式每个键:
key_root -
<platform> 〜
<DEVICE>
在这种格式下,key_root部分代表关键的原始名称。该<platform>和<DEVICE>部分都可以使用特定于平台或设备按键可选的结局。对于只在iOS上运行的应用程序,则可以省略该平台的字符串。(该的iPhoneOS
平台的字符串是用来区分于iOS的书面从那些针对Mac OS X的应用程序编写)应用一键一个特定的设备,可以使用下列值之一:
-
iphone
-关键适用于iPhone设备。 -
的iPod
,该键适用于iPod touch设备。 -
iPad的
-关键适用于iPad设备。
例如,以表明你希望你的应用程序启动在纵向方向上的iPhone和iPod touch设备,但在iPad上的风景吧,你会配置您的Info.plist
使用下列键:
的<key> UIInterfaceOrientation </键> |
<STRING> UIInterfaceOrientationPortrait </字符串> |
的<key> UIInterfaceOrientation〜ipad公司</键> |
<STRING> UIInterfaceOrientationLandscapeRight </字符串> |
请注意,在前面的例子中,有没有任何设备的修饰一个iPad专用键和一个默认密钥。继续使用默认的键来指定最常见的(或默认)值,并添加特定版本与设备特定的修饰词时,您需要更改该值。这可以保证始终有可用的系统来检查一个值。例如,如果你要与一个iPhone专用和iPad专用的版本替换默认密钥UIInterfaceOrientation
键,系统将不知道优选的起始方向为iPod设备。
如需键,您可以在您的详细信息的Info.plist
文件,请参阅信息属性列表主要参考
实现你的视图控制器和视图
的努力,进入创建通用应用量最大的是设计用户界面。因为不同的屏幕尺寸,应用程序经常需要它们的接口为每个设备成语的完全独立的版本。这意味着创建新的视图层次结构,但也可能意味着创造完全不同的视图控制器对象来管理这些意见。
对于视图,主要修改是重新设计你的视图层次结构,以支持更大的屏幕。简单地扩展现有的观点可能工作,但往往会产生不良结果。新的界面应该使可用空间的使用和采取适当的新界面元素的优势。这样做比较好,因为它会导致,感觉更自然的用户界面,并且不只是觉得自己是一个更大的屏幕上一个iPhone应用程序。
对于视图控制器,请遵循以下准则:
-
考虑定义不同的视图控制器类的iPhone和iPad设备。使用单独的视图控制器往往比试图创造一个支持的平台之一视图控制器更容易。如果有一个显著金额的共享代码,你总是可以把共享代码在一个基类,然后实现自定义子类来处理特定于设备的问题。
-
如果你使用一个单一的视图控制器类两个平台,您的代码必须同时支持iPhone和iPad的屏幕尺寸。(对于使用nib文件的应用程序,这可能意味着选择哪些nib文件的基础上,当前设备的成语来加载。)同样,你的视图控制器的代码必须能够处理在两个平台之间的差异。
对于视图,请遵循以下准则:
-
请考虑使用意见为iPhone和iPad设备单独设置。对于自定义视图,这意味着定义不同版本的类为每个设备的。
-
如果您选择使用两个设备相同的自定义视图,请确保您
的drawRect:
和layoutSubviews
方法,尤其是在两台设备上正常工作。
有关视图控制器的信息你可以在你的应用程序使用,请参见视图控制器编程指南适用于iOS。
更新您的资源文件
由于资源文件通常用来实现您的应用程序的用户界面的部分,则需要进行以下更改:
-
除了
为Default.png
文件时显示在iPhone设备上的应用程序的启动,必须在描述的iPad设备中添加新的启动映像“提供了用于不同方向发射图像。” -
如果你使用的图像,您可能需要添加更大(或更高分辨率)版本,支持iPad设备。
-
如果使用脚本或nib文件,您需要提供一套新的iPad设备文件。
-
您必须大小的应用程序图标适当的iPad,在描述“应用程序图标”。
当每个平台使用不同的资源文件,你可以有条件地加载这些资源就像你有条件地执行代码。有关如何使用运行时检查的详细信息,请参阅“使用运行时检查以创建条件的代码路径。”
使用运行时检查以创建条件的代码路径
如果您的代码需要遵循不同的路径依赖于底层设备类型,使用userInterfaceIdiom
物业UIDevice
,以确定哪些道路可走。此属性提供了一个指示界面创建的样式:的iPad或iPhone。因为这个属性仅适用于iOS的3.2和更高版本,支持早期版本的iOS应用程序需要访问它之前检查这个属性的可用性。当然,要检查这个属性最简单的方法是使用UI_USER_INTERFACE_IDIOM
宏,它执行必要的运行时检查你的。
如果(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad){ |
/ /该设备是一个iPad运行iOS 3.2或更高版本。 |
} |
其他{ |
/ /该设备是一个iPhone或iPod touch。 |
} |
支持的iOS的多个版本
它支持一系列的iOS版本的任何应用程序必须使用运行时检查,以防止旧版本的iOS不支持他们使用较新的API。例如,如果您使用的iOS 6的新功能建立自己的应用程序,但你的应用程序仍然支持的iOS 5,运行时检查允许您使用最近推出的功能的时候都可用,遵循备用代码路径的时候都没有。如果不包括这些检查会造成当它尝试使用新的符号所不具备的旧版操作系统的应用程序崩溃。
有几种类型的检查,你可以做:
-
要确定一个方法是否可以用现有的类,使用
instancesRespondToSelector:
类方法或respondsToSelector:
实例方法。 -
链接反对的iOS SDK 4.2及更高版本的应用程序可以使用该版本的SDK引入了弱连接的支持。这种支持可以让你检查一个给定的存在
类
对象,以确定您是否可以使用这个类。例如:如果([UIPrintInteractionController类]){
/ /创建一个类的实例,并使用它。
}
其他{
/ /打印交互控制器不可用。
}
要使用此功能,您必须使用LLVM和Clang的建立你的应用程序和应用程序的部署目标必须被设置到iOS 3.1或更高版本。
-
,针对的iOS SDK 4.1和更早的版本链接应用程序必须使用
NSClassFromString
功能,查看一个类是否被定义。如果该函数返回一个值比其他零
,你可以使用类。例如:类splitVCClass = NSClassFromString(@“UISplitViewController”);
如果(splitVCClass)
{
UISplitViewController * mySplitViewController = [[splitVCClass的alloc]初始化];
/ /配置拆分视图控制器。
}
-
要确定一个基于C语言的功能是否可用,执行的功能名称为布尔比较
空
。如果符号不为NULL
,则可以使用该功能。例如:如果(UIGraphicsBeginPDFPage!= NULL)
{
UIGraphicsBeginPDFPage();
}
对于如何编写支持多种部署目标代码的更多信息和示例,请参阅SDK兼容性指南。
开展横向模式
只使用横向方向为他们的应用程序接口必须明确地要求系统在推出该方向的应用程序。通常情况下,应用程序启动在纵向模式和旋转它们的接口需要相匹配的设备的方向。对于同时支持纵向和横向的应用程序,总是配置您的意见为纵向模式,然后让你的视图控制器处理任何旋转。但是,如果您的应用程序支持横向而不是纵向的方向,请执行以下任务,使其在开展横向模式开始:
-
添加
UIInterfaceOrientation
关键看你的应用程序的Info.plist的
文件,并设置该键的任一值UIInterfaceOrientationLandscapeLeft
或UIInterfaceOrientationLandscapeRight
。 -
布置您的意见在横向模式,并确保它们的布局或自动调整大小选项设置是否正确。
-
重写你的视图控制器的
shouldAutorotateToInterfaceOrientation:
方法并返回是
左或右横向方向和编号
为纵向方向。
该UIInterfaceOrientation
在关键的Info.plist
文件会告诉iOS的,它应该配置应用程序状态栏(如果显示),以及任何管理视图的方向的方位视图控制器在启动时。在iOS系统2.1及更高版本,视图控制器尊重这个键,并设置其视图的初始方向相匹配。使用此键就相当于调用setStatusBarOrientation:动画:
方法的UIApplication
在你的执行早期applicationDidFinishLaunching:
方法。
在首次启动安装应用程序特定的数据文件
你可以使用你的应用程序的首次发射周期设置任何数据或运行所需的配置文件。应用程序特定的数据文件应该在创建资源库/应用程序支持/
<bundleID> /你的应用程序沙箱,其中目录<bundleID>是你的应用程序的包标识符。您可以进一步细分该目录根据需要来组织您的数据文件。您也可以在其他目录,比如你的应用程序的icloud的容器目录或本地创建文件的文件
目录,根据您的需要。
如果您的应用程序的包包含您计划修改数据文件,你必须复制这些文件了应用程序捆绑并修改副本。不得修改您的应用程序包中的任何文件。因为iOS应用程序代码被签署,您的应用程序包里面修改文件无效你的应用程序的签名,并防止启动您在未来的应用程序。这些文件复制到该应用程序支持
目录(或在您的沙箱另外一个可以写的目录)和修改他们那里是安全地使用此类文件的唯一途径。
有关iOS应用沙箱而正确位置的文件的目录的详细信息,请参阅文件系统编程指南。
保护数据使用上,磁盘加密
iOS 4中和以后,应用程序可以使用的数据保护功能,安全级别添加到自己的磁盘上的数据。数据保护使用特定的设备(如iPhone 3GS和iPhone 4)内置硬件加密目前存储在磁盘上的加密格式的文件。当用户的设备被锁定,受保护的文件无法访问,甚至到创建它们的应用程序。用户必须明确解锁设备(通过输入相应的密码)至少一次在你的应用程序可以访问它保护的文件之一。
数据保护是大多数iOS设备,并符合以下要求:
-
在用户的设备上的文件系统必须支持的数据保护。这才是真正的新设备,但对于一些早期的设备,用户可能需要重新格式化该设备的磁盘和从备份恢复的任何内容。
-
用户必须拥有该设备的激活密码锁设置。
为了保护一个文件,你的应用必须添加一个属性以显示所需的保护级别文件。添加使用无论是这个属性的NSData
类或的NSFileManager
类。当写入新文件,则可以使用将writeToFile:选项:错误:
方法的NSData
与适当的保护值的写入选项之一。对于现有文件,则可以使用setAttributes:ofItemAtPath:错误:
方法的NSFileManager
来设置或更改的值NSFileProtectionKey
。当使用这些方法,您的应用程序可以为文件指定下列保护级别之一:
-
无保护-该文件是不加密的磁盘上。您可以使用此选项从一个可访问的文件中删除的数据保护。指定
NSDataWritingFileProtectionNone
选项(NSData的
)或NSFileProtectionNone
属性(的NSFileManager
)。 -
完整的-该文件是加密的,交通不便,而该设备已被锁定。指定
NSDataWritingFileProtectionComplete
选项(NSData的
)或NSFileProtectionComplete
属性(的NSFileManager
)。 -
完成除非已经打开,该文件是加密的。一个封闭的文件无法访问,而该设备已被锁定。当用户解锁设备,您的应用程序可以打开该文件并使用它。如果用户锁定装置,而该文件是开放的,但是,您的应用程序可以继续访问它。指定
NSDataWritingFileProtectionCompleteUnlessOpen
选项(NSData的
)或NSFileProtectionCompleteUnlessOpen
属性(的NSFileManager
)。 -
直到完成第一次登录时,该文件被加密,无法访问后,该设备已经启动,用户已经解锁一次,直到。指定
NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication
选项(NSData的
)或NSFileProtectionCompleteUntilFirstUserAuthentication
属性(的NSFileManager
)。
如果您保护的文件,您的应用程序必须准备将无法访问该文件。当启用完整的文件保护功能,即使您的应用程序失去读取和写入文件的内容,当用户锁定设备的能力。你的应用程序有几个选项用于跟踪时,访问受保护的文件可能会改变,但:
-
该应用程序委托可以实现the
applicationProtectedDataWillBecomeUnavailable:
andapplicationProtectedDataDidBecomeAvailable:
methods. -
任何对象都可以报名参加the
UIApplicationProtectedDataWillBecomeUnavailable
andUIApplicationProtectedDataDidBecomeAvailable
notifications. -
任何对象都可以检查的价值
protectedDataAvailable
共享的财产的UIApplication
对象,以确定文件是否可以访问。
对于新文件,建议你在写任何数据之前启用数据保护功能。如果您使用的是将writeToFile:选项:错误:
方法写一个内容的NSData
对象到磁盘,这是自动发生的。对于现有文件,添加数据保护取代了未受保护的文件与新的受保护的版本。
提示开发一个VoIP应用程序
一个互联网语音协议(VoIP)的应用程序允许用户使用互联网连接,而不是设备的移动电话服务拨打电话。这样的一个应用程序需要保持持续的网络连接到其相关的服务,以便它可以接收来电及其他相关数据。而不是不断的VoIP应用程序清醒的时候,系统允许它们被暂停,并提供设施,监测其卯的座。当检测到传入的通信,系统唤醒VoIP的应用程序,并返回它的插座控制它。
有实现一个VoIP应用程序几个要求:
-
添加
UIBackgroundModes
关键看你的应用程序的Info.plist的
文件。设置该键的数组,其中包含的价值VOIP
字符串。 -
配置应用程序的套接字用于VoIP的用法之一。
-
在移动到后台,请致电
setKeepAliveTimeout:处理器:
方法来安装需要定期执行的处理程序。您的应用程序可以使用这个处理程序,以保持其服务的连接。 -
配置您的音频会议,以处理过渡,并从积极利用。
-
为了确保在iPhone更好的用户体验,使用Core电话框架来调整自己的行为有关的细胞为基础的电话; 看核心电话框架参考。
-
为了确保你的VoIP应用程序的性能良好,使用系统配置框架来检测网络的变化,让你的应用程序睡觉尽可能。
包括VOIP
的价值UIBackgroundModes
键让系统知道它应该允许应用根据需要来管理其网络套接字在后台运行。此键也允许你的应用程序播放背景声音(虽然包括音频
的价值UIBackgroundModes
关键仍然是鼓励)。用此键的应用程序也重新启动在系统启动后立即在后台,以确保VoIP服务始终可用。如需了解更多信息UIBackgroundModes
键,请参阅信息属性列表主要参考。
配置适用于VoIP的使用方法
为了让您的应用程序保持持久连接,而它是在后台运行,你必须标记你的应用程序的主通信接口专门用于VoIP的使用情况。标记此套接字告诉系统,它应该采取的插座在管理时,您的应用程序被暂停。切换本身是完全透明的,您的应用程序。而当新数据到达套接字上时,系统被唤醒的应用程序,并返回该套接字的控制,以使应用程序可以处理输入的数据。
你需要标记仅使用与您的VoIP服务进行通信的接口。这是您用于接听来电或有关维护您的VoIP服务连接其他数据套接字。在收到传入的数据,处理程序,这个插座需要决定该怎么做。对于来电,你可能要发布一个本地通知提醒用户呼叫。对于其他非关键数据,不过,你可能只是处理数据静静地让系统把你的应用程序返回到暂停状态。
在iOS中,大部分插座使用流或其他高层次结构管理。要配置一个插座,用于VoIP的使用,您所要做的超出正常配置的唯一的事情就是添加一个特殊键标记的接口与VoIP服务关联。表6-1列出了流接口,并为每个配置。
接口 | 组态 |
---|---|
可可流,使用 | |
当使用URL加载系统,使用 | |
对于核心基础流,使用 |
由于VoIP应用程序需要保持运行,以接听来电时,系统会自动将重新启动应用程序,如果它有一个非零的退出代码退出。(这种类型的退出可能发生时,有内存压力,你的应用程序被终止的结果)。然而,终止应用程序也释放其所有的插座,包括用于保持VoIP服务方面之一。因此,当应用程序启动时,它总是需要从头开始创建它的插槽。
有关配置可可流对象的详细信息,请参阅流编程指南。如需使用URL请求的信息,请参阅网址加载系统编程指南。而对于有关使用CFNetwork的接口上配置流信息,请参见CFNetwork的编程指南。
安装一个保持活动处理程序
以防止其连接的丢失,一个VoIP应用程序通常需要定期唤醒并检查其服务器。为了促进这一行为,iOS的让你使用安装一个特殊的处理setKeepAliveTimeout:处理器:
方法的UIApplication
。您通常在安装此处理程序applicationDidEnterBackground:
您的应用程序委托的方法。一旦安装完毕,系统调用处理程序至少一次超时间隔过期之前,可以根据需要这么做醒来你的应用程序。
您的保活处理程序在后台执行,并应尽可能快地返回。处理程序被给予最多10秒钟来执行任何需要的任务,并返回。如果处理程序10秒后至今未归,或者并没有要求额外的执行时间间隔期满之前,系统挂起的应用程序。
当安装处理程序,指定最大超时值即实用为您的应用程序的需求。运行您的处理程序允许的最小时间间隔为600秒,并试图安装一个处理一个较小的超时值将失败。虽然该系统承诺的超时值到期之前打电话给你的处理程序块,它并不能保证准确的通话时间。为了提高电池寿命,系统一般组处理程序的执行与其他的系统任务,从而处理所有的任务在一个快速爆发。因此,您的处理程序代码必须准备早于您指定的实际超时时间运行。
配置你的应用程序的音频会话
正如任何背景声音的应用程序,音频会话的一个VoIP应用程序必须正确配置,以确保应用程序工程进展顺利与其他基于音频的应用程序。由于音频播放和录制为一个VoIP应用程序不使用的时候,它是您创建和配置是必要的,只有当它你的应用程序的音频会话对象是特别重要的。例如,您可以创建音频会议通知来电或用户,而用户实际上是在通话中。一旦通话结束,你会再取出音频会话的强引用,并给其他音频应用程序的机会,发挥自己的声音。
有关如何配置和管理音频会话的一个VoIP应用程序的信息,请参见音频会话编程指南。
使用可达性接口,以改善用户体验
由于VoIP应用程序在很大程度上依赖于网络,他们应该使用系统配置框架的可达性界面来跟踪网络的可用性,并相应地调整自己的行为。可达性接口允许一个应用程序来通知每当网络条件的变化。例如,一个VoIP应用程序可以关闭其网络连接时,网络变得不可用,并重新创建它们,当它再次变为可用。该应用程序还可以使用这些类型的更改,以保持用户告知有关VoIP连接的状态。
要使用可达性接口,必须注册一个回调函数的框架,并用它来跟踪更改。注册一个回调函数:
-
创建
SCNetworkReachabilityRef
为你的目标远程主机的结构。 -
指定一个回调函数给你的结构(使用
SCNetworkReachabilitySetCallback
功能),用于处理改变你的目标的可达性状态。 -
补充一点,目标到您的应用程序使用一个积极的循环运行(如主运行循环)
SCNetworkReachabilityScheduleWithRunLoop
功能。
调整基于网络的可用性您的应用程序的行为也可以帮助改善底层设备的电池寿命。让系统跟踪网络的变化意味着你的应用可以让自己去更经常失眠。
如需可达接口的详细信息,请参阅系统配置框架参考。
与其他应用程序进行通信
支持自定义URL方案的应用程序可以使用这些方案来接收消息。有些应用程序使用URL方案启动的具体要求。例如,一个应用程序,想要显示在地图应用程序的地址可以使用URL来启动该应用程序并显示地址。你可以实现自己的URL方案,以促进同类型的通信在你的应用程序。
苹果提供了内置支持HTTP
,寄信
,电话
和短信
的URL方案。它还支持HTTP
定位于地图,YouTube,和iPod的应用程序为基础的URL。在处理这些计划是固定的,不能改变。如果你的URL类型包括方案是相同的一个由苹果定义的,苹果提供的应用程序被启动,而不是你的应用程序。
要使用一个自定义URL的应用程序进行通信,创建一个NSURL
与一些格式正确的内容对象以及对象传递到的OpenURL:
共享的方法的UIApplication
对象。该的OpenURL:
方法启动该注册以接收该类型的URL,并传递给它的URL的应用程序。在这一点上,控制传送到新的应用程序。
下面的代码片段说明了一个应用程序如何请求另一个应用程序中的服务(在这个例子中“todolist的”,是由一个应用程序注册一个假设的自定义方案):
NSURL * myURL的= [NSURL URLWithString:@“todolist的:/ / www.acme.com?Quarterly%20Report#200806231300”]; |
[[的UIApplication sharedApplication]的OpenURL:myURL的]; |
如果您的应用程序定义了一个自定义的URL方案,它应该作为描述执行的处理程序,该计划“实现自定义URL方案。”有关系统支持的URL方案的详细信息,包括有关如何格式化的URL信息,请参见苹果的URL方案参考。
支持空投
在iOS系统7,空投可以让你分享照片,文件,URL和其他类型的与附近的设备上的数据。空投采取的对等网络的优势,找到附近的设备和连接到它们。企业应用套件,其中包括用于自动发送或接收文件和数据获得对空投的支持。
发送文件和数据到另一个应用程序
要使用空投发送文件和数据,显示从用户界面使用的活动板UIActivityViewController
类。当创建这个视图控制器,则必须指定要共享的数据对象。不同的活动,支持不同的数据类型。用于空投,您可以指定图像,字符串,URL和其他几种类型的数据。鬻该数据的一种方法是让你的数据对象采用UIActivityItemSource
协议,这使得它更容易管理不同类型的数据,并把它们提供给活动视图控制器。
要显示活动视图控制器,你可以使用类似的代码所示清单6-1。活动视图控制器会自动使用指定的对象的类型,以确定哪些活动在活动单页显示。你没有明确指定空投活动。但是,您可以防止纸张从使用视图控制器的显示特定类型的excludedActivityTypes
财产。当显示在iPad上的活动视图控制器,你必须使用一个酥饼。
显示的是活动板在iPhone上
- (无效)displayActivityControllerWithDataObject:(ID){obj的 |
UIActivityViewController * VC = [[UIActivityViewController的alloc] |
initWithActivityItems:@ [OBJ] applicationActivities:无]; |
[自我presentViewController:VC动画:是完成:无]; |
} |
如需使用活动视图控制器的更多信息,请参见UIActivityViewController类参考。对于活动和他们所支持的数据类型的完整列表,请参阅UIActivity类参考。
接收文件和数据发送到您的应用程序
接收使用空投发送到您的应用程序文件,你必须做到以下几点:
-
在Xcode中,申报的文件类型您的应用程序能够打开支持。
-
在你的应用程序的委托,实施
应用:的OpenURL:sourceApplication:注释:
法新数据到达时的通知。 -
准备寻找文件在你的应用程序的
文档/收件箱
目录,并根据需要将它们移出该目录。
注: 应用程序可以定义自己的自定义URL方案,并利用这些计划来从其他应用程序接收的文件和数据。定义一个自定义方案使得它不太可能是另一个应用程序将处理用于您的应用程序文件。有关实现自定义URL方案的信息,请参阅“实现自定义URL方案。”
您的Xcode项目的信息选项卡包含用于指定您的应用程序支持的文档类型文档类型部分。至少,你必须为代表的数据类型的文档类型和一个或多个尿路感染指定一个名称。例如,要声明的PNG文件的支持,你将包括public.png
作为UTI字符串。iOS的使用您指定,以确定您的应用程序有资格打开一个给定的文档类型。
转让的资格文件,以你的应用程序的主目录后,iOS的启动您的应用程序(如果需要),并调用您的应用程序的应用程序:的OpenURL:sourceApplication:注释:
方法。这种方法是您的应用程序的通知,该文件是可你检查。无论你做了什么文件立即取决于你的应用程序,无论是在前台还是后台。如果你的应用程序是在后台运行,你可能会决定只值得注意的是,文件是存在的,这样您可以稍后再开启。由于放置的数据文件使用的数据加密保护,该文件将无法使用,为您打开马上无论如何,如果该设备是目前被锁定。
使用空投转移到你的应用程序的文件被放置在文件/收件箱
您的应用程序的主目录的目录。应用程序有权限读取和删除文件在此目录中,但他们没有权限更改文件的内容。建议您将文件移出该目录或删除它们时,你不再需要它们。如果你打算修改该文件,你必须移动它了收件箱
才这样做的目录。
如需在你的应用程序支持的文档类型的详细信息,请参阅基于文档的应用程序编程指南适用于iOS。
实现自定义URL方案
如果您的应用程序可以接收特殊格式的URL,你应该注册相应的URL方案与系统。自定义URL方案是通过第三方应用程序可以相互通信的机制。应用程序经常使用自定义URL方案鬻服务的其他应用程序。例如,地图应用程序支持,用于显示地图的特定位置的URL。
注册自定义的URL方案
注册一个URL类型为您的应用程序,包括CFBundleURLTypes
在你的应用程序的主要Info.plist的
文件。该CFBundleURLTypes
密钥包含字典的数组,每个定义URL方案的应用程序的支持。表6-2描述了键和值在每个字典包含。
关键 | 值 |
---|---|
| 一个字符串,包含了URL方案的抽象名称。为了保证唯一性,建议您指定标识符的反向DNS样式,例如, 您所指定的字符串也可以作为您的应用程序的一个关键 |
| 含有URL方案的名称,例如,字符串数组 |
处理URL请求
一个应用程序,都有其自己的自定义URL方案必须能够处理传递给它的URL。所有URL都传递到您的应用程序的委托,或者在启动时或在您的应用程序正在运行或在后台。处理传入的URL,您的代理应该实现以下方法:
-
使用
应用程序:willFinishLaunchingWithOptions:
和应用:didFinishLaunchingWithOptions:
方法来检索有关URL的信息,并决定是否要打开它。如果任一方法返回NO
,你的应用程序的URL处理代码不被调用。 -
在IOS 4.2及更高版本,使用的
应用程序:的OpenURL:sourceApplication:注释:
方法打开该文件。
如果当一个URL请求到达你的应用程序没有运行,则启动并移动到前台,以便它可以打开该URL。你的实现应用程序:willFinishLaunchingWithOptions:
或应用程序:didFinishLaunchingWithOptions:
方法应该从它的选项字典检索URL,并确定应用程序是否可以打开它。如果能,则返回YES
,让你的应用程序:的OpenURL:sourceApplication:注释:
(或应用程序:handleOpenURL:
)方法处理URL的实际开放。
(如果要实现这两种方法,两者必须返回YES
网址才能打开。)图6-1显示了一个应用程序,被要求打开一个URL修改启动顺序。
如果您的应用程序正在运行,但在后台,或当一个URL请求到达时暂停,它被移到前台打开URL。此后不久,系统调用委托的应用:的OpenURL:sourceApplication:注解:
查询的网址并打开它。如果您的委托不实现这个方法(或当前的系统版本为iOS 4.1的或更早版本),系统会调用您的委托的应用:handleOpenURL:
方法来代替。图6-2显示了用于移动应用推到前台,打开修改过程一个URL。
注: 启动应用程序来处理URL时要显示支持自定义URL方案的应用程序可以指定不同的启动映像。有关如何指定这些启动映像的详细信息,请参阅“提供的自定义URL方案启动影像。”
所有URL都传递给你的应用程序在一个NSURL
对象。它是由你来定义URL的格式,但NSURL
类符合RFC 1808规范,因此支持大多数的URL格式约定。具体地,类包括由RFC 1808所定义的,包括用户名,密码,查询,片段,和参数串返回一个URL的各个部分的方法。该“协议”为您定制的方案可以使用这些URL部分适用于输送各种信息。
在执行应用程序:的OpenURL:sourceApplication:注释:
在显示清单6-2,传入的URL对象在其查询和片段部分传达应用程序特定的信息。委托提取该信息,在这种情况下,待办任务的名称和日期的任务是由于,并与它所创建的应用程序的模型对象。此示例假定用户使用的是公历。如果您的应用程序支持非公历日历,你需要相应地设计你的URL方案,并准备处理这些其他类型的日历在您的代码中。
处理的基础上自定义方案的URL请求
- (BOOL)应用:(*的UIApplication)应用的OpenURL:(NSURL *)网址 |
sourceApplication:(的NSString *)sourceApplication注释:(id)的注释{ |
如果([[URL方案] isEqualToString:@“todolist的”]){ |
的TodoItem *项目= [[的TodoItem的alloc]初始化]; |
的NSString * TASKNAME = [网址查询]; |
如果(TASKNAME | | [个体经营isValidTaskString:TASKNAME!]){/ /必须有一个任务名称 |
返回NO; |
} |
TASKNAME = [TASKNAME stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; |
|
item.toDoTask = TASKNAME; |
的NSString * DateString一律= [URL片段]; |
如果(DateString一律| | [DateString一律isEqualToString:@“今天”]){ |
item.dateDue = [NSDate的日期]; |
}其他{ |
如果([个体经营isValidDateString:DateString一律]){ |
返回NO; |
} |
/ /格式:yyyymmddhhmm(24小时制) |
的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]初始化]; |
[dateComps则setYear:yeardigit]; |
[dateComps调用setMonth:monthdigit]; |
[dateComps setDay:daydigit]; |
[dateComps setHour:hourdigit]; |
[dateComps setMinute:minutedigit]; |
NSCalendar *历= [S [NSCalendar的alloc] initWithCalendarIdentifier:NSGregorianCalendar]; |
的NSDate * itemDate = [日历dateFromComponents:dateComps]; |
如果(!itemDate){ |
返回NO; |
} |
item.dateDue = itemDate; |
} |
|
[(NSMutableArray里*)self.list ADDOBJECT:项目]; |
返回YES; |
} |
返回NO; |
} |
请务必验证您从传递给你的应用程序的URL获得输入; 看到“验证输入和进程间通信”在安全编码指南,了解如何避免与URL处理问题。要了解苹果定义的URL方案,请参见苹果的URL方案参考。
显示和隐藏键盘
键盘的外观是联系在一起的观点响应状态。如果视图能够成为第一个响应,系统显示的键盘,每当这种观点实际上变成第一响应者。当用户点击不支持成为第一个响应者另一种观点认为,该系统隐藏键盘,如果它是目前可见的。UIKit中,只有观点认为支持文本输入可以成为默认的第一个响应者。其他意见必须重写canBecomeFirstResponder
方法并返回YES
,如果他们想显示的键盘。
当一个角度的第一响应者时,键盘会显示默认,但可以更换键盘支持输入自定义表单的看法。每一个响应者对象都有一个inputView
包含在响应成为第一个响应要显示的视图属性。当此属性是零
,系统会显示标准键盘。当该属性不为零
,则系统会显示您提供的,而不是视图。
通常情况下,用户水龙头决定哪个视图成为您的应用程序的第一个响应者,但你可以强制一个视图成为第一个响应者也。调用becomeFirstResponder
方法的任何响应对象的原因是反对尝试成为第一个响应者。如果响应者对象能成为第一个响应者,自定义输入视图(或标准键盘)会自动显示。
有关使用键盘的详细信息,请参阅文本编程指南适用于iOS。
关闭屏幕锁定
如果一个基于iOS的设备不接收触摸事件在指定的时间内,系统自动关闭屏幕并禁用触摸传感器。锁定屏幕以节省电力的重要途径。因此,你通常应该将此功能启用。然而,对于一个应用程序,不依赖于触摸事件,如游戏,使用加速度计用于输入,禁用屏幕锁定,以防止屏幕会暗应用程序运行时。然而,即使在这种情况下,禁用屏幕仅锁定在用户正积极地与该应用程序。例如,如果用户暂停游戏,重新启用屏幕锁定,让屏幕关闭。
要禁用屏幕锁定,设置idleTimerDisabled
共享的财产的UIApplication
对象为YES
。请务必将此属性重置为NO
,当你的应用程序并不需要防止屏幕锁定。