iOS10推送通知进阶(Notification Extension)

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动在之前的开发中,遇到了实时音视频呼叫通知,当App未打开或者App在后台时候,需要通知到用户,用户点击通知栏后是否接入实时音视频的视频或者音频通话。在iOS需要为工程新建Target:NotificationServiceExtension。 阅读详情
 

<h2 id="简介"></h2>

简介

这篇文章主要讲iOS10推送通知的两个扩展框架:UNNotificationServiceExtension(通知服务扩展) 和 UNNotificationContentExtension(通知内容扩展)。有关iOS10推送通知的新特性,请看这里

xcode-unnotification-extension.jpeg
  • UNNotificationServiceExtension(通知服务扩展)是在收到通知后,展示通知前,做一些事情的。比如,增加附件,网络请求等。
  • 想要给通知创建一个自定义的用户界面,需要 UNNotificationContentExtension(通知内容扩展)。

<h2 id="UNNotificationServiceExtension-通知服务扩展"></h2>

UNNotificationServiceExtension - 通知服务扩展

如果经常使用iMessage的朋友们,就会经常收到一些信息,附带了一些照片或者视频,所以推送中能附带这些多媒体是非常重要的。如果推送中包含了这些多媒体信息,可以使用户不用打开app,不用下载就可以快速浏览到内容。众所周知,推送通知中带了push payload,即使z去年苹果已经把payload的size提升到了4k bites,但是这么小的容量也无法使用户能发送一张高清的图片,甚至把这张图的缩略图包含在推送通知里面,也不一定放的下去。在iOS X中,我们可以使用新特性来解决这个问题。我们可以通过新的service extensions来解决这个问题。

iOS10给通知添加附件有两种情况:本地通知和远程通知。

  1. 本地推送通知,只需给content.attachments设置UNNotificationAttachment附件对象
  2. 远程推送通知,需要实现 UNNotificationServiceExtension(通知服务扩展),在回调方法中处理 推送内容时设置 request.content.attachments(请求内容的附件) 属性,之后调用 contentHandler 方法即可。

UNNotificationServiceExtension 提供在远程推送将要被 push 出来前,处理推送显示内容的机会。此时可以对通知的 request.content 进行内容添加,如添加附件,userInfo 等。下图显示了Notification Service Extension的流程:

unnotification-service-extension.jpg

处理的细节如下:

1.为了能在service extension 里面的attachment,必须给apns增加 "mutable-content":1 字段,使你的推送通知是动态可变的。

{
     "aps":{
         "alert":"Testing.. (34)",
         "badge":1,
         "sound":"default",
         "mutable-content":1
      }
}

2.给项目新建一个Notification Service Extension的扩展。

3.在-didReceiveNotificationRequest:withContentHandler:方法中处理request.content,用来给通知的内容做修改。如面代码示例了收到通知后,给通知增加图片附件:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
    
    //1. 下载
    NSURL *url = [NSURL URLWithString:@"http://img1.gtimg.com/sports/pics/hv1/194/44/2136/138904814.jpg"];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (!error) {
        
            //2. 保存数据
            NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject
                              stringByAppendingPathComponent:@"download/image.jpg"];
            UIImage *image = [UIImage imageWithData:data];
            NSError *err = nil;
            [UIImageJPEGRepresentation(image, 1) writeToFile:path options:NSAtomicWrite error:&err];
            
            //3. 添加附件
            UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"remote-atta1" URL:[NSURL fileURLWithPath:path] options:nil error:&err];
            if (attachment) {
                self.bestAttemptContent.attachments = @[attachment];
            }
        }
        
        //4. 返回新的通知内容
        self.contentHandler(self.bestAttemptContent);
    }];
    
    [task resume];
}

注意:使用UNNotificationServiceExtension,你有30秒的时间处理这个通知,可以同步下载图像和视频到本地,然后包装为一个UNNotificationAttachment扔给通知,这样就能展示用服务器获取的图像或者视频了。这里需要注意:如果数据处理失败,超时,extension会报一个崩溃信息,但是通知会用默认的形式展示出来,app不会崩溃。

附件通知所带的附件格式大小都是有限的,并不能做所有事情,视频的前几帧作为一个通知的附件是个不错的选择。

<h2 id="UNNotificationContentExtension-通知内容扩展"></h2>

UNNotificationContentExtension - 通知内容扩展

要想创建一个自定义的用户界面,需要用到Notification Content Extension(通知内容扩展)。

Notification Content Extension(通知内容扩展)允许开发者加入自定义的界面,在这个界面里面,你可以绘制任何你想要的东西。但是有一个最重要的限制就是,这个自定义的界面没有交互。它们不能接受点击事件,用户并不能点击它们。但是推送通知还是可以继续与用户进行交互,因为用户可以使用notificaiton的actions。注意:extension也可以处理这些actions。

1. 推送界面的组成
unnotification-composition.png
  • header的UI是系统提供的一套标准的UI。这套UI会提供给所有的推送通知。
  • header下面的custom content是自定义的内容,就是Notification Content Extension(通知内容扩展)。在这里,就可以显示任何你想绘制的内容了。你可以展示任何额外的有用的信息给用户。
  • default content是系统的界面。这也就是iOS 9 之前的推送的样子。
  • 最下面的notification action,在这一段,用户可以触发一些操作。并且这些操作还会相应的反映到上面的自定义的推送界面content extension中。
2. 创建Notification Content Extension

创建一个新的Notification Content的target。Xcode自动生成一个新的模板,下面有三个文件,ViewController、main Interface storyboard、info.plist。

unnotification-content-extension-files.png

然后打开这里的ViewController。

#import "NotificationViewController.h"
#import <UserNotifications/UserNotifications.h>
#import <UserNotificationsUI/UserNotificationsUI.h>

@interface NotificationViewController () <UNNotificationContentExtension>

@property IBOutlet UILabel *label;

@end

@implementation NotificationViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any required interface initialization here.
}

- (void)didReceiveNotification:(UNNotification *)notification {
    self.label.text = notification.request.content.body;
}

@end

发现这里的ViewController就是一个普通的UIViewController, 但是它实现了UNNotificationContentExtension协议。

UNNotificationContentExtension协议有一个required方法didReceiveNotification:。当收到指定categroy的推送时, didReceiveNotification:方法会随着ViewController的生命周期方法,一起被调用,这样就能接受notification object,更新UI。

3. 配置category

接下来就是要让推送到达后,系统怎样找到自定义的UI。这时候就需要配置extension的info.plist文件。

unnotification-content-extension-info1.jpeg

这里和我们给notification actions注册category一样,给这个通知扩展指定相应的category。在UNNotificationExtensionCategory字段里写入相应的category id。值得提到的一点是,这里对应的category是可以为一个数组的,里面可以为多个category,这样做的目的是多个category共用同一套UI。

unnotification-content-extension-info2.jpeg

上图中category id为myNotificationCategory1和myNotificationCategory2的通知就共用了一套UI。

设置了category后, 只要在通知里面增加category字段,值是上面在extension的plist里面配置的category id, 收到的通知就会通过自定义的样式显示。

远程通知在apns里面增加category字段。

{
    "aps":{
        "alert":"Testing.. (34)",
        "badge":1,
        "sound":"default",
        "category":"myNotificationCategory1"
     }
}
4. 自定义UI

然后开始写自定义UI。

- (void)didReceiveNotification:(UNNotification *)notification {
    self.label.text = [NSString stringWithFormat:@"%@ [modified]", notification.request.content.title];
    self.subLabel.text = [NSString stringWithFormat:@"%@ [modified]", notification.request.content.body];
    self.imageView.image = [UIImage imageNamed:@"hong.png"];
}

可以在ViewController中增加一些Label和ImageView,收到通知的时候,提取想要的内容,或者添加额外的内容,设置到我们自定义的View上。

custom-ui1.png
5. 优化

优化一:发现是自定义界面的大小很不美观

  1. 这时候可以通过设置ViewController的preferredContentSize大小,控制自定义视图的大小。
  2. 也可以通过约束,控制自定义视图的大小。
- (void)viewDidLoad {
    [super viewDidLoad];
    self.preferredContentSize = CGSizeMake(CGRectGetWidth(self.view.frame), 100);
}

优化二:目标大小的问题解决了,但是发现视图恢复成正确的尺寸前,先展示有一大片空白的样子,然后变成正确的样子。当通知展示出来之后,它的大小并不是正常的我们想要的尺寸。iOS系统会去做一个动画来Resize它的大小。这样体验很差。

custom-ui2.gif

会出现上面这张图的原因是,在推送送达的那一刻,iOS系统需要知道我们推送界面的最终大小。但是我们自定义的extension在系统打算展示推送通知的那一刻,并还没有启动。所以这个时候,在我们代码都还没有跑起来之前,我们需要告诉iOS系统,我们的View最终要展示的大小。

