[iOS ]iOS开发之推送扩展服务

iOS10之后的通知具有通知扩展功能,可以在系统受到通知、展示通知时做一些事情。

UNNotificationServiceExtension:通知服务扩展,是在收到通知后,展示通知前,做一些事情的。

1. 创建一个UNNotificationServiceExtension
image.png

如图创建完可以看到工程中多出一个文件


image.png

在NotificationService.m文件中,有两个自动生成的方法:

// 系统接到通知后,有最多30秒在这里重写通知内容(在此方法可进行一些网络请求,如上报是否收到通知等操作)
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler;
// 处理过程超时,则收到的通知直接展示出来
- (void)serviceExtensionTimeWillExpire;

示例代码:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    NSLog(@"收到推送消息,可进行处理");
//      这里重写一些东西
    self.bestAttemptContent.title = @"这里是标题";    
    self.bestAttemptContent.subtitle = @"这里是子标题";
    self.bestAttemptContent.body = @"这里是body";
    self.contentHandler(self.bestAttemptContent);
}

效果图:


image.png
  • 如果,你按照教程给自己的app设置好 Notification Service Extension,但是你的扩展程序没有执行。有可能是远程通知的格式问题。
    远程推送消息的格式,如下。
{
  "aps":{
        "category":"SECRET",
        "mutable-content": 1,
        "alert":{
           "title":"Secret Message!",
           "body":"(Encrypted)"
         },
    }
}

其中 mutable-content字段不能没有,没有的话,就不会走扩展程序的代码;
其中alert字段的值不能没有,没有的话,就不会走扩展程序的代码。

  • 最重要最容易忽略的一点,必须要设置target的 Deployment Target


    image.png

UNNotificationContentExtension:通知内容扩展,是在展示通知时展示一个自定义的用户界面

1. 创建一个UNNotificationContentExtension
image.png

如图创建完可以看到工程中多出一个文件


image.png

设置Info.plist


image.png

使用的时候,我们参照如下代码:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    NSLog(@"收到推送消息,可进行处理");
//      这里重写一些东西
        self.bestAttemptContent.title = @"这里是标题";
        self.bestAttemptContent.subtitle = @"这里是子标题";
        self.bestAttemptContent.body = @"这里是body";
    // !!!!! 这里是重点!!!!!!!!!!!!
    // 我在这里写死了myNotificationCategory,其实在收到系统推送时,每一个推送内容最好带上一个catagory,跟服务器约定好了,这样方便我们根据categoryIdentifier来自定义不同类型的视图,以及action
    //myNotificationCategory这个值要跟info.plist里面的值一样
    self.bestAttemptContent.categoryIdentifier = @"myNotificationCategory";
    self.contentHandler(self.bestAttemptContent);
}

这里为了方便,我在ContentExtension文件夹下直接更改MainInterface.storyboard文件实现自定义界面


image.png

运行效果图


image.png

附:以上两个项目运行要记得选择项目,否则是无效的。
如图:


image.png

image.png

你可能感兴趣的:([iOS ]iOS开发之推送扩展服务)