iOS8无法弹出本地通知?

最近在看《iOS编程(第4版)》(就是Big Nerd Ranch用的那本教材)。这本书写的不错,推荐一下,写的很细致,循序渐进,不能不赞一下外国人写书的思路,确实跟国人不同。之前学Android的时候,看了《Android Programming The Big Nerd Ranch Guide》,虽然全英文看得有点慢,但是慢慢看觉得很有意思,对于有了一定基础的初学者,收获很大。回到这本国人翻译的iOS编程,中文翻译过来的一些词汇有点拗口,我表示有点记不住╭(╯^╰)╮,看到大段中文的时候,耐心不足。

言归正传,今天看到一处,关于添加Local Notification的,自己用XCode6进行构建的时候,出现了错误。

程序是在一个按钮的点击事件的响应方法中,注册本地通知。下面就是ViewController.m中的按钮响应方法。

1 -(IBAction)addReminder:(id)sender
2 {
3     NSDate *date=self.datePicker.date;
4     UILocalNotification *note=[[UILocalNotification alloc] init];
5     note.alertBody=@"Hypnotize me!";
6     note.fireDate=date;
7     [[UIApplication sharedApplication] scheduleLocalNotification:note];
8 }

构建之后,点击模拟器应用中的Button,没有弹出通知,而XCode却给出了下面的Debug信息。

2015-07-02 10:21:31.538 HypnoNerd[1185:42048] Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7fcd5be826b0>{fire date = Thursday, July 2, 2015 at 10:21:29 AM China Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = (null), user info = (null)} with an alert but haven‘t received permission from the user to display alerts

确认代码输入没有错,那么为什么会弹出这样的信息呢?抓住提示信息中的最后一句,有个关键词“permission”,瞬间感觉和写Android应用时候用到的permission很像呀。

上网查了一下,看到这边文章“iOS8系统下的无法弹出通知”,说是iOS8系统变更了注册方法(没错,我用的SDK是iOS 8.3)。用了作者的方法,确实解决了问题。

不过作者只写了解决办法,对于原因没有多做解释。

我到XCode的SDK Guide帮助文档 Local and Remote Notification Programming Guide: Registering, Scheduling, and Handling User Notifications

中,找到了Apple关于这个问题的说明。

In iOS 8 and later, apps that use either local or remote notifications must register the types of notifications they intend to deliver. The system then gives the user the ability to limit the types of notifications your app displays. The system does not badge icons, display alert messages, or play alert sounds if any of these notification types are not enabled for your app, even if they are specified in the notification payload.

在iOS8以及更高版本的iOS系统中,如果要用本地通知或者远程通知,必须要注册通知的类型,注册成功之后,系统才会给予用户传递通知(显示通知)的权限。

1     UIUserNotificationType type=UIUserNotificationTypeAlert;
2     UIUserNotificationSettings *settings=[UIUserNotificationSettings settingsForTypes:type categories:nil];
3     [[UIApplication sharedApplication] registerUserNotificationSettings:settings];

在ApplicationDelegate中注册通知之后,第一次运行App,会弹出一个对话框,询问用户是否允许这个App发送通知,用户点击“确认”后,App才能正常发送通知。

检讨一下自己,感觉到现在还没养成到官方的帮助文档寻找答案的习惯,一遇到问题就习惯找度娘╭(╯^╰)╮

时间: 2024-10-07 14:40:37

iOS8无法弹出本地通知?的相关文章

在iOS 8及以后使用UIAlertController 等各种弹出警告通知

原文转自:在iOS 8中使用UIAlertController 感谢作者分享,自我学习之用 iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸变化效果(比如说旋转)中发挥了重要的作用,它有效地节省了程序员们的工作量(天地良心啊).还有,某些旧的UIKit控件也同样发生了许多变化,比如说Alert Views.Action Sheets.Popove

iOS8 UIAlertController弹出框中添加视图(例如日期选择器等等)

UIDatePicker *datePicker = [[UIDatePicker alloc] init]; datePicker.datePickerMode = UIDatePickerModeDate; UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"\n\n\n\n\n\n\n\n\n\n\n\n" message:nil preferredStyle:UIAlertContro

Chrome插件:弹出桌面通知

if (window.Notification) { var popNotice = function() { if (Notification.permission == "granted") { var notification = new Notification("信息" , { body:"你好", // icon:图片地址, } ); notification.onclick = function() { notification.c

iOS8 本地通知基本用法

1.本地通知的定义和使用: 本地通知是UILocalNotification的实例,主要有三类属性: scheduled time,时间周期,用来指定iOS系统发送通知的日期和时间: notification type,通知类型,包括警告信息.动作按钮的标题.应用图标上的badge(数字标记)和播放的声音: 自定义数据,本地通知可以包含一个dictionary类型的本地数据. 对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略. 在iOS8 之前的本地

关于iOS8上本地通知接收不到的问题

在iOS8系统开发使用本地通知时,会出现如下的相关提示语: 1 Attempting to schedule a local notification2 with an alert but haven't received permission from the user to display alerts3 with a sound but haven't received permission from the user to play sounds …… 原因在于在iOS8系统上需要注册本

闹钟功能实现+本地通知+音频播放

问题描述:通过picker设置时间,到了设定好的时间 闹钟响起,并弹出提示框,点击确定,停止播放音频.如果设置好了闹钟,没有停在该页面,而是返回了手机主屏幕或是手机锁屏,当到了闹钟设定的时间,会弹出消息通知.(如果设定的时间是已经过去的时间,页面不会有响应,直到设置正确的时间为止.) 效果图如下:            具体代码如下: NaoZhongViewController.m文件 #import "NaoZhongViewController.h" #import <AV

js实现点击按钮弹出上传文件的窗口

转自:https://www.jb51.net/article/100916.htm 1.详细描述 在页面上设置一个"选择文件"按钮,点击该按钮,会弹出本地磁盘信息用于选择文件. 2.代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>

美团_ccListView选中Item的颜色修改及解决登陆后升级通知再次弹出的bug

实现,在listView Xml中设置 android:listSelector="@color/green" 2. 解决登陆后升级通知再次弹出的bug ①: MineFragment跳转到Login界面使用StartActivityForResult,而不是StartActivity: @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (data != n

Windows服务(system权限)程序显示界面与用户交互,Session0通知Session1里弹出对话框(真的很牛) good

源码资源下载:http://download.csdn.net/detail/stony1980/4512984 1.VC2008中编写“Windows服务”(Windows Service)程序 vc2008下新建一个 ATL 项目-> 选择创建一个“服务”类型的ATL 项目TestService,将生成如下代码, class CTestServiceModule : public CAtlServiceModuleT< CTestServiceModule, IDS_SERVICENAME