为了解决这个问题,我们需要在extension的info.plist里设置一个content size ratio。增加字段UNNotificationExtensionInitialContentSizeRatio。

unnotification-content-extension-info3.jpeg

这个属性定义了宽和高的比例。当然设置了这个比例以后,也并不是万能的。因为你并不知道你会接受到多长的content。当你仅仅只设置比例,还是不能完整的展示所有的内容。有些时候如果我们可以知道最终的尺寸,那么我们固定尺寸会更好。

优化三:这时候我们发现我们自定义的界面显示的内容(custom content)和系统默认的内容(default content)重复了。

可以在extension的info.plist里设置,把系统默认的样式隐藏。增加字段UNNotificationExtensionDefaultContentHidden。

unnotification-content-extension-info4.jpeg

将系统内容隐藏后效果如下:

custom-ui3.png
6. 自定义操作

iOS8开始引入的action的工作原理:

默认系统的Action的处理是,当用户点击的按钮,就把action传递给app,与此同时,推送通知会立即消失。这种做法很方便。

但是有的情况是,希望用户点击action按钮后,效果及时响应在我们自定义的UI上。这个时候,用户点击完按钮,我们把这个action直接传递给extension,而不是传递给app。当actions传递给extension时,它可以延迟推送通知的消失时间。在这段延迟的时间之内,我们就可以处理用户点击按钮的事件了,并且更新UI,一切都处理完成之后,我们再去让推送通知消失掉。

这里我们可以运用UNNotificationContentExtension协议的第二个方法,这方法是Optional

- (void)didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(void (^)(UNNotificationContentExtensionResponseOption option))completion
{
    if ([response.actionIdentifier isEqualToString:@"action-like"]) {
        self.label.text = @"点赞成功~";
    }else if ([response.actionIdentifier isEqualToString:@"action-collect"]){
        self.label.text = @"收藏成功~";        
    }else if ([response.actionIdentifier isEqualToString:@"action-comment"]){
        self.label.text = [(UNTextInputNotificationResponse *)response userText];
    }
    
    //这里如果点击的action类型为UNNotificationActionOptionForeground,
    //则即使completion设置成Dismiss的,通知也不能消失
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        completion(UNNotificationContentExtensionResponseOptionDismiss);
    });
}

在这个方法里判断所有的action,更新界面,并延迟1.5秒后让通知消失。真实情况可能是,点击“赞”按钮后,发送请求给服务器,根据服务器返回结果,展示不同的UI效果在通知界面上,然后消失。如果是评论,则将评论内容更新到界面上。

如果还想把这个action传递给app,最后消失的参数应该这样:

completion(UNNotificationContentExtensionResponseOptionDismissAndForwardAction);

但是我实际运行遇见这种情况,如果点击的action类型为UNNotificationActionOptionForeground,则即使completion设置成Dismiss的,通知也不能消失,也没有启动app,这里不太明白为什么会这样,如果有知道原因的,欢迎大家评论。

7.自定义输入型操作

action 有2种类型:

  • UNNotificationAction 普通按钮样式
  • UNTextInputNotificationAction 输入框样式

UNTextInputNotificationAction的样式如下:

custom-ui4.png

系统的输入样式的action,只有在点击发送按钮时,才能接受到action的响应回调。(比如上面的didReceiveNotificationResponse:completionHandler:方法)。但有的时候系统的样式或者功能不能满足需求,这时候可以自定义键盘上面的inputAccessoryView。

首先,重写ViewController的下面两个方法:

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (UIView *)inputAccessoryView
{
    return self.customInputView;
}

自定义inputAccessoryView,以绘制自定义的输入样式。

- (void)didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(void (^)(UNNotificationContentExtensionResponseOption option))completion
{
    ...
    
    }else if ([response.actionIdentifier isEqualToString:@"action-comment"]){
        self.label.text = [(UNTextInputNotificationResponse *)response userText];
        [self becomeFirstResponder];
        [self.textField becomeFirstResponder];
        
        self.completion = completion;
    }
}

实现了点击评论按钮,ViewController 成为第一响应者,使自定义的输入样式显示出来。然后,让textField成为第一响应者,使键盘弹出。

这里将操作的completion保存,以便在需要的时候调用。比如,可以在点击键盘右下的send按钮时,调用completion,使通知消失。

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    self.label.text = textField.text;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.completion(UNNotificationContentExtensionResponseOptionDismiss);
    });
    return YES;
}

实现效果入下:

custom-ui5.png

结合使用两个扩展

可以在content extension里面绘制界面时,通过notification.request.content.attachments获取附件放到自定义控件里面。

