iOS10.0以后苹果要求本地推送使用UserNotification框架来做本地推送, 下文就该框架下做推送以及自定义推送声音做下介绍

1.AppDelegate.m:

1.导入框架并遵循协议:

#import <UserNotifications/UserNotifications.h>@interface AppDelegate ()<UNUserNotificationCenterDelegate>

2.修改或添加以下方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// 获取版本号CGFloat version = [[UIDevice currentDevice].systemVersion doubleValue];// 注册本地推送if (version >= 8.0 && version< 10.0) {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0if ([[UIApplication sharedApplication]currentUserNotificationSettings].types==UIUserNotificationTypeNone) {UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];[application registerUserNotificationSettings:settings];}
#endif}else if(version >= 10.0){// 使用 UNUserNotificationCenter 来管理通知UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];//监听回调事件center.delegate = self;// 获取当前的通知设置,UNNotificationSettings 是只读对象,不能直接修改,只能通过以下方法获取[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {NSLog(@"%@", settings);}];//iOS 10.0以上 使用以下方法注册,才能得到授权[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {// Enable or disable features based on authorization.NSLog(@"%d", granted);}];}// 界面的跳转(针对应用程序被杀死的状态下的跳转)// 杀死状态下的,界面跳转并不会执行下面的方法- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification,// 所以我们在写本地通知的时候,要在这个与下面方法中写,但要判断,是通过哪种类型通知来打开的// iOS 10之前
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {// 跳转代码UILabel *redView = [[UILabel alloc] init];redView.frame = CGRectMake(0, 0, 200, 300);redView.numberOfLines = 0;redView.font = [UIFont systemFontOfSize:12.0];redView.backgroundColor = [UIColor redColor];redView.text = [NSString stringWithFormat:@"%@", launchOptions];[self.window.rootViewController.view addSubview:redView];}
#endif// iOS 10之后直接使用代理方法:- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandlerreturn YES;}//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
/*应用程序在进入前台,或者在前台的时候都会执行该方法*/
// iOS10.0之前[4.0, 10.0]使用下面的方法
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{// 必须要监听--应用程序在后台的时候进行的跳转// 应用程序在后台, 用户点击推送的消息后if (application.applicationState == UIApplicationStateInactive) {NSLog(@"进行界面的跳转");// 如果在上面的通知方法中设置了一些,可以在这里打印额外信息的内容,就做到监听,也就可以根据额外信息,做出相应的判断UIView *redView = [[UIView alloc] init];redView.frame = CGRectMake(0, 0, 100, 100);redView.backgroundColor = [UIColor redColor];[self.window.rootViewController.view addSubview:redView];}NSLog(@"%@", notification.userInfo);
}
#endif
#pragma mark - UNUserNotificationCenterDelegate
// iOS10.0之后使用下面的方法(注意:iOS10.0以后, 无论app是否在前台(前台, 后台, 杀掉), 点击推送消息后都会触发这个方法)
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{UNNotificationContent *content=response.notification.request.content;NSLog(@"title: %@, body: %@, sound: %@", content.title, content.body, content.sound);UILabel *cyanLabel = [[UILabel alloc] init];cyanLabel.frame = CGRectMake(0, 20, 200, 300);cyanLabel.text=content.body;cyanLabel.backgroundColor = [UIColor cyanColor];[self.window.rootViewController.view addSubview:cyanLabel];completionHandler();
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑#pragma mark - UNUserNotificationCenterDelegate
//在展示通知前进行处理,即有机会在展示通知前再修改通知内容。
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{//1. 处理通知//2. 处理完成后调用 completionHandler ,用于指示在前台显示通知的形式completionHandler(UNNotificationPresentationOptionAlert);
}

2.需要触发本地推送的地方(以ViewController.m为例):

1.导入框架:

#import <UserNotifications/UserNotifications.h>

2.定义本地推送方法:

- (IBAction)push:(UIButton *)sender {// ios 10之前CGFloat version = [[UIDevice currentDevice].systemVersion doubleValue];// 注册本地推送if (version >= 8.0 && version< 10.0) {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0// 10.0之前推送设置...// ...}else if(version >= 10.0){// 使用 UNUserNotificationCenter 来管理通知UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];//需创建一个包含待通知内容的 UNMutableNotificationContent 对象,注意不是 UNNotificationContent ,此对象为不可变对象。UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];content.title = [NSString localizedUserNotificationStringForKey:@"Hello!" arguments:nil];content.body = [NSString localizedUserNotificationStringForKey:@"Hello_message_body"arguments:nil];// 使用定制声音content.sound=[UNNotificationSound soundNamed:@"unbelievable.caf"];// 默认声音// content.sound =[UNNotificationSound defaultSound];// 在 alertTime 后推送本地推送UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTriggertriggerWithTimeInterval:3.0f repeats:NO];UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"content:content trigger:trigger];//添加推送成功后的处理![center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"本地通知" message:@"成功添加推送" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:nil];[alert addAction:cancelAction];[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];}];}
}

注意:

1.用作自定义声音的音频文件有以下要求:

自定义的弹框铃声是由系统设备播放的, 所以铃声应当是以下数据格式:
Linear PCMMA4 (IMA/ADPCM)µLawaLaw
你可以将音频数据打包成一个aiff, wav, 或者caf的文件. 铃声文件的音频长度应少于30秒, 否则将设置无效而播放默认的铃声.苹果原文:
Custom alert sounds are played by the system sound facility, so they must be in one of the following audio data formats:Linear PCMMA4 (IMA/ADPCM)µLawaLawYou can package the audio data in an aiff, wav, or caf file. Sound files must be less than 30 seconds in length. If the sound file is longer than 30 seconds, the system plays the default sound instead. 

2.将音频文件拖入工程中后, 务必确认下文件在Target–Build Phases–Copy Bundle Resources中是否已经显示(未显示, 你需要手动拖到此列表).

弹框效果图:

iOS 本地推送以及自定义推送声音相关推荐

  1. 第一篇博客:极光推送以及自定义推送声音

    极光注册就不说了,首先配置App的build.grandle 在defaultConfig里粘贴一下内容appkey为我在极光注册之后的Appkey 然后配置AndroidManifest  把下面这 ...

  2. 微信每日早安推送,自定义推送名称,企业号推送非订阅号测试号,python源码,无需第三方多个网站注册、无第三方接口,无基础快速上不了手

    手把手教你微信每日推送早安,目前为止效果最好版本. 先看效果吧 消息内容样式: 开始搞起来 基础搭建·企业微信 第一步:注册企业微信 然后获取企业ID:点击上面我的企业,在页面最下面有一个企业ID,也 ...

  3. 超简单易上手无门槛:微信早安推送+定时任务自定义配置送。

    一.引言(废话) 躺着床上辗转反侧之余,拿着手机刷起来了小红书.突然标题名为"程序员给的安全感,给女朋友定制一个每天的早安定时推送!!!"一下子就引起了我的兴趣.简单浏览之后,我决 ...

  4. uni-app 语音播报-前台后台离线推送语音播报、到账xx元、收款播报、自定义推送铃(ios)

    uni-app 语音播报-前台后台离线推送语音播报.到账xx元.收款播报.自定义推送铃(ios):https://ext.dcloud.net.cn/plugin?id=8452

  5. 关于iOS自定义推送消息铃声

    近期接触到一个项目,要求app在后台的时候,当app接收到推送消息时能播放一段音乐,正常的的推送消息逻辑只有当用户点击消息栏才能触发相关的方法,此时我就想到用自定义推送铃声的方法来解决这个问题. 推送 ...

  6. iOS 推送通知及推送扩展

    概述 iOS中的通知包括本地推送通知和远程推送通知,两者在iOS系统中都可以通过弹出横幅的形式来提醒用户,点击横幅会打开应用.在iOS 10及之后版本的系统中,还支持通知扩展功能(UNNotifica ...

  7. IOS开发之实现App消息推送(最新)

    IOS开发之实现App消息推送(最新) 标签: 推送最新AppStoreXCode6ios开发 2014-11-19 21:13  58412人阅读  评论(77)  收藏  举报   分类: IOS ...

  8. Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

    Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...

  9. uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)

    你懂的,又是项目用到了,作为程序猿义无反顾需要定时 "进化" ,硬头皮去写,虽然曾经作为android开发者写了很多的推送,但是uniapp的推送也是有所差异的,记录一下,以后留用 ...

  10. 腾讯信鸽自定义推送通知

    使用信鸽的过程,感觉一路艰辛,各种坑,想必各位使用过的也是深有体会的吧.而且官方文档也太简洁了.demo功能也不全,没办法只能自己摸索着来,这不刚把自定义通知弄明白,就给各位看官献上来了. 1. XG ...

最新文章

  1. C#实现对象的Xml格式序列化及反序列化
  2. 程序员转型AI,这里有最全的机器学习介绍+应用实例
  3. WebApi跨域的解决方法
  4. 动态为程序指定快捷键
  5. wpf控件设计时支持(1)
  6. 产品经理该如何全局思考和分析行业产业链?
  7. 天翼云从业认证(3.6)了解天翼云大数据SaaS服务
  8. linux进入命令是什么,linux进入目录的命令是什么
  9. 前端学习(1527):过渡---文档分析
  10. 面向对象之: 类空间问题及类之间的关系
  11. Java中Date, Calendar, SimpleDateFormat的相互转换
  12. oracle add命令详解,oracle job详解
  13. 成为一名优秀架构师有标准吗?这12点或许能带给你一些启发
  14. python deap_在Python中用DEAP绘制多目标pareto边界
  15. 11月全国程序员平均工资最新出炉,网友:我丢了同行的脸
  16. vscode 力扣插件
  17. HHL论文第三弹(参数讨论)
  18. java输入十个,键盘输入十个数,输出最大数
  19. 给大忙人看的码农翻身记
  20. 200佳优秀的精美网页欣赏网站推荐(系列八)

热门文章

  1. vue 表单验证 支持6位小写字母和数字组合,必须包含2位字母
  2. 解析FL Studio冻结小技巧
  3. 无论PC还是Mac,都能畅快地使用移动硬盘
  4. 每天学一点Scala之 take、takeRight、takeWhile 与 filter
  5. 二叉树遍历非递归写法
  6. moonmq: 用go实现的高性能message queue
  7. Ubuntu 64-bit下搭建 Apache 2、PHP5、MySQL、GO Web服务器
  8. 图像处理软件Acorn for Mac如何创建新图像?
  9. 安装和客户端证书颁发---puppet系列
  10. 2.移植3.4内核-支持烧写yaffs2,裁剪内核并制作补丁