推送注冊
-
iOS 8 以下推送注冊
UIRemoteNotificationType types = (UIRemoteNotificationType) (UIRemoteNotificationTypeAlert |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge); [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
-
iOS 8 、9 推送注冊
UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications];
-
iOS 10 以及以上推送注冊
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionCarPlay) completionHandler:^(BOOL granted, NSError *_Nullable error) { if (!error) { NSLog(@"request authorization succeeded!"); } }]; [[UIApplication sharedApplication] registerForRemoteNotifications];
注意:需要導入
<UserNotifications/UserNotifications.h>
頭文件,遵循 UNUserNotificationCenterDelegate 協議
Device Token 獲取
// 遠程通知注冊成功
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@", deviceToken);
}
// 遠程通知注冊失敗
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
device token :
APNs uses device tokens to identify each unique app and device combination. It also uses them to authenticate the routing of remote notifications sent to a device.
device token 是 APNs 用于區分識別每個 iOS 設備和設備上不同 app 的一個標識符,還可以用于 APNs 通過它將推送消息路由到指定設備上。
大意就是:device token 是唯一的,我們可以通過 device token,推送到指定設備指定 App 上。
接收通知
iOS 7 之前臺接收遠程通知,后臺點擊通知
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
}
iOS 7,8,9 前臺接收遠程通知,后臺點擊通知。這個回調比上面的多了一個參數completionHandler
,上面的回調也可以接收 iOS 7,8,9 的通知,但是當這兩個回調一起寫的時候,只執行下面這個。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
{
completionHandler(UIBackgroundFetchResultNewData);
}
iOS 10 推送回調
// iOS 10: App在前臺獲取到通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
{
NSLog(@"iOS10 前臺收到遠程通知:%@", notification.request.content.userInfo);
}
else
{
// 判斷為本地通知
NSLog(@"iOS10 前臺收到本地通知:%@", notification.request.content.userInfo);
}
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
// iOS 10: 點擊通知進入App時觸發
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(nonnull void (^)(void))completionHandler
{
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
{
NSLog(@"iOS10 點擊遠程通知:%@", response.notification.request.content.userInfo);
}
else
{
// 判斷為本地通知
NSLog(@"iOS10 點擊本地通知:%@", response.notification.request.content.userInfo);
}
completionHandler();
}
靜默推送
Silent Notification
The aps dictionary can also contain the content-available property. The content-available property with a value of 1 lets the remote notification act as a silent notification. When a silent notification arrives, iOS wakes up your app in the background so that you can get new data from your server or do background information processing. Users aren’t told about the new or changed information that results from a silent notification, but they can find out about it the next time they open your app.
For a silent notification, take care to ensure there is no alert, sound, or badge payload in the aps dictionary. If you don’t follow this guidance, the incorrectly-configured notification might be throttled and not delivered to the app in the background, and instead of being silent is displayed to the user.
靜默推送:顧名思義,就是安靜的推送,用戶安全感知不到。
{
"aps": {
"content-available": 1
}
}
靜默推送的 content-available 一定要為 1,不然蘋果感知不到這是一條靜默的推送,蘋果的建議是take care to ensure there is no alert, sound, or badge payload in the aps dictionary.
,不要將 alert 、sound、badge 放在 payload 中。
舉個例子:
{
"aps": {
"content-available": 1,
"alert": "推送",
"badge": 1,
"sound": "default",
}
}
如果你這樣設置靜默推送的 payload,也沒有錯,但是這個就跟普通的通知沒有區別了,還是會打擾到用戶,就違背了蘋果設計靜默推送的的初衷。
靜默推送可以喚醒應用在后臺被系統殺死的情況,但是不能喚醒用戶手動殺死的情況。
靜默推送是在 iOS 7 之后推出的一種推送方式。它與其他推送的區別在于允許應用收到通知后在后臺(background)狀態下運行一段代碼,可用于從服務器獲取內容更新。功能使用場景:(多媒體)聊天,Email更新,基于通知的訂閱內容同步等功能,提升了終端用戶的體驗。
靜默通知在前臺和后臺都是調用 application: didReceiveRemoteNotification: fetchCompletionHandler
回調。