- (void)didReceiveNotification:(UNNotification *)notification {

    ...
    
    UNNotificationAttachment *attachment = notification.request.content.attachments.firstObject;
    if (attachment) {
        if ([attachment.URL startAccessingSecurityScopedResource]) {
            self.imageView.image = [UIImage imageWithContentsOfFile:attachment.URL.path];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [attachment.URL stopAccessingSecurityScopedResource];
            });
        }
    }
}

我们可以提取content的attachments。前文提到过,attachment是由系统管理的,系统会把它们单独的管理,这意味着它们存储在我们sandbox之外。所以这里我们要使用attachment之前,我们需要告诉iOS系统,我们需要使用它,并且在使用完毕之后告诉系统我们使用完毕了。对应上述代码就是-startAccessingSecurityScopedResource和-stopAccessingSecurityScopedResource的操作。当我们获取到了attachment的使用权之后,我们就可以使用那个文件获取我们想要的信息了。

关于调试

很多人在开发 iOS extension 时遇到了调试的问题,可以看这里的解决方法,如果还不能有效解决您的问题,欢迎评论留言。

结束语

更多代码实现请查看Demo, 如发现问题,请帮忙指正。

参考


作者:liuyanhongwl
链接:https://www.jianshu.com/p/78ef7bc04655
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
iOS10通知(七)--Notification Content Extension 上一篇介绍了如何用Notification Service Extension来实现修改收到的消息内容,这一篇介绍使用Notification Content Extension来实现自定义的通知界面。 工程中用到了SDWebImage 1、首先在工程中新增一个通知的内容拓展 2、这个 extension 中有一个必须实现的方法 didReceiveNotification(),在系 阅读详情

相关推荐

IOS 图文富文本推送 UNNotificationServiceExtension UNNotificationContentExtension

iOS 10 自定义推送,图文推送,富文本推送

weixin_43386483的博客 1943

iOS10推送必看UNNotificationServiceExtension

http://www.cocoachina.com/ios/20161017/17769.html 如果大家还没有看我的这两篇文章,建议还是先阅读一下,循序渐进么~文章链接如下: iOS开发 iOS10推送必看(基础篇)iOS开发 iOS10推送必看(高阶1)这次的最后,终于有demo咯~ 在这篇文章,我会给大家讲一讲更高级一点的,定制化更高的远程通知。其中会补充我之前没讲的远程推送(多...

weixin_30872867的博客 519

swift:Notification Service Extension 扩展动态修改推送通知

众所周知,苹果的apns推送,在我们不点击通知时,app是不会执行任何代码的,且apns推送的保活时间是30s左右,如果我们想对推送内容进行修改,可以通过Notification Service Extension进行动态修改 一、Notification Service Extension 1、点击 file->new->target 2、选择 iOS->Notifi...

lin1109221208的博客 3449

iOS10通知(六)--Notification Service Extension

iOS 10 中添加了很多拓展 extension,与通知相关的拓展 extension 有两个:Notification Service Extension 和 Notification Content Extension。前者可以让我们有机会在收到远程推送的通知后,展示之前对通知内容进行修改;后者可以用来自定义通知视图的样式。 Notification Service Extension 现

7464

iOS 通知扩展插件

Python微信订餐小程序课程视频 https://edu.youkuaiyun.com/course/detail/36074 Python实战量化交易理财系统 https://edu.youkuaiyun.com/course/detail/35475阅读目录 Notification Service Extension UINotificationConentExtension iOS 通知扩展插件 目录* iOS 通知扩展插件 + Notification Service Extension - 新建一个target

pythonxxoo的博客 3412

iOS推送机制深度解析:挂起态数据存储奥秘

本文深入解析了iOS应用在挂起(Not Running)状态下推送数据的存储与分发机制。文章首先介绍了iOS应用生命周期状态及推送体系的整体架构,重点分析了APNs推送服务与iOS系统的协作关系。随后详细阐述了推送数据在系统级的存储原理,包括临时队列、持久化机制和数据安全策略,并针对普通通知、静默推送等不同场景进行技术实现分析。文章还探讨了数据丢失、合并等异常情况的处理方案,从开发者角度提供了高效获取推送数据的最佳实践,包括生命周期方法、源码模式和业务防护建议。最后,对推送系统的安全合规和用户体验优化提出了

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1万+

iOS10 推送通知进阶之 Service Extension

