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無法成功的完成向 程序進程推送時 發送到委托去...
說明:當一個運行着的應用程序收到一個遠程的通知 發送到委托去...
-(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:
說明:通知委托 受保護的文件當前變為可用