1.介紹服務器
2.方法app
3.通知url
AppDelegate就是iOS的垃圾場。App的生命週期管理?URL處理?通知?CoreData?大量第三方SDK的初始化?還有那些看起來放到哪裏都不合適的函數?通通都被塞到AppDelegate.m裏面code
這全部之中,application:didFinishLaunchingWithOptions:是最擁擠的一個。對於許多開發者來講,launchOptions參數如同Java main函數的String[]參數同樣,被忽視了。然而,擺在眼前的事實是,launchOptions包含了許多關鍵性知識,涉及了app在iOS上的衆多啓動方式 對象
//當應用程序啓動時(不包括已在後臺的狀況下轉到前臺),調用此回調。 – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
//當應用程序全新啓動,或者在後臺轉到前臺,徹底激活時,都會調用這個方法。若是應用程序是之前運行在後臺,這時能夠選擇刷新用戶界面。 – (void)applicationDidBecomeActive:(UIApplication *)application;
//當應用從活動狀態主動到非活動狀態的應用程序時會調用這個方法。這可致使產生某些類型的臨時中斷(如傳入電話呼叫或SMS消息)。或者當用戶退出應用程序,它開始過渡到的背景狀態。使用此方法能夠暫停正在進行的任務,禁用定時器,下降OpenGL ES的幀速率。遊戲應該使用這種方法來暫停遊戲。 – (void)applicationWillResignActive:(UIApplication *)application;
//當用戶經過其它應用啓動本應用時,會回調這個方法,url參數是其它應用調用openURL:方法時傳過來的。 – (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2);
//當應用可用內存不足時,會調用此方法,在這個方法中,應該儘可能去清理可能釋放的內存。若是實在不行,可能會被強行退出應用。 – (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
//當應用退出,而且進程即將結束時會調到這個方法,通常不多主動調到,更可能是內存不足時是被迫調到的,咱們能夠在這個方法裏作一些數據存儲操做。 – (void)applicationWillTerminate:(UIApplication *)application;
//當客戶端註冊遠程通知時,會回調下面兩個方法。 //若是成功,則回調第一個,客戶端把deviceToken取出來發給服務端,push消息的時候要用。 //若是失敗了,則回調第二個,能夠從error參數中看一下失敗緣由。 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0); - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0);
//當應用在前臺運行中,收到遠程通知時,會回調這個方法。 //當應用在後臺狀態時,點擊push消息啓動應用,也會回調這個方法。 – (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
//當應用收到本地通知時會調這個方法,若是在前臺運行狀態直接調用,若是在後臺狀態,點擊通知啓動時,也會回調這個方法 – (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification NS_AVAILABLE_IOS(4_0);
//當用戶從臺前狀態轉入後臺時,調用此方法。使用此方法來釋放資源共享,保存用戶數據,無效計時器;並儲存足夠的應用程序狀態信息的狀況下被終止後,將應用程序恢復到目前的狀態。若是您的應用程序支持後臺運行,這種方法被調用,不然調用applicationWillTerminate:用戶退出。 – (void)applicationDidEnterBackground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);
//當應用在後臺狀態,將要進行動前臺運行狀態時,會調用此方法。若是應用不在後臺狀態,而是直接啓動,則不會回調此方法。 – (void)applicationWillEnterForeground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);
application:didFinishLaunchingWithOptions: 經過該方法通知的第三方app打開該應用(通常在應用被殺死狀況下會進入)。生命週期
-(BOOL)application: openURL: options:經過該方法通知的第三方app打開該應用((該方法在app還未被殺掉會進入這個)
launchOptions裏面還會附帶下面這些key:
UIApplicationLaunchOptionsURLKey: 標示了該應用程序是爲了打開一個URL啓動。這個Key對應的值是一個NSURL對象,表示要打開的URL。
UIApplicationLaunchOptionsSourceApplicationKey: 標示了要求啓動你的程序的那個app。對應的值是一個NSString,表示那個app的bundle ID。
UIApplicationLaunchOptionsAnnotationKey: 標示了要求打開URL的那個app提供的自定義數據。對應的值是一個property-list類型的對象,包含自定義的數據。
推送通知
//註冊推送通知
//註冊推送通知 -(void)registerRemoteNotification{ // iOS8 下須要使用新的 API if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { UIUserNotificationType myTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:myTypes categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; }else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound]; } }
// 在 iOS8 系統中,還須要添加這個方法。經過新的 API 註冊推送服務 -(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{ [application registerForRemoteNotifications]; } //註冊推送服務成功獲取deviceToken -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ //官方文檔上建議開發者在每次啓動應用時應該都向APNS獲取device token並上傳給服務器。 //處理空格和<> NSString *deviceTokenString=[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""]stringByReplacingOccurrencesOfString: @" " withString: @""]; NSLog(@"deviceToken:%@",deviceTokenString); } //註冊推送服務失敗 -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"註冊推送通知失敗:%@",[error.userInfo valueForKey:@"NSLocalizedDescription"]); }
//接收推送通知
接收到推送通知後,若是app當前處於前臺運行狀態,appDelgate的 application:didReceiveRemoteNotification:方法會被調用。然而,當app是由於用戶滑動通知中心的推送消息而 啓動時,application:didFinishLaunchingWithOptions:方法會被調用。這個時候,launchOption裏面 會包含名爲UIApplicationLaunchOptionsRemoteNotificationKey的key: 代表app有一個推送通知等待處理。這個key對應的值是一個包含了推送通知負載信息的NSDictionary。
//這樣看來,就有兩個地方要寫處理推送通知的代碼。所以,一個一般的作法是在application:didFinishLaunchingWithOptions:裏面手動調用application:didReceiveRemoteNotification:: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) { [self application:application didReceiveRemoteNotification:launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]]; } }
本地通知
//設置本地通知
//設置本地通知 -(void)registerLocalNotification{ UILocalNotification *notification=[[UILocalNotification alloc] init]; if (notification == nil) { return; } //設置本地通知的觸發時間(若是要當即觸發,無需設置),這裏設置爲20妙後 notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5]; //設置本地通知的時區 notification.timeZone = [NSTimeZone defaultTimeZone]; //通知內容 notification.alertBody=@"起牀了小笨蛋。。。"; //通知被觸發時播放的聲音 notification.soundName=UILocalNotificationDefaultSoundName;
//本地自定義聲音文件,一遍2到4秒
//notification.soundName=@"BELL.WAV";
// //通知重複提示的單位能夠是天、周、月 // notification.repeatInterval=NSCalendarUnitMinute; //在規定的日期觸發通知 [[UIApplication sharedApplication] scheduleLocalNotification:notification]; //當即觸發一個通知 // [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; }
與推送通知不一樣,UIApplication的delegate方法提供了一個統一的處理本地通知的地方。若是一個app是被本地通知啓動的,會先 調用application:didReceiveLocalNotification:方法,而後纔會調用 application:didFinishLaunchingWithOptions:(所以,就不須要在 application:didFinishLaunchingWithOptions:裏面手動調用 application:didReceiveLocalNotification了)。
本地通知在launchOptions裏面的key爲UIApplicationLaunchOptionsLocalNotificationKey,對應的值爲UILocalNotification對象