application:didFinishLaunchingWithOptions:詳解


 iOS 程序啟動時總會調用application:didFinishLaunchingWithOptions:,其中第二個參數launchOptions為NSDictionary類型的對象,里面存儲有此程序啟動的原因。

launchOptions中的可能鍵值見UIApplication Class Reference的Launch Options Keys節 。

  • 若用戶直接啟動,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 = [options objectForKey:UIApplicationLaunchOptionsURLKey];
    if(url)
    {
    }
    NSString *bundleId = [options objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
    if(bundleId)
    {
    }
    UILocalNotification * localNotify = [options objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if(localNotify)
    {
    }
    NSDictionary * userInfo = [options objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if(userInfo)
    {
    }

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
這里是分割線
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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 *)  applicationdidReceiveRemoteNotification:(NSDictonary *) userinfo
說明:當一個運行着的應用程序收到一個遠程的通知 發送到委托去...
-(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:
說明:通知委托  受保護的文件當前變為可用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM