美文网首页iOS开发技巧
iOS10 Notification Service Exten

iOS10 Notification Service Exten

作者: Good_Citizen | 来源:发表于2019-12-12 11:08 被阅读0次

    从iOS10开始,苹果新增了Notification Service Extension功能,意在让我们开发者在通知到来之前对通知内容做一些自定义的操作

    新建一个target

    创建好后会生成两个文件NotificationService.h和NotificationService.m

    可以看到里面有个方法- (void)didReceiveNotificationRequest:(UNNotificationRequest*)request withContentHandler:(void(^)(UNNotificationContent*_Nonnull))contentHandler,而且在生成文件的同时已经在该方法中给出了提示// Modify the notification content here...

    所以我们要做的就是在这里拦截住推送过来的消息,并自定义,我这里使用的是个推,主要是获取推送过来的url来下载显示图片

    - (void)didReceiveNotificationRequest:(UNNotificationRequest*)request withContentHandler:(void(^)(UNNotificationContent*_Nonnull))contentHandler {

        /*

         断点调试:

         1、启动app

         2、Debug -> Attach to process by pID or name:输入你扩展工程的名字(PushExtension)。

         3、打断点,将app退出后台,发送推送即可来到这里进入断点

         注意:

            这里的NSLog是无效的,进入断点后使用lldb指令po来打印变量值

         **/

        self.contentHandler= contentHandler;

        self.bestAttemptContent= [request.contentmutableCopy];

        NSLog(@"----将APNs信息交由个推处理----");

    //参照个推官方文档

        [GeTuiExtSdk handelNotificationServiceRequest:request withAttachmentsComplete:^(NSArray *attachments, NSArray* errors) {

    //        获取推送过来的body,这里的格式自己和后台定,可以打断点查看json

            NSString*oriBody =self.bestAttemptContent.userInfo[@"aps"][@"alert"][@"body"];

    //        获取要截取的位置,push

            NSRangestartRange = [oriBodyrangeOfString:@"push_v2:"];

            //  是否存在push_v2(这个字段后后台定的,来判断要不要显示小图标)

            if(startRange.length==0) {

    如果获取不到这个字段,则按照之前的默认推送流程

                self.contentHandler(self.bestAttemptContent);

                return;

            }

    //        如果有图片url,则下载url并显示出来

            NSString*body = [oriBodysubstringToIndex:startRange.location-1];

            self.bestAttemptContent.body= body ;

    //        获取push_v2之后的json数据(图片所在的json)

            NSString*jsonStr = [oriBodysubstringFromIndex:startRange.location+ startRange.length];

    //        获取图片所在的json

            NSDictionary*dic = [selfdictionaryWithJsonString:jsonStr];

            NSString*url = dic[@"img_url"];

    //        不存在图片

            if(url ==nil) {

                self.contentHandler(self.bestAttemptContent);

                return;

            }

    //        下载图片

            [self loadAttachmentForUrlString:url completionHandler:^(UNNotificationAttachment *att) {

                if(att) {

                    self.bestAttemptContent.attachments= [NSArrayarrayWithObject:att];

                }

                self.contentHandler(self.bestAttemptContent);

            }];

        }];

    }

    下载实现

    - (void)loadAttachmentForUrlString:(NSString *)urlString

                     completionHandler:(void(^)(UNNotificationAttachment *))completionHandler {

        __blockUNNotificationAttachment *attachment =nil;

        __blockNSURL *attachmentURL = [NSURL URLWithString:urlString];

        NSString *fileExt = [@"."stringByAppendingString:[urlString pathExtension]];

        //下载附件

        _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

        NSURLSessionDownloadTask *task;

        task = [_session downloadTaskWithURL:attachmentURL

                           completionHandler: ^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) {

                               if(error !=nil) {

                                   NSLog(@"%@", error.localizedDescription);

                               }else{

                                   NSFileManager *fileManager = [NSFileManager defaultManager];

                                   NSURL *localURL = [NSURL fileURLWithPath:[temporaryFileLocation.path

                                                                             stringByAppendingString:fileExt]];

                                   [fileManager moveItemAtURL:temporaryFileLocation

                                                        toURL:localURL

                                                        error:&error];

                                   NSError *attachmentError =nil;

                                   NSString * uuidString = [[NSUUID UUID] UUIDString];

                                   //将附件信息进行打包

                                   attachment = [UNNotificationAttachment attachmentWithIdentifier:uuidString

                                                                                               URL:localURL

                                                                                           options:nil

                                                                                             error:&attachmentError];

                                   if(attachmentError) {

                                       NSLog(@"%@", attachmentError.localizedDescription);

                                   }

                               }

                               completionHandler(attachment);

                           }];

        [task resume];

    }

    至此就可以显示图标了,需要注意的是这里的代码导致奔溃不会影响到app正常运行,遇到奔溃相当于这里什么都没有做,按之前的默认流程走

         断点调试:

         1、启动app

         2、Debug -> Attach to process by pID or name:输入你扩展工程的名字(PushExtension)。

         3、打断点,将app退出后台,发送推送即可来到这里进入断点

         注意:

            这里的NSLog是无效的,进入断点后使用lldb指令po来打印变量值

    相关文章

      网友评论

        本文标题:iOS10 Notification Service Exten

        本文链接:https://www.haomeiwen.com/subject/ooddwctx.html