iOS 通知扩展插件
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475阅读目录
- Notification Service Extension
- UINotificationConentExtension
iOS 通知扩展插件
目录* iOS 通知扩展插件
+ Notification Service Extension
- 新建一个target
- 代码实现
- 注意事项
+ UINotificationConentExtension
- 配置项目
- 配置info.plist
- 自定义UI
Notification Content Extension
- 通知内容扩展,是在展示通知时展示一个自定义的用户界面。
Notification Service Extension
- 通知服务扩展,是在收到通知后,展示通知前,做一些事情的。比如,增加附件,网络请求等。
回到顶部## Notification Service Extension
- 目前只找到aps推送支持
- 主要是处理一下附件相关的下载
新建一个target
- 老的xcode版本开启VoIP功能也是在 Background Modes 中直接勾选就开启了,但是新版的xcode移除了这个选项,所以只能在 info.plist 文件中去手动添加
- 参考1
- 参考2
代码实现
@interface NotificationService : UNNotificationServiceExtension@end
#import "NotificationService.h"
#import @interface NotificationService ()@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;@end@implementation NotificationService
// 系统接到通知后,有最多30秒在这里重写通知内容(在此方法可进行一些网络请求,如上报是否收到通知等操作)
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {NSLog(@"%s",__FUNCTION__);self.contentHandler = contentHandler;self.bestAttemptContent = [request.content mutableCopy];// Modify the notification content here...NSLog(@"%@",request.content);// 添加附件//1. 下载NSURL *url = [NSURL URLWithString:@"https://tva1.sinaimg.cn/large/008i3skNgy1gtir9lwnj0j61x40gsabl02.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).firstObjectstringByAppendingPathComponent:@"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];}}else{self.bestAttemptContent.title = @"标题";self.bestAttemptContent.subtitle = @"子标题";self.bestAttemptContent.body = @"body";}//4. 返回新的通知内容self.contentHandler(self.bestAttemptContent);}];[task resume];
}
// 处理过程超时,则收到的通知直接展示出来
- (void)serviceExtensionTimeWillExpire {NSLog(@"%s",__FUNCTION__);self.contentHandler(self.bestAttemptContent);
}@end
注意事项
- UNNotificationAttachment:attachment 支持
- 音频 5M(kUTTypeWaveformAudio/kUTTypeMP3/kUTTypeMPEG4Audio/kUTTypeAudioInterchangeFileFormat)
- 图片10M(kUTTypeJPEG/kUTTypeGIF/kUTTypePNG)
- 视频50M(kUTTypeMPEG/kUTTypeMPEG2Video/kUTTypeMPEG4/kUTTypeAVIMovie)
回到顶部## UINotificationConentExtension
配置项目
- 新建target,打开推送服务
配置info.plist
- 配置info.plist,和Notification Service Extension进行关联
- 找到这个 UNNotificationExtensionCategory,写到Notification Service Extension中,可以配置多个,对应多个界面
self.bestAttemptContent.categoryIdentifier = @"myNotificationCategory";// 和NotificationConentExtension关联self.contentHandler(self.bestAttemptContent);
自定义UI
- 如果我们想要隐藏系统默认的内容页面,也就是下面的那部分,头是隐藏不了的;只需要在Info.plist里添加字段UNNotificationExtensionDefaultContentHidden,bool类型并设置其值为YES;
- 可以直接修改stroryboard
- 添加Action,可以添加基本的事件
#import "NotificationViewController.h"
#import
#import @interface NotificationViewController () <UNNotificationContentExtension,UIActionSheetDelegate>@property IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;@end@implementation NotificationViewController- (void)viewDidLoad {[super viewDidLoad];NSLog(@"%s",__FUNCTION__);// 添加actionUNNotificationAction * likeAction; //喜欢UNNotificationAction * ingnoreAction; //取消UNTextInputNotificationAction * inputAction; //文本输入likeAction = [UNNotificationAction actionWithIdentifier:@"action\_like" title:@"点赞"
options:UNNotificationActionOptionForeground];inputAction = [UNTextInputNotificationAction actionWithIdentifier:@"action\_input"title:@"评论"
options:UNNotificationActionOptionForeground textInputButtonTitle:@"发送"textInputPlaceholder:@"说点什么"];
ingnoreAction = [UNNotificationAction actionWithIdentifier:@"action\_cancel"title:@"忽略" options:UNNotificationActionOptionDestructive];NSString *categoryWithIdentifier = @"myNotificationCategory";// 和info.plist中配置的id一样UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:categoryWithIdentifier actions:@[likeAction,inputAction,ingnoreAction] intentIdentifiers:@[] options:UNNotificationCategoryOptionNone];NSSet *sets = [NSSet setWithObjects:category,nil];[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:sets];
}- (void)didReceiveNotification:(UNNotification *)notification {self.label.text = notification.request.content.body;NSLog(@"didReceiveNotification:%@",notification.request.content);for (UNNotificationAttachment * attachment in notification.request.content.attachments) {NSLog(@"url:%@",attachment.URL);// 显示图片if([attachment.URL startAccessingSecurityScopedResource]){NSData *data = [NSData dataWithContentsOfURL:attachment.URL];self.imageView.image = [UIImage imageWithData:data];[attachment.URL stopAccessingSecurityScopedResource];}}
}- (void)didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(void (^)(UNNotificationContentExtensionResponseOption))completion {NSLog(@"response:%@",response);if ([response.actionIdentifier isEqualToString:@"action\_like"]) {dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC\_PER\_SEC)), dispatch_get_main_queue(), ^{completion(UNNotificationContentExtensionResponseOptionDismiss);});} else if ([response.actionIdentifier isEqualToString:@"action\_input"]) {UNTextInputNotificationResponse *inputAction = (UNTextInputNotificationResponse*)response;NSLog(@"输入内容:%@",inputAction.userText);// TODO: 发送评论completion(UNNotificationContentExtensionResponseOptionDismiss);} else if ([response.actionIdentifier isEqualToString:@"action\_cancel"]) {completion(UNNotificationContentExtensionResponseOptionDismiss);} else {completion(UNNotificationContentExtensionResponseOptionDismiss);}completion(UNNotificationContentExtensionResponseOptionDoNotDismiss);
}
@end
- info.plist
- aps 格式
{
"aps":{"alert":{"title":"iOS10远程推送标题","subtitle" : "iOS10 远程推送副标题","body":"这是在iOS10以上版本的推送内容,并且携带来一个图片附件"},"badge":1,"mutable-content":1,"media":"image","image-url":"https://tva1.sinaimg.cn/large/008i3skNgy1gtmd6b4whhj60fq0g6tb502.jpg"}
}
- 参考1
- 参考2
- 参考3
iOS 通知扩展插件相关推荐
- IOS分享扩展使用JS脚本
2019独角兽企业重金招聘Python工程师标准>>> 实现一个分享扩展插件,功能是从Safari网页中截取当前网页的图片内容 基本的步骤总结在下面: 1.创建一个JS文件,命名为M ...
- adrms移动设备扩展插件_如何在所有移动设备上扩展网站
adrms移动设备扩展插件 我们大多数人都可以方便地访问互联网,上网购物,甚至使用我们的移动设备支付账单. 根据Forrester的一项研究, <数字商业势在必行> ,美国43%的银行客户 ...
- Chrome浏览器扩展插件的8种获利方式
如果你已经构建了一个Chrome扩展插件,已经有了成千上万的用户,那面临的一个问题是如何利用这个产品来获利. 如果在Android或iOS上,那么获利的方法就容易多了.但是,在某种程度上,Chrome ...
- Chrome浏览器扩展插件指南:从MV2迁移到Manifest V3
Chrome Web Store于2021年1月已经开始接受Manifest V3扩展的提交.如果你还在使用MV2版本,那么一定要在官方弃用之前,尽快更新到MV3版本. Chrome浏览器从88版本开 ...
- 100个精选zencart扩展插件
100个精选zencart扩展插件 特别推荐 1. 数据库备份 2. 产品横向布局. 3. 邮件订阅Newsletter Subscribe. 4. google 翻译google_translate ...
- 制作iOS越狱deb插件+dpkg命令行教程
iOS越狱deb插件的制作 dpkg命令行教程 deb安装包的制作 介绍 Cydia Sileo都是基于Debian开发的, 所以插件都是打包成.deb格式 deb包是Debian软件包格式,文件扩 ...
- chrome扩展插件二:chrome插件开发入门
一个扩展插件由不同的组件构成.组件包括backgroud script.content script.选项页.ui元素及其它逻辑文件.插件的开发技术包括HTML,CSS及javascript.扩展插件 ...
- VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件
1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...
- jupyter扩展插件Nbextensions的安装、使用
jupyter扩展插件Nbextensions的安装.使用 # 使用pypi里面包进行安装 pip install jupyter_contrib_nbextensions # 也可以通过如下方式进行 ...
- iOS 通知观察者的被调函数不一定运行在主线程
Tony in iOS | 08/08/2013 iOS 通知观察者的被调函数不一定运行在主线程 今天修复Bug时候发现的一个小细节,记录下. 问题描述 事情是这样的:我在A视图(UITableVie ...
最新文章
- QuickPart : 用户控件包装器 for SharePoint 2007
- 设计模式-结构型-装饰
- 更多Java之行内容,需要看直播请关注微薄
- asp.net身份验证
- eeglab基础学习
- maven打包命令-P和-D的用法
- 从MSDN我告诉你下载镜像
- matlab蒙特卡罗变量变换的分布,使用 copula 仿真相关随机变量
- 关于atmel芯片security bit的取消
- Unity接入穿山甲广告(使用unity插件SDK接入)看这一篇就够了
- 蜻蜓FM回应恶意代码事件 音频行业仍将现721格局
- Elasticsearch 多种跨机房灾备方案对比与实战解读
- HTTP - get/post请求详解与本质区别总结
- 设计模式——迭代器模式(遍历王者荣耀和英雄联盟英雄信息)
- css布局入门级实战之九宫格网格布局
- android+qq+4.6.2,AndroidQQ通讯录4.6闪亮登场 让你领略“超快感”
- 合工大850参考书_合肥工业大学硕士目录
- stm32基于TouchGFX的GUI开发(十):Touchgfx图片资源存储在外部Flash教程(SPI和QSPI方法二)
- Novenber II 2004
- 质证辩论中如何反驳方法