iOS10推送必看

2023-11-30 05:38
文章标签 推送 必看 ios10

本文主要是介绍iOS10推送必看,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

iOS10推送必看UNNotificationAttachment以及UNTimeIntervalNotificationTrigger 

标签: 推送ios开发
  945人阅读  评论(0)  收藏  举报
  分类:
 

目录(?)[+]

虽然这篇文章比较长,也不好理解,但是还是建议大家收藏,以后用到的时候,可以看看,有耐心的还是读一读。

这篇文章开始,我会跟大家好好讲讲,苹果新发布的iOS10的所有通知类。

一、创建本地通知事例详解:

注意啊,小伙伴们,本地通知也必须在appdelegate中注册中心,通知的开关打不打开无所谓的,毕竟是本地通知,但是通知的接收的代理,以及通知点击的代理,苹果给合二为一了。所以大家还是需要在appdelegate中写上这2个方法,还有不要忘记在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions注册通知中心。如果使用极光推送的小伙伴,写看一下我的基础篇,辛苦大家啦

创建一个UNNotificationRequest类的实例,一定要为它设置identifier, 在后面的查找,更新, 删除通知,这个标识是可以用来区分这个通知与其他通知
把request加到UNUserNotificationCenter, 并设置触发器,等待触发
如果另一个request具有和之前request相同的标识,不同的内容, 可以达到更新通知的目的

创建一个本地通知我们应该先创建一个UNNotificationRequest类,并且将这个类添加到UNUserNotificationCenter才可以。代码如下:

// 1.创建一个UNNotificationRequestNSString *requestIdentifer = @"TestRequest";UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger];// 2.将UNNotificationRequest类,添加进当前通知中心中
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {}];

在创建UNNotificationRequest类时,官方的解释是说,一个通知请求可以在预定通过时间和位置,来通知用户。触发的方式见UNNotificationTrigger的相关说明。调用该方法,在通知触发的时候。会取代具有相同标识符的通知请求,此外,消息个数受系统限制。

上面的翻译,看上去可能有些拗口,简单来说,就是我们需要为UNNotificationRequest设置一个标识符,通过标识符,我们可以对该通知进行添加,删除,更新等操作。

以下是完整的创建通知的代码:

    // 1.创建通知内容UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];content.title = @"徐不同测试通知";content.subtitle = @"测试通知";content.body = @"来自徐不同的简书";content.badge = @1;NSError *error = nil;NSString *path = [[NSBundle mainBundle] pathForResource:@"icon_certification_status1@2x" ofType:@"png"];// 2.设置通知附件内容UNNotificationAttachment *att = [UNNotificationAttachment attachmentWithIdentifier:@"att1" URL:[NSURL fileURLWithPath:path] options:nil error:&error];if (error) {NSLog(@"attachment error %@", error);}content.attachments = @[att];content.launchImageName = @"icon_certification_status1@2x";// 2.设置声音UNNotificationSound *sound = [UNNotificationSound defaultSound];content.sound = sound;// 3.触发模式UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];// 4.设置UNNotificationRequestNSString *requestIdentifer = @"TestRequest";UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger1];//5.把通知加到UNUserNotificationCenter, 到指定触发点会被触发[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {}];

通过以上代码,我们就可以创建一个5秒触发本地通知,具体样式可以看下图


QQ20160919-0@2x.png-173.2kB

下拉放大content.launchImageName = @"icon_certification_status1@2x";显示的图片是这行代码的效果,如图


IMG_0123.PNG

根据上面内容,大家会发现在创建UNNotificationRequest的时候,会需要UNMutableNotificationContent以及UNTimeIntervalNotificationTrigger这两个类。下面我就对相关的类,以及类扩展,做相应的说明。

1.UNNotificationContent以及UNMutableNotificationContent(通知内容和可变通知内容)

通知内容分为可变的以及不可变的两种类型,类似于可变数组跟不可变数组。后续我们通过某一特定标识符更新通知,便是用可变通知了。
不管是可变通知还是不可变通知,都有以下的几个属性:

