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 通知扩展插件相关推荐

  1. IOS分享扩展使用JS脚本

    2019独角兽企业重金招聘Python工程师标准>>> 实现一个分享扩展插件,功能是从Safari网页中截取当前网页的图片内容 基本的步骤总结在下面: 1.创建一个JS文件,命名为M ...

  2. adrms移动设备扩展插件_如何在所有移动设备上扩展网站

    adrms移动设备扩展插件 我们大多数人都可以方便地访问互联网,上网购物,甚至使用我们的移动设备支付账单. 根据Forrester的一项研究, <数字商业势在必行> ,美国43%的银行客户 ...

  3. Chrome浏览器扩展插件的8种获利方式

    如果你已经构建了一个Chrome扩展插件,已经有了成千上万的用户,那面临的一个问题是如何利用这个产品来获利. 如果在Android或iOS上,那么获利的方法就容易多了.但是,在某种程度上,Chrome ...

  4. Chrome浏览器扩展插件指南:从MV2迁移到Manifest V3

    Chrome Web Store于2021年1月已经开始接受Manifest V3扩展的提交.如果你还在使用MV2版本,那么一定要在官方弃用之前,尽快更新到MV3版本. Chrome浏览器从88版本开 ...

  5. 100个精选zencart扩展插件

    100个精选zencart扩展插件 特别推荐 1. 数据库备份 2. 产品横向布局. 3. 邮件订阅Newsletter Subscribe. 4. google 翻译google_translate ...

  6. 制作iOS越狱deb插件+dpkg命令行教程

    iOS越狱deb插件的制作 dpkg命令行教程 deb安装包的制作 介绍  Cydia Sileo都是基于Debian开发的, 所以插件都是打包成.deb格式 deb包是Debian软件包格式,文件扩 ...

  7. chrome扩展插件二:chrome插件开发入门

    一个扩展插件由不同的组件构成.组件包括backgroud script.content script.选项页.ui元素及其它逻辑文件.插件的开发技术包括HTML,CSS及javascript.扩展插件 ...

  8. VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件

    1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...

  9. jupyter扩展插件Nbextensions的安装、使用

    jupyter扩展插件Nbextensions的安装.使用 # 使用pypi里面包进行安装 pip install jupyter_contrib_nbextensions # 也可以通过如下方式进行 ...

  10. iOS 通知观察者的被调函数不一定运行在主线程

    Tony in iOS | 08/08/2013 iOS 通知观察者的被调函数不一定运行在主线程 今天修复Bug时候发现的一个小细节,记录下. 问题描述 事情是这样的:我在A视图(UITableVie ...

最新文章

  1. QuickPart : 用户控件包装器 for SharePoint 2007
  2. 设计模式-结构型-装饰
  3. 更多Java之行内容,需要看直播请关注微薄
  4. asp.net身份验证
  5. eeglab基础学习
  6. maven打包命令-P和-D的用法
  7. 从MSDN我告诉你下载镜像
  8. matlab蒙特卡罗变量变换的分布,使用 copula 仿真相关随机变量
  9. 关于atmel芯片security bit的取消
  10. Unity接入穿山甲广告(使用unity插件SDK接入)看这一篇就够了
  11. 蜻蜓FM回应恶意代码事件 音频行业仍将现721格局
  12. Elasticsearch 多种跨机房灾备方案对比与实战解读
  13. HTTP - get/post请求详解与本质区别总结
  14. 设计模式——迭代器模式(遍历王者荣耀和英雄联盟英雄信息)
  15. css布局入门级实战之九宫格网格布局
  16. android+qq+4.6.2,AndroidQQ通讯录4.6闪亮登场 让你领略“超快感”
  17. 合工大850参考书_合肥工业大学硕士目录
  18. stm32基于TouchGFX的GUI开发(十):Touchgfx图片资源存储在外部Flash教程(SPI和QSPI方法二)
  19. Novenber II 2004
  20. 质证辩论中如何反驳方法

热门文章

  1. 腾讯微博开放平台开发吐槽
  2. VMware虚拟机不能连接USB的问题
  3. 计算机职业素养论文1500字,职业素养论文1500字 [职业素养教育论文]
  4. StarUML 3 中文文档 构件图
  5. Mac不用Boot Camp 安装双系统
  6. 软件:分享几款实用的内网穿透工具,值得学习一下!
  7. linux 下的绘图软件Visio——流程图,矢量图
  8. vba手机号码归属_Android中手机号码归属地查询实现
  9. AMD 2020届IC校招笔试题
  10. eclipse下载以及下载web插件速度慢的解决方法