first:什么是应用程序呢?
应用程序实际上就是文件夹,其中包含了编译后的二进制文件以及它们需要的所有资源。
second:App的构成
OS X和iOS上的应用程序必须至少包含: *编译后的二进制文件 *一个用于向系统描述该App的信息文件。
third:使用NSBundle在应用程序中查找资源
利用NSBundle类,你的应用程序可以知道自己在磁盘上的什么位置,以及如何获得编译后的资源。 我们可以使用NSBundle来确定应用程序的软件包在磁盘上滴位置,但是大多数情况下,只需要了解各个资源的位置。 代码栗子:
let resourcePath = NSBundle.mainBundle().pathForResource("someFile",ofType: "txt")
该代码返回一个NSString,它包含了一个名为someFile.txt的资源的绝对路径。
forth:应用程序的生命周期
OS X的应用程序: 系统做的第一件事就是打开Info.plist。系统从这个文件中获知编译后的二进制文件位于什么地方,并启动它。 除了编译后的代码之外,应用程序几乎总会包含一些在设计时准备的、与应用程序一起打包的对象。这些对象通常是接口对象(预先准备的窗口、控件和屏幕),它们在生成应用程序时被存储在nib文件内部。当应用程序运行时,将打开这些nib文件,预先准备的对象将被加载到内存中。 系统首先打开nib文件,反序列化其内容。也就是说,应用程序会对其中存储的窗口,控件及任何其他东西进行解包,并将它们链接在一起。主nib文件中还包含了应用程序委托对象,它随所有其他内容一起解包。 在从nib文件中解包一个对象时,会向其发送awakeFromNib消息,从这一刻起,该对象可以开始运行代码。(由代码创建的对象会收到init方法) 这时,应用程序已经做好准备可以开始正常运行了。他做的第一件事是向应用程序委托发送applicationDidFinishLaunching方法。 接下来,应用程序将一直运行,指导用户选择另一个App为止。用户选择另一个应用程序时,应用程序委托将会收到applicationWillResignActive消息(应用程序仍然出现在屏幕上),表示该应用程序不再是活动应用,稍后,应用程序将会收到applicationDidResignActive方法(应用程序不可见)。 当用户回到该app时,应用程序委托将收到一对类似的方法:applicationWillBecomeActive和applicationDidBecomeActive。 应用程序终止时,应用程序委托收到applicationWillTerminate消息,此消息在app马上就要退出时发送,这时app在退出之前最后一次保存文件的机会。 iOS应用程序的行为表现大体与OS X应用程序相同,只有几点区别。其中一个主要区别就是iOS应用程序的呈现不同于桌面应用程序,而且iOS设备上的内存限制更为严格,所以对于多任务也有更严格的规则。
fifth:应用程序的后台运行
应用程序可以申请在后台短时的运行,这个时长不能超过10分钟,后台短时运行的存在是为了让应用程序能够完成一个需要长时间运行的过程,比如将大型文件写回瓷盘,完成下载等等。 要在后台运行任务,需要向应用程序委托中添加类似于如下的代码:
func applicationDidEnterBackground(application: UIApplication) {
// 后台运行
var backgroundTask : UIBackgroundTaskIdentifier! = nil
// 注册一个后台任务,并提供一个在时间耗尽时执行的代码块
backgroundTask = application.beginBackgroundTaskWithExpirationHandler(){
// 当时间耗尽时执行如下代码
application.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
let backgroundQueue = NSOperationQueue()
backgroundQueue.addOperationWithBlock(){
// 完成一些工作
NSLog("Doing some background work!")
application.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
}
并不能保证用于执行后台任务的额外时间是连续的,这些时间可能被分为多个片段,以延长电池寿命。 iOS7引入了两种在后台运行任务的方式:后台获取和后台通知。 后台获取是为了那些需要定期更新的应用程序设计的。在启用后台获取之后,应用程序可以在后台被唤醒,在后台获取最新信息,以便用户在将应用程序转到前台时能够立即显示这些信息。 要使用后台获取,需要做几件事情: 首先,在项目导航器中选择项目,打开capabilities选项卡,启用BackgroundModes部分的background Fetch。 其次,在你的代码中,需要调用方法setMininumBackgroundFetchInterval函数,让iOS知道多长时间唤醒应用一次,否则,iOS将执行默认的设置:never唤醒你的应用~代码栗子如下:
func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
return true
}
另外,为了让你的应用程序在被唤醒时能够真正的获取,必须向应用程序委托中增加一些类似如下所示的代码:
func application(application: UIApplication,performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { var error : NSError? = nil let data = downloadSomeData(&error!) if error != nil { completionHandler(UIBackgroundFetchResult.Failed) return } if !(data.isEmpty) { completionHandler(UIBackgroundFetchResult.NewData) return } else { completionHandler(UIBackgroundFetchResult.NoData) return } } func downloadSomeData(inout someError:NSError) -> String {
return "SomeData"
}
后台通知:后台通知允许应用程序在后台接收通知并进行处理。要启用远程通知,也需要设置capabilities,启用backgroundModes部分的remote Notifications。并添加如下方法处理消息:
func application(application: UIApplication,didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
<#code#>
}
另外请记住,尽管iOS允许你设定一个在后台进行获取的最短间隔,但iOS会以它认定的一个最佳时间来唤醒你的应用程序,以避免不必要的耗费设备电量。因此,如果应用程序的行为表现与你设置的不完全一致,可能就是这个原因造成的。