本地推送服務 UILocalNotification

前言數組

 

以前接觸過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。

而若是是在有消息的狀況下直接打開應用,並不會走通知回調的流程。

能夠根據須要接入這部分邏輯。

 

總結

 

本地通知的處理仍是比較簡單的。

鬧鐘的實現原理也是利用了本地通知,可是若是要考慮震動等問題,則會更加複雜。有須要再慢慢研究。

相關文章
相關標籤/搜索