// 1.附件数组,存放UNNotificationAttachment类
@property (NS_NONATOMIC_IOSONLY, copy) NSArray <UNNotificationAttachment *> *attachments ;// 2.应用程序角标,0或者不传,意味着角标消失
@property (NS_NONATOMIC_IOSONLY, copy, nullable) NSNumber *badge;// 3.主体内容
@property (NS_NONATOMIC_IOSONLY, copy) NSString *body ;// 4.app通知下拉预览时候展示的图
@property (NS_NONATOMIC_IOSONLY, copy) NSString *launchImageName;// 5.UNNotificationSound类,可以设置默认声音,或者指定名称的声音
@property (NS_NONATOMIC_IOSONLY, copy, nullable) UNNotificationSound *sound ;// 6.推送内容的子标题
@property (NS_NONATOMIC_IOSONLY, copy) NSString *subtitle ;// 7.通知线程的标识
@property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier;// 8.推送内容的标题
@property (NS_NONATOMIC_IOSONLY, copy) NSString *title ;// 9.远程通知推送内容
@property (NS_NONATOMIC_IOSONLY, copy) NSDictionary *userInfo;// 10.category标识
@property (NS_NONATOMIC_IOSONLY, copy) NSString *categoryIdentifier;

以上的的属性,我都增加了相应的说明,大家可以对照我的注释来使用。

2.UNNotificationAttachment (附件内容通知)

在UNNotificationContent类中,有个附件数组的属性,这就是包含UNNotificationAttachment类的数组了。

@property (NS_NONATOMIC_IOSONLY, copy) NSArray <UNNotificationAttachment *> *attachments ;

苹果的解释说,UNNotificationAttachment(附件通知)是指可以包含音频,图像或视频内容,并且可以将其内容显示出来的通知。使用本地通知时,可以在通知创建时,将附件加入即可。对于远程通知,则必须实现使用UNNotificationServiceExtension类通知服务扩展。

创建附件的方法是attachmentWithIdentifier:URL:options:error:。在使用时,必须指定使用文件附件的内容,并且文件格式必须是支持的类型之一。创建附件后,将其分配给内容对象的附件属性。 (对于远程通知,您必须从您的服务扩展做到这一点。)
附件通知支持的类型如下图:


QQ20160918-3.png-45.5kB

下面是创建UNNotificationAttachment的方法:

+ (nullable instancetype)attachmentWithIdentifier:(NSString *)identifier URL:(NSURL *)URL options:(nullable NSDictionary *)options error:(NSError *__nullable *__nullable)error;

注意:URL必须是一个有效的文件路径,不然会报错

这里我再在说下options的属性,一共有4种选项(这几个属性可研究死我了)

  • 1UNNotificationAttachmentOptionsTypeHintKey此键的值是一个包含描述文件的类型统一类型标识符(UTI)一个NSString。如果不提供该键,附件的文件扩展名来确定其类型,常用的类型标识符有
    kUTTypeImage,kUTTypeJPEG2000,kUTTypeTIFF,kUTTypePICT,kUTTypeGIF ,kUTTypePNG,kUTTypeQuickTimeImage等。看到这里你一定有疑问,这些类型导入报错了啊!!我研究了苹果文档,发现大家需要添加以下框架才可以,具体大家可以通过以下类型来处理。

注意:
框架就是#import<MobileCoreServices/MobileCoreServices.h>

使用方法如下:
dict[UNNotificationAttachmentOptionsTypeHintKey] = (__bridge id _Nullable)(kUTTypeImage);
  • 2UNNotificationAttachmentOptionsThumbnailHiddenKey,是一个BOOL值,为YES时候,缩略图将隐藏,默认为YES。如图:


    IMG_0124.PNG-67.2kB


    大家可以对照上面的图来看,就明白是哪里的图消失了。

    使用方法如下:
      dict[UNNotificationAttachmentOptionsThumbnailHiddenKey] =  @YES;
  • 3UNNotificationAttachmentOptionsThumbnailClippingRectKey剪贴矩形的缩略图。这个密钥的值是包含一个归一化的CGRect - 也就是说,一个单元的矩形,其值是在以1.0〜 0.0 ,表示要显示的原始图像的所述部分的字典。例如,指定的(0.25 , 0.25)的原点和大小(0.5 ,0.5 )定义了剪辑矩形,只显示图像的中心部分。使用CGRectCreateDictionaryRepresentation函数来创建字典的矩形。

上面这句话是苹果的翻译,太绕口了。我简单说,就是我下面这幅图。


QQ20160919.png-728.4kB