iOS10 添加两个通知相关的Extension:Service Extension 和 Content Extension。我们先来学习一下看一下Service Extension。 简介 UNNotificationServiceExtension是iOS10推出后的一个新特性,看图说话: 从图中可以看出,原来直接从APNS推送到用户手机的消息通知,中间添加了ServiceExtension处理(当然也可以不处理)。通过ServiceExtension,我们可以把即将呈现给用户的通知内容,做各种修改和

Andy Coding 1350

基于YOLOv5的隧道衬砌缺陷智能检测系统

计算机视觉在工程检测领域正发挥越来越重要的作用,特别是目标检测技术通过深度学习算法实现了对复杂场景的智能分析。YOLOv5作为当前主流的目标检测框架,通过改进网络结构和训练策略,可以显著提升检测精度和效率。在隧道工程领域,结合通道注意力机制和多尺度特征融合技术,能够有效解决衬砌缺陷识别中的小目标检测难题。这种AI检测系统相比传统人工判读地质雷达图像,不仅将效率提升20倍,还能将识别准确率提高到92.3%,特别适用于3cm以上结构缺陷的自动化检测。系统通过深度可分离卷积等优化,实现了模型轻量化,便于在边缘计算

weixin_29064103的博客 326

iOS推送通知拓展NotificationServiceExtension实践

前言 自iOS10 更新以来,Apple 表示这是 iOS 有史以来最大的升级(our biggest release yet),更加智能开放的Siri、强化应用对3DTouch支持、 HomeKit 、电话拦截及全新设计的通知等等。 iOS 10 中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用的功能——撤回单条通知、...

weixin_34005042的博客 6043

.ipynb文件深度解析:从JSON结构到Jupyter Notebook高效使用指南

在Python开发与数据处理领域,交互式编程正成为探索数据与验证思路的高效方式。Jupyter Notebook作为最流行的交互式环境之一,其默认文件格式.ipynb本质是一个基于JSON的文本文件,内部通过单元格组织代码、说明文字与运行结果。理解其JSON结构,不仅有助于掌握Notebook的存储原理,更能为文件损坏修复、版本控制与自动化转换提供基础。依托对单元格类型、魔法命令及输出可视化的熟练运用,数据分析和数据可视化流程可以变得更为流畅。同时,借助VS Code、nbconvert等工具,开发者能将.

weixin_28839629的博客 344

从零构建机械臂规划栈:Pinocchio、OMPL与Ruckig的工程化融合实践

本文详细介绍了如何从零构建机械臂规划栈,通过融合Pinocchio、OMPL和Ruckig三大核心组件,实现高性能的机械臂运动规划与轨迹生成。文章深入探讨了技术选型、工程架构设计及实战优化技巧,特别针对逆解、路径规划和轨迹平滑等关键环节提供了实用解决方案,适用于工业场景中的高实时性需求。

weixin_29072299的博客 433

iOS10通知及通知拓展Extension使用详解(附Demo)

1.1-iOS10拓展简介1.2-iOS10通知使用1.3-iOS10通知拓展Extension使用1.4-效果演示 如果对开发有兴趣的可以来黑马学习iOS开发:黑马程序员 源代码下载地址:Deme下载 1.1-iOS10拓展简介 iOS10系统最大的一个亮点就是增加了系统应用的拓展功能ExtensionExtension功能可以理解为自定义系统界面 本小节我们就以自定义系统通知界面来学习一下Ext

坤小的专栏 6664

ATE测试的未来:自动化与智能化的技术演进

本文探讨了自动测试设备(ATE)在半导体产业中的技术演进,重点关注自动化与智能化的发展趋势。随着芯片制程的不断进步,ATE面临测试复杂度激增和成本压力等挑战。文章分析了AI技术在测试优化中的应用,如自适应测试和缺陷预测,以及模块化架构和端到端测试生态系统的创新。这些技术突破显著提升了测试效率和设备利用率,为半导体测试的未来发展指明了方向。

weixin_29232507的博客 614

iOS 推送通知机制知识文档

场景pageIdcategoryactionlabel推送到达pushviewpush_{消息标题}推送点击pushpush_clickclickpush_{消息标题}

weixin_52329515的博客 433

单细胞拟时序分析实战:用monocle2从Seurat对象构建细胞轨迹(附完整代码)

本文提供了一套完整的单细胞拟时序分析实战教程,详细讲解了如何将Seurat对象转换为Monocle2的CellDataSet,并构建细胞命运轨迹。内容涵盖数据转换、轨迹定义基因选择、降维参数调优、可视化技巧及结果生物学验证,旨在帮助研究者解决实际分析中的常见问题,从静态细胞图谱中挖掘动态发育过程。

