iOS10推送必看UNNotificationServiceEx

作者: 徐不同 | 来源:发表于2016-09-27 18:12 被阅读10011次

    更新晚啦,我要先跟大家说声抱歉哈~

    如果大家还没有看我的这两篇文章,建议还是先阅读一下,循序渐进么~文章链接如下:
    iOS开发 iOS10推送必看(基础篇)
    iOS开发 iOS10推送必看(高阶1)
    这次的最后,终于有demo咯~

    在这篇文章,我会给大家讲一讲更高级一点的,定制化更高的远程通知。其中会补充我之前没讲的远程推送(多媒体)通知,以及UNNotificationServiceExtension,UNNotificationContentExtension,UNNotificationAction的相关类。相信大家看了这篇文章,虽不能说对苹果的远程推送了如指掌,但是也可以做一些基本的扩展咯~

    1、UNNotificationServiceExtension

    1.1、UNNotificationServiceExtension简介

    UNNotificationServiceExtension是iOS10推出后的一个新特性,先看这张图:


    Extension01.png-50.1kBExtension01.png-50.1kB

    从这张图上,我们可以看到,原先直接从APNs推送到用户手机的消息,中间添加了ServiceExtension处理的一个步骤(当然你也可以不处理),通过这个ServiceExtension,我们可以把即将给用户展示的通知内容,做各种自定义的处理,最终,给用户呈现一个更为丰富的通知,当然,如果网络不好,或者附件过大,可能在给定的时间内,我们没能将通知重新编辑,那么,则会显示发过来的原版通知内容。

    那么ServiceExtension可以做什么呢?它的意义是什么呢?我总结了几点:

    • 1、 安全
      安全总是摆在第一位的,从iOS9开始,苹果鼓励我们使用更为安全的https协议可以看的出来,苹果公司是对安全很重视的一家公司,为什么在这里我会提到安全呢?是因为之前我们的推送内容,不管是通过第三方,还是通过苹果自带的通知处理,如果让有心人对数据做一次拦截,抓个包啥的,我们推送的内容就会完全暴露,当然有的同学说,我可以加密啊~但是不知道大家有没有想过,如果数据加密,那通知栏会怎么展示呢?(你千万别跟我说你把所有的远程推送变成本地通知。。)通过此次这次增加的UNNotificationServiceExtension的类,便可以更好的帮助我们实现数据的加密。
      它的原理便是在收到通知后的最多30s内,你可以把你的通知内容,解密后,在重新展示在用户的通知拦上。

    • 2、 内容的丰富
      之前的通知展示内容比较少,以至于被各种广告提醒占据了。这次苹果新添加的附件通知,结合上通知拓展类,便可以给用户展现出一个有着丰富内容的通知。比如,一个小短片的某一秒的画面啊(这里要强烈鄙视各大平台的某些电影预览图),又或者是配上一些小图片啊(通过服务器传来的imaUrl)等方式来吸引用户,诱导用户点开你的通知,促使用户会使用你的App。其实推送这个功能,虽然有的人会关闭,但是大部分的人还是开启的,所以说推送这个市场还是很大的哟~灵活利用推送,会让你的程序拥有无限的可能。

    1.2、如何新建一个UNNotificationServiceExtension

    首先,我们不能通过创建UNNotificationServiceExtension的类来使用服务扩展,我们应当创建一个Target,这个Target自带一个模板,其中有2个方法是系统会自己调用的,如下:

    //  你需要通过重写这个方法,来重写你的通知内容,也可以在这里下载附件内容
    - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler;
    
    //  如果处理时间太长,等不及处理了,就会把收到的apns直接展示出来
    - (void)serviceExtensionTimeWillExpire;
    

    开始跟着我创建一个UNNotificationServiceExtension吧。

    新建Target

    QQ20160927-3.png-160.3kBQQ20160927-3.png-160.3kB
    选择如图所示:
    QQ20160927-4.png-115.2kBQQ20160927-4.png-115.2kB
    然后写名字,下一步,即可
    此时我们的目录结构里面,已经多出了一个文件夹了。
    QQ20160927-5.png-11.5kBQQ20160927-5.png-11.5kB
    QQ20160927-6.png-11.7kBQQ20160927-6.png-11.7kB
    都多了一个myTest。
    22172ED.png-33kB22172ED.png-33kB
    注意看上图,这里的bundleID是你的工程名字的bundleID加上.名称。
    不要修改,系统创建的时候就创建好了,不过我还是给大家说一下这个格式
    如果你的工程的BundleID是coderxu.pushDemo,则这个扩展的BundleID就是coderxu.pushDemo.mytest,最后的后缀,是看咱们创建服务扩展时候的名字。其他的小细节,大家可以看看。
    到这一步,我们就新建了一个服务通知类的扩展。

    1.3、如何使用以及相关Demo

    在使用这个类的时候,我重写了以下代码,大家可以先看下:
    (1). 这是处理通知内容重写的方法:

    - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
        self.contentHandler = contentHandler;
        // copy发来的通知,开始做一些处理
        self.bestAttemptContent = [request.content mutableCopy];
        // Modify the notification content here...
        self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
        
        // 重写一些东西
        self.bestAttemptContent.title = @"我是标题";
        self.bestAttemptContent.subtitle = @"我是子标题";
        self.bestAttemptContent.body = @"来自徐不同";
        
        // 附件
        NSDictionary *dict =  self.bestAttemptContent.userInfo;
        NSDictionary *notiDict = dict[@"aps"];
        NSString *imgUrl = [NSString stringWithFormat:@"%@",notiDict[@"imageAbsoluteString"]];
       
        if (!imgUrl.length) {
            self.contentHandler(self.bestAttemptContent);
        }
    
        [self loadAttachmentForUrlString:imgUrl withType:@"png" completionHandle:^(UNNotificationAttachment *attach) {
            
            if (attach) {
                self.bestAttemptContent.attachments = [NSArray arrayWithObject:attach];
            }
            self.contentHandler(self.bestAttemptContent);
    
        }];
    }
    
    

    (2). 这是下载附件通知的方法:

     - (void)loadAttachmentForUrlString:(NSString *)urlStr
                              withType:(NSString *)type
                     completionHandle:(void(^)(UNNotificationAttachment *attach))completionHandler{
        __block UNNotificationAttachment *attachment = nil;
        NSURL *attachmentURL = [NSURL URLWithString:urlStr];
        NSString *fileExt = [self fileExtensionForMediaType:type];
        
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        [[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;
                            attachment = [UNNotificationAttachment attachmentWithIdentifier:@"" URL:localURL options:nil error:&attachmentError];
                            if (attachmentError) {
                                NSLog(@"%@", attachmentError.localizedDescription);
                            }
                        }
                         completionHandler(attachment);
                   }] resume];
        
    }
    

    (3)判断文件类型的方法

    - (NSString *)fileExtensionForMediaType:(NSString *)type {
        NSString *ext = type;
        if ([type isEqualToString:@"image"]) {
            ext = @"jpg";
        }
        if ([type isEqualToString:@"video"]) {
            ext = @"mp4";
        }
        if ([type isEqualToString:@"audio"]) {
            ext = @"mp3";
        }
        return [@"." stringByAppendingString:ext];
    }
    

    第一段代码主要讲通知内容的重组,逻辑就是有附件的url,我就下载,如果没有url我就直接展示通知。
    第二段代码主要讲的是,用系统自带类,下载图,存图,找到filePath,创建通知的附件内容。(创建附件的url,必须是一个文件路径,也就是说,必须下载下,才能获取文件路径,开头是file://)
    第三段的代码主要讲判断文件的后缀类型,然后前端好处理。这里我的代码是写死了,因为我就测试一张图。最好的方式是服务器返回的 推送内容中,带有附件的类型。我的iOS开发 iOS10推送必看(高阶1)一文中,有讲多媒体附件的类型,以及相关的大小限制。

    这里强烈建议,处理推送内容的时候,让服务器带上文件类型。重要的事情说三遍
    这里强烈建议,处理推送内容的时候,让服务器带上文件类型。重要的事情说三遍
    这里强烈建议,处理推送内容的时候,让服务器带上文件类型。重要的事情说三遍

    在补充一些问题

    • 1.在这个推送服务的扩展类中,为什么我使用了系统自带类下载,没有使用AFN?
      答:不知道为什么,导入AFN后总是出现各种编译报错啊。主要涉及这几个情况
      1.用cocoapods导入AFN,在类引入AFN,编译报错!!
      2.手动拖拽AFN进工程(不勾选),在类引入AFN,编译报错!!
      3.手动拖拽AFN进工程(勾选),直接编译报错!!
      4.下载用通知回调的方式(慢,线程不确定)
      最后我就选择这个block回调,系统类下载的方式,来下载通知中的附件。

    以下是一些错误的截图:(可以不看)


    QQ20160927-0.png-100.9kBQQ20160927-0.png-100.9kB
    QQ20160927-1.png-21.6kBQQ20160927-1.png-21.6kB
    QQ20160927-2.png-228.5kBQQ20160927-2.png-228.5kB
    • 2.如果调试这个通知扩展类,为什么我跑程序的时候,打断点无反应?
      答:这是因为你跑的target不对,正确的做法是,跑正确的target,具体如下图:
      QQ20160927-7.png-32.8kBQQ20160927-7.png-32.8kB

    选择你的程序Target

    QQ20160927-8.png-49kBQQ20160927-8.png-49kB

    这个时候,大家在打断点,就可以啦~

    最后,在附上推送的内容格式。
    推送内容格式如下:

    {
        "aps": {
            "alert": "This is some fancy message.",
            "badge": 1,
            "sound": "default",
            "mutable-content": "1",
            "imageAbsoluteString": "http://upload.univs.cn/2012/0104/1325645511371.jpg"
            
        }
    }
    

    这里我们要注意一定要有"mutable-content": "1",以及一定要有Alert的字段,否则可能会拦截通知失败。(苹果文档说的)。除此之外,我们还可以添加自定义字段,比如,图片地址,图片类型,大家慢慢摸索下吧有问题可以留言哟

    这一章的最后,附上成功推送的展示图:


    QQ20160927-9.png-383.5kBQQ20160927-9.png-383.5kB

    稍后补充以下内容~

    # 2、UNNotificationContentExtension
    ## 2.1、UNNotificationContentExtension简介
    ## 2.2、如何新建一个UNNotificationContentExtension
    ## 2.3、如何使用以及相关Demo
    # 3、UNNotificationAction
    ## 3.1、UNNotificationAction简介
    ## 3.2、如何新建一个UNNotificationAction
    ## 3.3、如何使用以及相关Demo
    

    如果你喜欢我的文章,不要忘记关注我,谢谢大家了~
    另外如果你要转载,希望可以注明出处,我会写出更多更好的文章,来回馈大家~

    重要的事情说三遍,demo地址
    重要的事情说三遍,demo地址
    重要的事情说三遍,demo地址

    相关文章

      网友评论

      • LibraCoder:请教作者一个问题,我这边长按通知(3DTouch)之后弹出大的通知内容弹框时,图片正常显示,但是文字部分会有一个滚动显示的效果,不知道是什么原因
      • whereandhere:你好,我想问下带这个扩展的怎么打包啊,打包到App Store的时候,UNNotificationContentExtension 选择automatically 只能出来developer证书,打包失败
      • DreamTracer:断点不走是为啥呢?
        306a480fd470:现在你的走了吗,我按照文章里面的设置,真的死活不走
      • Janek_m:UNMutableNotificationContent 通知扩展类---后台运行在iOS10 系统没报, iOS11 系统没有问题,跟支付宝语音到账的一样的,大神知道原理波

        // 创建语音合成器
        AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
        AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:self.bestAttemptContent.body];
        utterance.rate = 0.53;// 语速
        utterance.pitchMultiplier = 1.1;//音调 0.5(底音调)~2.0(高音调)之间
        utterance.volume = 1.0;//声音大小, 0.0 ~ 1.0 之间
        utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
        utterance.rate = AVSpeechUtteranceDefaultSpeechRate;
        [synthesizer speakUtterance:utterance];
      • ShiyongTan:问一下, 我使用的极光的第三方推送, 为什么调试的的时候, 只是走了极光的相关的协议方法, 创建的UNNotificationServiceExtension为什么就没有走呢?
      • 风吹柳絮如花落:我这儿收到push时,直接打印Program ended with exit code: 0 ,不走断点,也没有走里面的代码,流程都没问题,这是为什么???急
        风吹柳絮如花落:aps = {
        alert = 12312312;
        badge = 1;
        "content-available" = 1;
        "mutable-content" = 1;
        sound = "push.wav";
        };
      • 风吹柳絮如花落:使用了notificationService 扩展 的APP发布到AppStore,iOS 10以下的手机能否安装?
      • TheRainMan:收到推送aps = {
        alert = "This is some fancy message.";
        badge = 1;
        imageAbsoluteString = "http://upload.univs.cn/2012/0104/1325645511371.jpg";;
        "mutable-content" = 1;
        sound = default;
        };
        }
        但是不显示图片,什么原因,用的你demo运行的
      • zziazm:您好,我把shceme设置成mytest了,但是发了推送后NotificationService里的断点还是不走,控制台里提示Program ended with exit code: 0,是什么情况
        306a480fd470:现在你的走了吗,我按照文章里面的设置,真的死活不走
      • 宋进锋:我的 在拓展文件里加了断点,但是走不进去,知道什么原因吗
      • zl_xust:关于那个使用afnet 和sdweb 下载图片报错,猜测是不是cocopods 导入的时候target没有包括NotificationServiceExtension的target,猜测,没有试验过
      • 迷路卜:请教一下,像UINavigationServerExtension的证书应该怎么选呢,证书是主工程的bundleid申请的,extension的bundleid又不能跟主工程的bundleid一致,会报错,不能编译通过
        sock:..我也不知道要怎么配置 老哥弄好了吗?
      • e0e2e85955d9:按照配置添加了,但是自己的app没有走UNNotificationServiceExtension,很奇怪,你的demo可以走,但UNNotificationContentExtension没有重新绘制UI。。。。总是比较奇怪啊
        Superman168:是的,上午我也测试了,死活都不走这个地方,极光的倒都走
        e0e2e85955d9:@农夫三全 :sweat:应该进不去,不知道怎么整:sweat:
        农夫三全:您现在UNNotificationServiceExtension里面的方法执行了吗?我始终进不去里面的方法请问是什么原因?
      • 阿兹尔:右边的小iocn 显示不出来
      • 小包包包:楼主,断点不走,怎么破,跟你的截图是一样的
        306a480fd470:现在你的走了吗,我按照文章里面的设置,真的死活不走
      • Haha_kd:请问怎么上架?NotificationService需要描述文件吗? 那就是要新增Appids是吗?测试的时候是勾选了自动管理的,没问题,那发布呢?
      • 83cc6d590693:请问iOS10远程推送过来的音频和视频 播放的时候声音特别小 但是插上耳机是正常的 这种问题哪位大神遇到过 求解决办法 求求
      • oceanfive:楼主,问个问题,运行在NotificationService.h的target下,我使用的是极光推送,如果不勾选mutable-content 是可以收到推送的,但是勾选之后就无法收到推送的,这是什么情况?
      • 2d899c5242bd:推送的东西本来就是要暴露出来的呀,为什么还怕被抓包?关于安全性能解释一下这个疑问吗?
      • zym_:如果我想在extension里获取app内存的本地数据,有什么办法么? 两个target本地存的数据不互通
      • 北暖37:根据文章的截图,在新增的通知扩展类添加断点,选择了app,但是断点方法还是没有走到,时还需要配置什么吗
      • LoveY34:关于角标的显示,楼主是怎么处理的?自己做角标的加减吗?还是什么别的办法?
      • 叫我龙哥:我在 创建service之后 service就一直报错,
        1、NotificationService has conflicting provisioning settings. NotificationService is automatically signed, but provisioning profile 8775c99b-8330-4c3f-912f-a0f2e151338b has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the project editor.
        2、Code signing is required for product type 'App Extension' in SDK 'iOS 10.3'
        什么原因 ,content的就不报错
        叫我龙哥:而且设置的都是automatic
      • 怎么老是ni:楼主 我这边看了你写的东西 确实在iOS 10
        APP被杀死的情况下接收到了推送 并播报了 alert里面的内容
        在兼容iOS 10之前的系统时 和后台规定了 sound 的声音
        出现了同时播放sound并播报了 alert里面的内容的情况
      • 飛骧:你好,使用UNNotificationServiceExtension,APP打包的话应该选择哪个targets?谢谢
        306a480fd470:我也想问一下,楼主能说一下吗
      • 茄子_Apple:Provisioning profile "Development H0716" has app ID "cn.skedu.com.SKRadio", which does not match the bundle ID "cn.skedu.com.SKRadio.NotificationService".
        Provisioning profile "Development H0716" doesn't match the entitlements file's value for the application-identifier entitlement.
        Code signing is required for product type 'App Extension' in SDK 'iOS 10.3'

        为么编译一直报这个错?boundle ID需要怎么整?麻烦请问一下
      • 曾經蠟筆沒有小新:集成了极光推送,添加了target 什么都正确,但是就是拦截不到推送啊,求助
        曾經蠟筆沒有小新:@小包包包 选择模拟器真机,项目选择你创建好的ServiceExtension,然后json中要带有mutable-content,或者极光推送可选中勾选mutable-content
        小包包包:你找到原因了吗?我也不走断点,拦截不到
      • Mr_木乃伊:迷茫了,在这个NotificationService类中,写的
        self.bestAttemptContent.title = @"我是标题";
        self.bestAttemptContent.subtitle = @"我是子标题";
        self.bestAttemptContent.body = @"我是body";

        这些方法并不执行,通知显示的依旧是我原始填写的内容,仿佛没有添加NotificationService一样,请问你觉得会是哪里出了问题呢?
        农夫三全:@Mr_木乃伊 请问您那个是什么原因呢?我也是始终不执行serviceExtension里面的方法?
        Mr_木乃伊:楼主不用回复了,我已经找到原因了
        Mr_木乃伊:补充描述一下,demo中的通知,发送
        {
        "aps": {
        "alert": "This is some fancy message.",
        "badge": 1,
        "sound": "default",
        "mutable-content": "1",
        "imageAbsoluteString": "http://upload.univs.cn/2012/0104/1325645511371.jpg"

        }
        }
        图片不显示。只是修改了demo的bundle identifier为我自己的bundle identifier,其他没有修改
      • 清晨日暮:请问远程push是必须先实现service Extension 然后把图片下载到本地 然后在初始化一个attachment才能加载右边的那个小图片么?
        徐不同:@清晨日暮 既然你都做了测试,那么结果也很明显了呗,你的是对滴,但是具体兼容到哪个版本,只需要看你们单位最低适配哪个版本的程序即可。不用过多纠结~真的
        清晨日暮:@徐不同 谢谢您的解答。我还有一个疑问,之前看喵神的博客,说新的payload只兼容到iOS8.2,但是我试了下新版payload:
        "aps":{ "alert":{ "title":"I am title", "subtitle":"I am subtitle", "body":"I am body" }, "sound":"default", "badge":1 } }
        在iOS7.0 iOS8.1.3上同样也接收到了通知,请问是苹果做了兼容性调整了吗? 新版的payload现在能向前兼容到哪个版本呢?
        徐不同:@清晨日暮 创建附件的方法是attachmentWithIdentifier:URL:options:error:。在使用时,必须指定使用文件附件的内容,并且文件格式必须是支持的类型之一。创建附件后,将其分配给内容对象的附件属性。 (对于远程通知,您必须从您的服务扩展做到这一点。)所以说,你说的对~
        :blush:
      • 824a1a269b60:处理通知内容重写的方法中,在Block中调用self这样不会造成循环引用吗
      • 青空逸隐:问下楼主,我测试的demo只加了UNNotificationServiceExtension扩展,并在扩展里面加了NSLog打印, 可以收到推送信息,但是为什么扩展里面没有打印出来呢? 项目与扩展之间如何关联起来的呢?
        徐不同:@書冩傳奇 扩展,是需要跟操作来的,比如你收到推送,然后把推送内容往下滑,就会走的扩展咯。。:smile:
      • 简书12138:大神 我运行你的demo为什么关闭程序 第二次启动 扩展内容是空白呢
        简书12138:我的是iphone7 plus 会出现这个问题 iphone6s 就没这个问题 好揪心 找不到原因
        徐不同:@简书12138 具体不详。。。
      • LXChen:请问楼主,我把收到的推送都存在本地,通过UNNotificationServiceExtension这个来处理如果没点击推送而是直接点击图标进入app拿不到推送的问题,但是在这个类里没办法使用自己创建的类,我应该怎么解决呢,还有我想通过这个来显示角标,但是这个类里不能设置角标,我应该把角标这个写在哪啊:dizzy_face:
      • 28da9f8f6efe:你好楼主,我需要需要实现一个功能,每天定时推送网络下载的图片(图片的url是根据日期拼接而成的),把下载的图片作为attachement展示,那么是不是必须有服务端配合,才能启用NotificationServiceExtension?
        徐不同:@YinTokey 除了服务端,你还要保证用户都用10以上的系统了。。。:sweat_smile:
      • 蝈蝈超:你好,我用公司给我的证书和描述文件调试推送是没问题的,我看了你的文章开始创建UNNotificationServiceExtension这个但是运行不了,ServiceExtension has conflicting provisioning settings. ServiceExtension is automatically signed, but provisioning profile xxx has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the project editor 我创建后直接运行报这个错,然后我怎么改都运行不了,求助
        yleson:@徐不同 把自动管理打开了还是有错 请问应该怎么做?之前项目target是手动设置的现在开了自动管理马上就好了, 但是推送的target还是不行。求大神谢谢
        蝈蝈超:@徐不同 我只有证书和描述文件没有账号啊,自动管理没用…… :cold_sweat:
        徐不同:@蝈蝈超 这个简单,把自动管理证书开开,既可以。
      • 帅气的华子:你好,请教一个问题:
        Service Extension的Bundle Identifier需要在Main Target的命名空间下,比如说Main Target的BundleID为io.jpush.xxx,那么Service Extension的BundleID应该类似与io.jpush.xxx.yyy这样的格式。如果不这么做,你可能会遇到一个错误。
        意思是说我在开发者中心注册了一个 io.jpush.xxx的id,我还需要注册一个io.jpush.xxx.yyy的id才行么,就是说其实项目里面用到了两个id么,谢谢。
        徐不同:@帅气的华子 不是2个id,创建之后,自动生成的哟:smile:
      • 宁小盒:楼主,我仿照你做的service extension,但是始终无法截获远程通知,有哪些地方是必须要注意的?我已经在推送的内容上按照你说的做了,程序配置上呢?
      • f6807b908a23:您好 我想问一下 我创建Service Extension的时候会报这个错误The following binaries use incompatible versions of Swift这是为什么呢 我用的是 Xcode8.0 Swift2.3
      • Anyeler:楼主,有遇到过不对iOS 10做兼容也能收到推送的情况么?项目本身是iOS8.0
      • EchoZuo:UNNotificationServiceExtension 这个拓展只能是在远程推送的时候用用的到对吧?而且也只能是在通过服务器远程推送才能测试对吧?如果采用UNTimeIntervalNotificationTrigger类型添加一张本地图片,本地通知的话,是不会走NotificationService中的- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
        self.contentHandler = contentHandler;方法的对吧??
      • butterflyer:博主,你重写的方法什么时候才会走。
        翻滚的炒勺2013:@徐不同 现在我的还是不走
        徐不同:@butterflyer 如果是内容扩展,你要保证收到通知后,设置通知的catagory等
      • 3cbbe7c6c1ce:添加扩展后, bundleID是像coderxu.github.io,扩展的bundle id必须是coderxu.github.io.xxxx 这样添加的后缀,为嘛还是真机调试不行,说是描述文件里app ID和bundleID不匹配
        butterflyer:你好。关于这个demo。NotificationService这里面重写的方法,什么时候才会调用。为什么我按照博主说的弄了还是无法断电调试
        3cbbe7c6c1ce:@徐不同 修改了你的工程还是报一样的错误,截图怎么发给你
        徐不同:@thsmile 你可以修改我工程的bundleid,或者错误能不能截图给我耶。。:joy::joy:
      • ouis:AFNetworking编译报错的话,在你的工程TARGETS-mytest-Build Phases中的complie sources添加引用应该可以解决
      • Anyeler:能兼容iOS8麽?
        zBk9cN:@Anyeler 我也想知道
      • 谈Xx:iOS 10有了新的 权限申请接口后,是否一定要使用新接口才会有效呢
        徐不同:@谈Xx 对的,但是如果你想使用新的附件通知,新的内容扩展,必须用10特有的方法吧。。 :smile:
        谈Xx:@谈Xx 我看了基础篇的代码。 分三种, 10 8-10 8以下。 测试了下, 不用10 用8-10也是可以申请的吧
        徐不同:@谈Xx 对系统为10的手机来说是的
      • 12a742eed15b:我新增 Extension 后直接 build 会出现底下错误,有人有遇到吗??

        error: Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target's code sign settings match the parent app's.

        Embedded Binary Signing Certificate: - (Ad Hoc Code Signed)
        Parent App Signing Certificate: iPhone Developer:
        翻滚的炒勺2013:@12a742eed15b 你怎么解决的
        12a742eed15b:没事儿了,我 build 过了
        12a742eed15b:实机才会这样,模拟器不会
      • Bc_wh1te_Le1:每天都上来看 求楼主更新UNNotificationContentExtension文章 现在卡在这里好久了 看着这篇文章又一天前发表 变成16天前发表 还没出下一篇。 :sob:
        徐不同:@Bc_wh1te_Le1 已经更新,您可以看下了,今晚或者明天出action。么么哒
        徐不同:@Bc_wh1te_Le1 啊,抱歉啊,我稍后就更新啦
      • zBk9cN:UNNotificationServiceExtension与iOS10以下的系统兼容是怎么样的?
      • 消逝彼得:你好,推送的图片大小应该是有一个限制的,您知道是多大吗
        翻滚的炒勺2013:@徐不同 大神在吗
        Xfcmy:图片的尺寸会自动适应屏幕,文件的大小是5M
        徐不同:@消逝彼得 尺寸不详。:joy::joy:
      • 机智的猪:我觉得需要接着写完整我才会用这个extension 现在还是懵逼的
        zBk9cN:@翻滚的炒勺2016 都上线了
        翻滚的炒勺2013:@唐僧之妈 你写出来了吗
        zBk9cN:@机智的猪 那里不明白
      • 机智的猪:6666666666终于等到了
      • 小艾的简书:iOS 10 友盟推送还要重新生成新的证书吗 我看官网说的要生成4个描述文件
        zBk9cN:@小艾的简书 跟友盟没关系
      • 范特西V:多谢这么详细的总结!根据你的几篇教程,做了iOS10的推送的适配,并用development模式测试,能正常获取到DeviceToken,也能正常收到推送信息。。就是指定了 'sound' => 'push.caf',在iOS9收到推送能播放自定义的声音,但是在iOS10里就不起作用了,仍然是播放系统推送声音,不知你在测试的时候,有无在iOS10里遇到这个问题。
        徐不同:@范特西V 可以,没有问题。
        范特西V:@徐不同 你这边iOS10下用自定义推送声音的话,可以正常播放吗?
        徐不同:@范特西V :smile:稍等我测试下
      • 看看外面的世界:demo 怎么才能在自己的手机上 跑起来啊
        徐不同:@看看外面的世界 选你们公司的证书,然后改下bundleId,然后生成推送证书,然后用smartPush测试推送~ :smile:
      • dibadalu:博主好,我将bundle identifier改成自家公司推送用的bundle identifier,signing之类也选择公司的。本来我想这样做demo就可以运行在真机上了。但是xcode报错ios app installation failed 内容大概bundle identifiers unique。我所用的bundle identifier有时候会用在另外一个项目,拿它用在你的demo不行吗?
        徐不同:@dibadalu 可以的,注意替换的时候,所有的扩展也要换,如果你的bundleID是,coderxu.github.io,扩展的bundle id必须是coderxu.github.io.xxxx :smiley:
        Bc_wh1te_Le1:@dibadalu 应该把你已经装在真机的用这个bundleID的自家app卸载掉再装这个吧 否则bundleID会冲突 安装不了
      • 悟2023:博主把这推送记录的可真够详细了,也省的我去整理了
        徐不同: @JSMaker 😍😍
      • 施主小欣:请问楼主iOS10的APP角标是不是写在这里

        if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        NSLog(@"iOS10 收到远程通知:" );
        // 更新显示的徽章个数
        NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
        badge--;
        badge = badge >= 0 ? badge : 0;
        [UIApplication sharedApplication].applicationIconBadgeNumber = badge;

        } 但是我这样并不能实现累加, 还是说只能用
        NSNumber *badge = content.badge; // 推送消息的角标
        [UIApplication sharedApplication].applicationIconBadgeNumber = badge;
        这样的方式?
        LXChen:@施主小欣 你设置角标的那个方法是写在了哪啊,我看写在UNNotificationServiceExtension是会报错的
        施主小欣:@徐不同 楼主 0.0我在这里用NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
        badge--;
        badge = badge >= 0 ? badge : 0;
        [UIApplication sharedApplication].applicationIconBadgeNumber = badge;这个方法没有角标显示、没有角标显示、没有角标显示。

        但是用content.badge的时候如果后端传的这个参数的话会有角标显示。
        但是我不明白是为什么?希望楼主给一个思路~
        徐不同: @施主小欣 嗯可以写在这里的

      本文标题:iOS10推送必看UNNotificationServiceEx

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