1. 程式人生 > >IOS AppDelegate詳解

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 (處理遠端訊息)

-(voidapplication:(UIApplication *) applicationdidReceiveRemoteNotification:(NSDictonary *) userinfo
說明:當一個執行著的應用程式收到一個遠端的通知 傳送到委託去...-(voidapplication:(UIApplication *) applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *) deviceToken
說明:當一個應用程式成功的註冊一個推送服務(APS) 傳送到委託去...-(voidapplication:(UIApplication *) applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *) error
說明:當 APS無法成功的完成向 程式程序推送時 傳送到委託去...

Handling Local Notification (處理本地訊息)

-(voidapplication:(UIApplication *) applicationdidReceiveLocalNotification:(UILocalNotification *)notification
說明:當一個執行著的應用程式收到一個本地的通知 傳送到委託去...

Responding to Content Protections Changes(響應受保護內容的改變)

-applicationProtectedDataWillBecomeUnavailable:
說明:通知委託,受保護的檔案當前變為不可用的-applicationProtectedDataWillBecomeAvailable:
說明:通知委託  受保護的檔案當前變為可用