iOS通知相关

远程推送

1、使用之前需要确定应用是否打开了通知功能。在项目Targert -> Capabilities -> Push Ntifications中打开通知功能。对应的开发者证书也要勾线推送权限。

  • 如果未开启该功能,在获取deviceToken的时候不会执行下面方法,会执行对应的error方法
didRegisterForRemoteNotificationsWithDeviceToken

didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 

2、使用远程通知需要区分iOS10和iOS10之前的设备,iOS10使用了全新的通知API,UserNotifications,如下所示:

/// iOS之后
if (@available(iOS 10.0, *)) {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            NSLog(@"error = %@",error);
            if (error == nil) {
                
            } else {
                NSLog(@"error = %@",error);
            }
        }];
    } else {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];


    }
    [UIApplication.sharedApplication registerForRemoteNotifications];

3、对于通知的处理方法也不同

/// ===== iOS10之前
// 应用内收到推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    
}

// 后台收到推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    
}

/// iOS10之后
// 应用内收到推送
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler  API_AVAILABLE(ios(10.0)){
    
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}

// 后台收到推送
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler  API_AVAILABLE(ios(10.0)){
    
    completionHandler();
}

本地推送

本地推送也分为iOS10之前和之后,iOS10退出了全新的推送API,合并了本地推送和远程推送。
1、注册通知

if (@available(iOS 10.0, *)) {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            NSLog(@"error = %@",error);
            if (error == nil) {
                
            } else {
                NSLog(@"error = %@",error);
            }
        }];
    } else {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];

    }
    
    // 注册远程推送,获取deviceToken
    [UIApplication.sharedApplication registerForRemoteNotifications];

2、处理通知

// iOS10之前
// 应用开启
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
   
}

iOS10之后
/// iOS10之后
// 应用内收到推送
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler  API_AVAILABLE(ios(10.0)){
    
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}

// 后台收到推送
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler  API_AVAILABLE(ios(10.0)){
    
    completionHandler();
}

iOS10之后的通知类型可以通过下面的方式判断

UNNotificationTrigger *trigger = response.notification.request.trigger;
    // 远程通知
    if ([trigger isKindOfClass:UNPushNotificationTrigger.class]) {
        
    } else {
        
    }

iOS 10中,Apple将本地Push和远程Push合二为一,使用UNNotificationTrigger类来区分,所有的Push类型都是该类型的子类;
- UNPushNotificationTrigger:远程Push;
- UNTimeIntervalNotificationTrigger:本地Push,可以设置timeInterval、repeats;
- UNCalendarNotificationTrigger:本地Push,可以设置dateComponents;
- UNLocationNotificationTrigger:本地Push,基于地理位置;

push推送格式

{
  "aps" : {
    "alert" : {
      "title" : "Title",
      "body" : "Your message here." },
    "sound" : "default",
    "badge" : 9
  }
}

参考:
1、https://juejin.im/post/5d26ce1f6fb9a07ef44430d2
2、https://www.jianshu.com/p/caf5086cda19
3、https://www.justisit.com/15147921816625.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 传智播客 课件整理 推送通知 注意:这里说的推送通知跟NSNotification有所区别 1.NSNotific...
    iOS_愛OS阅读 3,196评论 2 21
  • 通知https://www.jianshu.com/p/0209668d33db NSNotification引起...
    iOS_愛OS阅读 236评论 0 2
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,604评论 0 12
  • 没有了化情感为动力的推动,我似乎完全不能坚持去学习那些难的东西。我很痛苦。 好想完全凭自己的兴趣简简单单生活,可是...
    Evelynini阅读 169评论 0 0
  • 本文参加#乡忆·乡思·乡情·乡恋#活动,本人承诺,文章内容为原创,且未在其他平台发表过。 进入大学...