IOS AppDelegate詳解
AppDelegate.h模板
//模板預設引入程式需要使用“類”的框架,即UIKit.h標頭檔案,使它包含在程式中
#import
//此處@class宣告程式中的“類”名稱為MyViewController
@class MyViewController;
//此處@interface宣告程式介面的名稱為MyAppDelegate,其中NSObject表示它的“類”符合UIApplicationDelegate協議,接著UIApplicationDelegate,此方法為應用程式提供了關於觸發的關鍵事件資訊,例如什麼時候程式執行完成,什麼時候記憶體不足,什麼時候重要變化發生
@interface MyAppDelegate : NSObject {
//定義一個程式顯示視窗的物件
UIWindow *window;
//加入檢視控制實際變數的物件
MyViewController *viewController;
}
//此處@Property宣告程式的屬性,並且加入在前面@interface中指定的相同物件, 其中nonatomic是使用單執行緒機制減少系統資源使用,並將更改方法和修改方法生成在
//Property(屬性),
//接著retain,Property的可選項,表明向Property
(屬性)的物件傳送一個retain(保留訊息),
//而IBOutlet表示物件在Interface Builder(Storyboard)中建立。
//例如下面的程式碼在應用程式中顯示了一個視窗控制元件,
把這個控制元件連線到nib檔案並顯示在Interface Builder (Storyboard)
@property (nonatomic, retain) IBOutlet UIWindow *window;
//又例如,程式碼在應用程式中顯示了一個檢視控制控制元件,
把這個控制元件連線到nib檔案並顯示在 Interface Builder (Storyboard)
@property (nonatomic, retain) IBOutlet MyViewController *viewController;
//程式結束點,表明結束MyViewController.h檔案
@end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IOS 中的 AppDelegate.m/h 檔案是很重要的呢,因為它是對 Application 的整個生命週期進行管理的。
先明白,每個iPhone應用程式都有一個UIApplication,UIApplication是iPhone應用程式的開始並且負責初始化並顯 示 UIWindow,並負責載入應用程式的第一個UIView到UIWindow窗體中。UIApplication的另一個任務是幫助管理應用程式的
生命 週期,而UIApplication通過一個名字為UIApplicationDelegate的代理類來履行這個任務。儘管 UIApplication 會負責接收事件,而UIApplicationDelegate則決定應用程式如何去響應這些事 件,UIApplicationDelegate可以處理 的事件包括應用程式的生命週期事件(比如程式啟動和關閉)、系統事件(比如來電、記事項警 告),本文會介紹如何載入應用程式的UIView到 UIWindow以及如何利用UIApplicationDelegate處理系統事件。
通 常對於UIApplication讀者是沒必要修改它的,只需要知道UIApplication接收系統事件即可,而如何編寫程式碼來處理這些系統事件 則 是程式設計師的工作。處理系統事件需要編寫一個繼承自UIApplicationDelegate介面的類,而
UIApplicationDelegate接 口提供生命週期函式來處理應用程式以及應用程式的系統事件,這些生命週期函式如下表所示:
1、- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions
{
NSLog(@"當程式載入後執行");
}
說明:當程式載入後執行,應用程式啟動入口。只在應用程式啟動時執行一次。也就是說在應用程式啟動後,要執行的委託呼叫。application引數用來獲取應用程式的狀態、變數等,值得注意的是字典引數:(NSDictionary
*)launchOptions,該引數儲存程式啟動的原因。
若使用者直接啟動,lauchOptions內無資料;
若由其他應用程式通過openURL:啟動,則UIApplicationLaunchOptionsURLKey對應的物件為啟動
URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey對應啟動的源應用程式的 bundle ID (NSString);
若由本地通知啟動,則UIApplicationLaunchOptionsLocalNotificationKey對應的是為啟動應用程式的的本地通知物件(UILocalNotification);
若由遠端通知啟動,則UIApplicationLaunchOptionsRemoteNotificationKey對應的是啟動應用程式的的遠端通知資訊userInfo(NSDictionary);
其他key還有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,
UIApplicationLaunchOptionsNewsstandDownloadsKey。
如果要在啟動時,做出一些區分,那就需要在下面的程式碼做處理。比如:應用可以被某個其它應用調起(作為該應用的子應用),要實現單點登入,那就需要在啟動程式碼的地方做出合理的驗證,並跳過登入。
例子:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions
{
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
if(url)
{
}
NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
if(bundleId)
{
}
UILocalNotification * localNotify = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if(localNotify)
{
}
NSDictionary * userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo)
{
}
}
2、- (void)applicationWillResignActive:(UIApplication
*)application
{
NSLog(@"應用程式將要進入非活動狀態,即將進入後臺");
}
在應用程式將要由活動狀態切換到非活動狀態時候,要執行的委託呼叫,如
按下 home 按鈕,返回主螢幕,或全屏之間切換應用程式等。
說明:當應用程式將要進入非活動狀態時執行,在此期間,應用程式不接收訊息或事件,比如來電話了。
3、- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"如果應用程式支援後臺執行,則應用程式已經進入後臺執行");
}
說明:當程式被推送到後臺的時候呼叫。所以要設定後臺繼續執行,則在這個函式裡面設定即可
4、- (void)applicationWillEnterForeground:(UIApplication
*)application
{
NSLog(@"應用程式將要進入活動狀態,即將進入前臺執行");
}
說明:當程式從後臺將要重新回到前臺時候呼叫,這個剛好跟上面的那個方法相反。
5、- (void)applicationDidBecomeActive:(UIApplication
*)application
{
NSLog(@"應用程式已進入前臺,處於活動狀態");
}
說明:當應用程式進入活動狀態時執行,這個剛好跟上面那個方法相反
。
6、- (void)applicationWillTerminate:(UIApplication
*)application
{
NSLog(@"應用程式將要退出,通常用於儲存資料和一些退出前的清理工作");
}
說明:當程式將要退出是被呼叫,通常是用來儲存資料和一些退出前的清理工作。這個需要要設定UIApplicationExitsOnSuspend的鍵值。
7、- (void)applicationDidReceiveMemoryWarning:(UIApplication
*)application
{
NSLog(@"系統記憶體不足,需要進行清理工作");
}
說明:iPhone裝置只有有限的記憶體,如果為應用程式分配了太多記憶體作業系統會終止應用程式的執行,在終止前會執行這個方法,通常可以在這裡進行記憶體清理工作防止程式被終止。
8、-(void)applicationSignificantTimeChange:(UIApplication
*)application
{
NSLog(@"當系統時間發生改變時執行");
}
說明:當系統時間發生改變時執行
9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
{
NSLog(@"StatusBar框將要變化");
}
說明:當StatusBar框將要變化時執行
10、- (void)application:(UIApplication*)application
willChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration
{
}
說明:當StatusBar框方向將要變化時執行
11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
{
}
說明:當通過url執行
12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
{
}
說明:當StatusBar框方向變化完成後執行
13、- (void)application:(UIApplication*)application
didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
{
}
說明:當StatusBar框變化完成後執行
另外還有一些協議方法需要知道:
Handling Remote Notifications (處理遠端訊息)
說明:當一個執行著的應用程式收到一個遠端的通知 傳送到委託去...-(void) application:(UIApplication *) applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *) deviceToken
說明:當一個應用程式成功的註冊一個推送服務(APS) 傳送到委託去...-(void) application:(UIApplication *) applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *) error
說明:當 APS無法成功的完成向 程式程序推送時 傳送到委託去...
Handling Local Notification (處理本地訊息)
-(void) application:(UIApplication *) applicationdidReceiveLocalNotification:(UILocalNotification *)notification說明:當一個執行著的應用程式收到一個本地的通知 傳送到委託去...
Responding to Content Protections Changes(響應受保護內容的改變)
-applicationProtectedDataWillBecomeUnavailable:說明:通知委託,受保護的檔案當前變為不可用的-applicationProtectedDataWillBecomeAvailable:
說明:通知委託 受保護的檔案當前變為可用