整张图被分割了,整体比例为1,如果想得到图中阴影面积,就需要写的CGRect(0.5,0.5,0.25,0.25),意思是,从(0.5,0.5)为原点,面积为(0.25,0.25),大家可以理解成,即下面的方法。

使用方法如下:
    dict[UNNotificationAttachmentOptionsThumbnailClippingRectKey] = (__bridge id _Nullable)((CGRectCreateDictionaryRepresentation(CGRectMake(0.5, 0.5, 0.25 ,0.25))));;

使用上面的方法,可以得到一张图的阴影部分的图像,这张图像会是通知的缩略图。比如我下面的这个图,缩略图大家应该可以发现变了吧。


QQ20160919-10.png-49.2kB

这里为了理解,在给大家说几个"坐标点":
(0,0,0.25,0.25)左上角的最小正方形
(0,0,0.5,0.5) 四分之一的正方形,左上角
(0.5,0.5,0.5,0.5)四分之一的正方形,右下角
(0.5,0,0.5,0.5)四分之一的正方形,左下角
(0.25,0.25,0.5,0.5)最中心的正方形 

特别注意:

调试到这里的时候,我感觉苹果应该是有个bug,就是我在来回变化这个显示缩略图的frame的时候,来回改,永远显示为第一次写的frame。我在修改UNNotificationRequest的requestIdentifer属性后,可以变换属性。所以我猜测可能相同requestIdentifer的通知,算一个通知,所以只能调用更新的方法,来变化缩略图的吃不腻吧,或许也不是bug。

  • 4UNNotificationAttachmentOptionsThumbnailTimeKey,一般影片附件会用到,指的是用影片中的某一秒来做这个缩略图;
使用方法如下:
    dict[UNNotificationAttachmentOptionsThumbnailTimeKey] =@10;

这里我们可以直接传递一个NSNumber的数值,比如使用影片第10s的画面来做缩略图就按照上面的来写。此外,要注意的是,这个秒数必须是这个影片长度范围内的,不然报错。

3.UNTimeIntervalNotificationTrigger (通知触发模式)

这个我在iOS开发 iOS10推送必看(基础篇)这篇文章中已经初步介绍了,现在我在详细介绍下。

  • 1.UNPushNotificationTrigger (远程通知触发)一般我们不会使用的

  • 2.UNTimeIntervalNotificationTrigger (本地通知) 一定时间之后,重复或者不重复推送通知。我们可以设置timeInterval(时间间隔)和repeats(是否重复)。

    使用方法:
    UNTimeIntervalNotificationTrigger *triggerOne = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];

解释:上面的方法是指5秒钟之后执行。repeats这个属性,如果需要为重复执行的,则TimeInterval必须大于60s,否则会报`* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'time interval must be at least 60 if repeating'`的错误!**

  • 3.UNCalendarNotificationTrigger(本地通知) 一定日期之后,重复或者不重复推送通知 例如,你每天8点推送一个通知,只需要dateComponents为8。如果你想每天8点都推送这个通知,只要repeats为YES就可以了。
// 周一早上 8:00 上班
NSDateComponents *components = [[NSDateComponents alloc] init];
// 注意,weekday是从周日开始的,如果想设置为从周一开始,大家可以自己想想~
components.weekday = 2;
components.hour = 8;
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
  • 4.UNLocationNotificationTrigger (本地通知)地理位置的一种通知,使用这个通知,你需要导入
    #import<CoreLocation/CoreLocation.h>这个系统类库。示例代码如下:
//1、如果用户进入或者走出某个区域会调用下面两个方法
- (void)locationManager:(CLLocationManager *)managerdidEnterRegion:(CLRegion *)region
- (void)locationManager:(CLLocationManager *)managerdidExitRegion:(CLRegion *)region代理方法反馈相关信息//2、一到某个经纬度就通知,判断包含某一点么
// 不建议使用!!!!!!CLRegion *region = [[CLRegion alloc] init];// 不建议使用!!!!!!CLCircularRegion *circlarRegin = [[CLCircularRegion alloc] init];
[circlarRegin containsCoordinate:(CLLocationCoordinate2D)];UNLocationNotificationTrigger *trigger4 = [UNLocationNotificationTrigger triggerWithRegion:circlarRegin repeats:NO];

