三、进行通知用户权限申请与创建普通的本地通知
要在iOS系统中使用通知,必须获取到用户权限,UserNotification框架中申请通知用户权限需要通过UNNotificationCenter来完成,示例如下:
//进行用户权限的申请
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge|UNAuthorizationOptionSound|UNAuthorizationOptionAlert|UNAuthorizationOptionCarPlay completionHandler:^(BOOL granted, NSError * _Nullable error) {
//在block中会传入布尔值granted,表示用户是否同意
if (granted) {
//如果用户权限申请成功,设置通知中心的代理
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
}
}];
申请用户权限的方法中需要传入一个权限内容的参数,其枚举定义如下:
typedef NS_OPTIONS(NSUInteger, UNAuthorizationOptions) {
//允许更新app上的通知数字
UNAuthorizationOptionBadge = (1 << 0),
//允许通知声音
UNAuthorizationOptionSound = (1 << 1),
//允许通知弹出警告
UNAuthorizationOptionAlert = (1 << 2),
//允许车载设备接收通知
UNAuthorizationOptionCarPlay = (1 << 3),
};
获取到用户权限后,使用UserNotification创建普通的通知,示例代码如下:
//通知内容类
UNMutableNotificationContent * content = [UNMutableNotificationContent new];
//设置通知请求发送时 app图标上显示的数字
content.badge = @2;
//设置通知的内容
content.body = @"这是iOS10的新通知内容:普通的iOS通知";
//默认的通知提示音
content.sound = [UNNotificationSound defaultSound];
//设置通知的副标题
content.subtitle = @"这里是副标题";
//设置通知的标题
content.title = @"这里是通知的标题";
//设置从通知激活app时的launchImage图片
content.launchImageName = @"lun";
//设置5S之后执行
UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];
UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:@"NotificationDefault" content:content trigger:trigger];
//添加通知请求
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
}];
效果如下面图示:
四、通知音效类UNNotificationSound
通知可以进行自定义的音效设置,其中方法如下:
//系统默认的音效
+ (instancetype)defaultSound;
//自定义的音频音效
/*
注意,音频文件必须在bundle中或者在Library/Sounds目录下
*/
+ (instancetype)soundNamed:(NSString *)name __WATCHOS_PROHIBITED;
五、通知触发器UNNotificationTrigger
通知触发器可以理解为定义通知的发送时间,UNNotificationTrigger是触发器的基类,具体的触发器由它的四个子类实现,实际上,开发者在代码中可能会用到的触发器只有三种,UNPushNotificationTrigger远程推送触发器开发者不需要创建使用,远程通知有远程服务器触发,开发者只需要创建与本地通知有关的触发器进行使用。
1.UNTimeIntervalNotificationTrigger
UNTimeIntervalNotificationTrigger是计时触发器,开发者可以设置其在添加通知请求后一定时间发送。
//创建触发器 在timeInterval秒后触发 可以设置是否循环触发
+ (instancetype)triggerWithTimeInterval:(NSTimeInterval)timeInterval repeats:(BOOL)repeats;
//获取下次触发的时间点
- (nullable NSDate *)nextTriggerDate;
2.UNCalendarNotificationTrigger
UNCalendarNotificationTrigger是日历触发器,开发者可以设置其在某个时间点触发。
//创建触发器 设置触发时间 可以设置是否循环触发
+ (instancetype)triggerWithDateMatchingComponents:(NSDateComponents *)dateComponents repeats:(BOOL)repeats;
//下一次触发的时间点
- (nullable NSDate *)nextTriggerDate;
3.UNLocationNotificationTrigger
UNLocationNotificationTrigger是地域触发器,开发者可以设置当用户进入某一区域时触发。
//地域信息
@property (NS_NONATOMIC_IOSONLY, readonly, copy) CLRegion *region;
//创建触发器
+ (instancetype)triggerWithRegion:(CLRegion *)region repeats:(BOOL)repeats __WATCHOS_PROHIBITED;
六、为通知内容添加附件
附件主要指的是媒体附件,例如图片,音频和视频,为通知内容添加附件需要使用UNNotificationAttachment类。示例代码如下:
//创建图片附件
UNNotificationAttachment * attach = [UNNotificationAttachment attachmentWithIdentifier:@"imageAttach" URL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"2" ofType:@"jpg"]] options:nil error:nil];
UNMutableNotificationContent * content = [UNMutableNotificationContent new];
//设置附件数组
content.attachments = @[attach];
content.badge = @1;
content.body = @"这是iOS10的新通知内容:普通的iOS通知";
//默认的通知提示音
content.sound = [UNNotificationSound defaultSound];
content.subtitle = @"这里是副标题";
content.title = @"这里是通知的标题";
//设置5S之后执行
UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];
UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:@"NotificationDefaultImage" content:content trigger:trigger];
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
}];
效果如下图:
需要注意,UNNotificationContent的附件数组虽然是一个数组,但是系统的通知模板只能展示其中的第一个附件,设置多个附件也不会有额外的效果,但是如果开发者进行通知模板UI的自定义,则此数组就可以派上用场了。音频附件界面如下:
需要注意,添加附件的格式和大小都有一定的要求,如下表格所示:
创建通知内容附件UNNotificationAttachment实例的方法中有一个options配置字典,这个字典中可以进行配置的键值对如下:
//配置附件的类型的键 需要设置为NSString类型的值,如果不设置 则默认从扩展名中推断
extern NSString * const UNNotificationAttachmentOptionsTypeHintKey __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);
//配置是否隐藏缩略图的键 需要配置为NSNumber 0或者1
extern NSString * const UNNotificationAttachmentOptionsThumbnailHiddenKey __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);
//配置使用一个标准的矩形来对缩略图进行裁剪,需要配置为CGRectCreateDictionaryRepresentation(CGRect)创建的矩形引用
extern NSString * const UNNotificationAttachmentOptionsThumbnailClippingRectKey __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);
//使用视频中的某一帧作为缩略图 配置为NSNumber时间
extern NSString * const UNNotificationAttachmentOptionsThumbnailTimeKey __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);