weixin_29251337的博客 342

【YOLO 系列】基于YOLO V8的智能车载交通标志识别系统【python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍了基于YOLO V8构建智能车载交通标志识别系统的完整流程。从环境搭建、数据集准备、模型训练到PyQt5图形界面开发,提供了Python源码和实战代码,帮助开发者快速实现高精度、实时的交通标志检测应用,提升驾驶辅助系统的开发效率。

wdx012345的博客 966

uni-app xcode 制作iOS Notification Service Extension 远程推送图文原生插件

2、Notification Service Extension的bundle id必须和主项目的bundle id前面标识一样,比如主项目的bundle id是:com.aa.look ,Notification Service Extension的bundle id就必须是:com.aa.look.pushservice ,‘pushservice’一般是Notification Service Extension创建的tag名称。3、证书一定要配置对,不然云打包会报很多合并的错误。

donwei8的专栏 599

华为od 面试八股文_操作系统_01_含答案

华为od 面试八股文_操作系统_01_含答案

MISAYAONE的博客 3269

Firebase交互式推送:打造智能通知体验的完整指南

在移动应用生态中,推送通知已成为用户参与和留存的关键工具。然而,传统的静态通知往往缺乏互动性,导致用户参与度有限。Firebase Cloud Messaging(FCM)通过交互式推送功能,为开发者提供了创建丰富、动态通知体验的强大能力。 ## 交互式推送的核心价值 ### 传统通知的局限性 - **单向通信**:用户只能被动接收信息 - **缺乏即时反馈**:需要跳转到应用才能完成操作 -...

gitblog_00108的博客 1016

Claude Code 错误解决方案: Request Timed Out 超时 原因、配置与解决方案

Claude Code 抛出 Request Timed Out 不仅可 能是网络问题,更大概率是 API 高负载或超大响应导致。本文从 默认超时机制出发,拆解三种根因场景,给出 API_TIMEOUT_MS 环境变量调优与任务拆分策略,帮助开发者在保证稳定性的同时 避免误判网络故障。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 899

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

终极iOS通知中心开发指南:从UserNotifications到自定义UI的完整实践

TimLiu-iOS项目是iOS开发常用三方库、插件、知名博客的集合地,本文将带你探索如何利用UserNotifications框架打造功能强大的通知中心,并实现令人惊艳的自定义UI效果,让你的应用通知体验脱颖而出。 ## 📱 UserNotifications框架核心功能解析 ### 快速集成远程推送的3个步骤 iOS通知系统的核心是UserNotifications框架,通过以下简单步

gitblog_00528的博客 601

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

push notification通知修改和分组

通知分组 iOS12 引入了同住分组的概念,也就是可以将push分成不同的group,但是打开系统设置,进入通知设置中,我们可以看到通知分组下面有三种设置可供用户设置,分别是自动、按app、关,默认是自动。 1、自动分组 按照preload结构里面thread-id分group,相同thred-id的push叠加在一起,不同的thred-id按时间一次排列。 (1)实现自动分组 远程推送 如果想为自己app的push设置group只需要在push的preload里面设置不同的thread-id即可。

onebutterfly 1044

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Countly iOS SDK 推送通知跟踪教程:Token注册、权限请求与点击行为上报一步到位

Countly iOS SDK 是 Countly 数字分析平台的移动端 SDK,支持 iOS、macOS、watchOS 与 tvOS。本教程带你一步到位完成 **iOS 推送通知跟踪** 的全部接入:APNs Token 自动注册、通知权限优雅请求、点击行为自动上报,让你无需手写繁琐的胶水代码,即可在 Countly 面板中看到推送送达与点击的完整数据。 ## 🧭 先搞懂:推送跟踪的三大核

gitblog_00452的博客 318

iOS推送通知解决方案:Bark框架深度解析与实战指南

Bark是一个基于Apple Push Notification service(APNs)的iOS推送通知解决方案,为开发者提供安全、高效的自定义通知推送能力。这个开源框架通过简洁的API接口实现了跨平台消息传递,支持iOS 15+的所有高级通知特性,是构建现代化通知系统的理想选择。 ## 项目定位与价值主张 Bark定位为轻量级iOS通知推送框架,核心价值在于简化推送通知的集成复杂度。与传

gitblog_01107的博客 483
上一篇: [objc explain]: Classes and metaclasses
下一篇: iOS单元测试
runtime666
博客等级 码龄10年 41粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值