注意,这里建议使用CLCircularRegion这个继承自CLRegion的类,因为我看到苹果已经飞起了CLRegion里面是否包含这一点的方法,并且推荐我们使用CLCircularRegion这个类型

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



原文链接:http://www.jianshu.com/p/3d602a60ca4f

这篇关于iOS10推送必看的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/435832

相关文章

【多系统萎缩患者必看】✨维生素补充全攻略,守护你的健康每一天!

亲爱的朋友们,今天我们要聊一个既重要又容易被忽视的话题——‌多系统萎缩患者如何科学补充维生素‌!🌟 在这个快节奏的生活中,健康成为了我们最宝贵的财富,而对于多系统萎缩(MSA)的患者来说,合理的营养补充更是维护身体机能、提升生活质量的关键一步。👇 🌈 为什么多系统萎缩患者需要特别关注维生素? 多系统萎缩是一种罕见且复杂的神经系统疾病,它影响身体的多个系统,包括自主神经、锥体外系、小脑及锥

Android 友盟消息推送集成遇到的问题

友盟消息推送遇到的问题 集成友盟消息推送,步骤根据提供的技术文档接入便可。可是当你集成到项目中去的时候,可能并不是一帆风顺就搞定,因为你项目里面是可能集成了其他的sdk(比如支付宝,微信,七鱼等等三方的sdk)。那么这个时候,再加上友盟的消息推送sdk集成可能就会出现问题。 问题清单 友盟消息推送sdk和支付宝sdk冲突问题 后台配置了消息推送,也显示发送成功,但是手机没有收到消息通知

Redis应用之Feed流关注推送

我的博客大纲 我的后端学习大纲 -------------------------------------------------------------------------------------------------------------------------------------------------# 3.好友关注: 3.1.关注和取关: a.接口说明:

GIT-macOS配置推送代码到GitHub

文章目录 前言1. **设置 HTTP/HTTPS**临时设置(仅对当前会话有效)永久设置(写入配置文件) 2. **设置 SOCKS **3. **取消设置**4. **验证配置**5. **测试推送** 总结 前言 macOS配置推送代码到GitHub 1. 设置 HTTP/HTTPS 临时设置(仅对当前会话有效) git config --global ht

Linux平台下利用JNI+双向RMI实现远程推送

一、 前言  作为一种优秀的编程语言,Java在许多方面具有突出的优越性。其中,RMI技术充分展现了Java卓越的分布式计算能力,而JNI技术则体现了Java结合异种编程语言的强大能力。人们常说,RMI是“从Java到Java”,这种说法忽视了这样一个事实:Java可利用JNI技术很容易地与原有系统连接。JNI+RMI的技术解决方案极大地延伸了Java的分布式功能。  本文的写作是基于这样一种实

最新!全国电力设计院排行榜!跳槽必看!

近日,权威机构电规协发布《2023年电力勘测设计行业统计分析与报告》,这个报告整整160页,看得是头昏眼花。 这个报告内容很多,整理出最关心和最关键的数据,展示给读者们。 要说大家最关心的肯定是排名啦,立马安排上,大家可以看看是否有自家公司,没有的赶紧跳槽哈,就照这个排名投简历。 一起看看全国电力设计院排行榜前十名吧: 1. 新签合同额前十名单位(入围门槛290.97亿元)分别为: 中国

一步步教你接入个推 推送

一: manifast中的配置 权限: <!-- 个推SDK权限配置开始 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permissi

【gitlab 上传代码】gitlab 推送本地代码到远程仓库

1、安装git。 2、新建项目,只勾选私有,或者公开,注意不要勾选readme 3、添加和配置SSH公钥 cd ~/.ssh如果提示 “ No such file or directory”,手动的创建一个 .ssh文件夹即可mkdir ~/.sshgit config --global user.name "赖德发"git config --global user.email "lai

UI 自动化技能:20个实战技巧!测试工程师必看!

大家周五 好啊!忙碌了一周,又可以懒洋洋躺在沙发上了~~~ 又到了每年的金九银十了,今天聊聊如何提升UI自动化话题... 你是否在求职过程中感受到UI自动化的技能不足? 随着测试行业的发展,UI自动化测试已成为每位测试工程师的必修课。无论你是想提升现有的测试效率,还是在找工作中获得竞争优势,掌握UI自动化技能都能为你带来巨大的帮助。那么,如何快速提升这些技能呢? UI(用户界面)自