前言數組
以前接觸過iOS上的推送服務,當時作的是在線推送,雖然已經有不少開發商提供集成的推送服務,但做爲了解原理的方式也是一個不錯的過程。服務器
最近打算應用本地通推送的功能,原本覺得會和在線推送同樣麻煩,又要弄證書,又要提交驗證,因此一直沒動手。今天稍微瞭解後,發現本地推送就是很簡單的一件事。app
介紹spa
本地推送是什麼code
在線推送通常是經過服務器發送消息到對應設備,並由對應設備作出響應通知用戶。而本地推送則是直接在本地由程序控制發送消息通知用戶。因爲減小了服務器以及驗證設備的過程,因此本地推送其實就是一個簡單的通知服務。對象
本地推送能作什麼blog
GTD應用通常須要根據設定在規定時間通知用戶完成某個任務。GTD的事務在本地基本都有備份,也固然是經過本地來通知用戶什麼時候應用完成任務。在這裏,本地推送服務的做用就突顯出來了。遊戲
某些遊戲,好比升級建築裝備等,通常都須要時間去完成,玩家不可能在遊戲前一直等待。當升級結束,遊戲在本地把通知推送給玩家,玩家響應並再次進入遊戲,不只節約玩家的時間,也給遊戲的激活帶來更多的流量。事務
雖然本地推送不如在線推送的使用頻率那麼高,但仍是頗有用途的。資源
如何實現本地推送
添加通知
本地推送的實現很簡單,更多的是自定義的過程。來看看下面的代碼:
UILocalNotification *notification = [[UILocalNotification alloc] init]; // ARC環境 notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3]; // 推送時間 notification.timeZone = [NSTimeZone defaultTimeZone]; notification.repeatInterval = 0; // 推送間隔 notification.soundName = UILocalNotificationDefaultSoundName; // 推送聲音 notification.alertBody = @"Push Notification"; // 推送內容 notification.applicationIconBadgeNumber = 1; // 消息個數 notification.userInfo = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"]; [[UIApplication sharedApplication] scheduleLocalNotification:notification];
實例化一個`UILocalNotification`對象,並根據具體的要求設置這個對象的屬性。
`fireDate`表示推送的時間。`timeZone`是對應的時區。
`repeatInterval`表示推送的重複間隔,它的類型是`NSCalendarUnit`,能夠用這個枚舉值來賦值,表示天天、每週或每個月等。若是爲0則表示不重複推送。
`soundName`是推送的聲音,能夠寫上bundle資源裏已有的音樂文件名稱,這樣就能夠自定義推送的聲音了。
`alertBody`是推送的內容。
`applicationIconBadgeNumber`表示顯示在該應用圖標上的消息個數。在接受消息後須要把這個屬性重置。
`userInfo`能夠存放通知的相關信息。
最後,經過調用`scheduleLocalNotification`達到推送通知的目的。
接收通知
接收推送通知更加容易,在`AppDelegate`的`didReceiveLocalNotification`方法中就能夠接收了。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification { NSLog(@"Notification : %@", notification.alertBody); // 輸出推送信息 application.applicationIconBadgeNumber = 0; // 消息數置爲0 }
上面在`didReceiveLocalNotification`方法中打印出了推送消息的內容,並把消息數置爲0。固然也能夠經過判斷`notification`的具體信息顯示彈窗、修改消息數等。
取消通知
NSArray *array = [[UIApplication sharedApplication] scheduledLocalNotifications]; // 獲取本地推送數組 [[UIApplication sharedApplication] cancelLocalNotification:notification]; // 取消某個推送 [[UIApplication sharedApplication] cancelAllLocalNotifications]; // 取消全部推送
上面這段代碼展現了幾個API,但其中沒有必然的調用關係。
`scheduledLocalNotifications`能夠獲取本地的推送數組,其中的每一個成員都是UILocalNotification,能夠根據它們的userInfo區分推送的類型。
`cancelLocalNotification`能夠取消某個具體的推送通知。好比取消經過`scheduledLocalNotifications`獲取的某個通知。
`cancelAllLocalNotifications`則能夠一次性取消全部的通知。
本地推送會有哪些坑
iOS8
在iOS8以後,要使用本地推送都須要爲本地註冊通知類型,不然沒法接收到通知。具體的作法是在`AppDelegate`的`didFinishLaunchingWithOptions`中註冊。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]]; return YES; }
音樂
推送通知能夠自定義音樂,但並非全部音樂均可以調用。目前只支持30秒的音樂,由於推送最多隻能維持30秒。
聲音
若是手機置爲靜音,則音樂沒法播放。
若是在手機打開的時候顯示通知,也不會播放音樂,甚至也不會震動。
applicationIconBadgeNumber
若是是從通知欄點擊通知進入應用,會響應通知的回調,同時在回調中獎消息數置爲0。
而若是是在有消息的狀況下直接打開應用,並不會走通知回調的流程。
能夠根據須要接入這部分邏輯。
總結
本地通知的處理仍是比較簡單的。
鬧鐘的實現原理也是利用了本地通知,可是若是要考慮震動等問題,則會更加複雜。有須要再慢慢研究。