NSCalendar * calendar = [NSCalendar autoupdatingCurrentCalendar]; NSDateComponents * dateComponent = [NSDateComponents alloc] init]; [dateComponent setDay: item.day]; // item: self defined object [dateComponent setMonth: item.month]; [dateComponent setYear: item.year]; [dateComponent setHour: item.hour]; [dateComponent setMinute: item.minute]; NSDate * date = [calendar dateFromComponents: dateComponent]; UILocalNotification *localNotif = [[UILocalNotification alloc] init]; if (localNotif == nil) return; localNotif.fireDate = [date dateByAddingTimeIntervalInterval:-(minutesBefore*60)]; localNotif.timeZone = [NSTimeZone defaultTimeZone]; localNotif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"%@ in %i minutes.", nil), item.eventName, minutesBefore]; localNotif.alertAction = NSLocalizedString(@"View Details", nil); localNotif.alerttitle = NSLocalizedString(@"Item Due", nil); localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = 1; NSDictionary *infoDict = [NSDictionary dictionaryWithObject:item.eventName forKey:ToDoItemKey]; localNotif.userInfo = infoDict; [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
那麼要設定Push Notification要怎麼做?首先要用Apple的Push Notification機制(簡稱APN),自己的Server發出通知後會傳到Apple的Server,之後再從Apple傳給使用者的App:
我覺得這樣做的原因是要保持通知的完整性和安全性,假如說你傳送有惡意訊息的封包給使用者豈不是不好?而建立整個連線流程如下圖所示,裝置先和APN建立TLS(Transport Layer Security)連線,之後取得憑證後TLS就算建立完成:
而Provider也是同樣要建立TLS連線和取得憑證:
而當憑證建立完成後App和APN, Provider的互動就是靠Token來完成,App若要使用Push Notificaition必須先行註冊至APN(從使用者那邊獲取通知許可),然後APN再回傳加密過的Token給Provider,之後該Token再從Device回傳到Provider,如下圖所示:
而在傳送Push Notification時會連同Token,並藉由裝置ID來回傳加密的通知內容給裝置:
到這邊整個Push Notification就算完成,接下來就是在AppDelegate.m加上程式碼:
另外當收到了Notification後要做什麼事就先靠didReceiveRemoteNotification來完成,而handleActionWithIdentifier則是當使用者對Notification做出回應後你要採取什麼動作時,可用completionHandler的block來完成:// Remote notifications- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{NSLog(@"Receive deviceToken: %@", deviceToken);}- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{NSLog(@"Remote notification error: %@", error.localizedDescription);}
// When app is waked up, this method will be called- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{// with push notification from remote server// When app is running in the foreground, this method will be called}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler{// Test for identifier with a sample indentifierif ([identifier isEqualToString:@"ACCEPT_IDENTIFIER"]) {[self handleAcceptActionWithNotification:userInfo];}}
以上就是整個流程,至於說要註冊憑證的方法可參考這篇:popcorny的碎碎念
沒有留言:
張貼留言