第一次接触IOS的本地通知的使用,看到别人写的一个比较详细的记录,自己整理过来,方便以后再次使用和拓展:

1.创建一个本地通知,添加到系统:

 // 初始化本地通知对象
UILocalNotification *notification = [[UILocalNotification alloc] init];
if (notification) {
// 设置通知的提醒时间
NSDate *currentDate = [NSDate date];
notification.timeZone = [NSTimeZone defaultTimeZone]; // 使用本地时区
notification.fireDate = [currentDate dateByAddingTimeInterval:5.0]; // 设置重复间隔
notification.repeatInterval = kCFCalendarUnitDay; // 设置提醒的文字内容
notification.alertBody = @"Wake up, man";
notification.alertAction = NSLocalizedString(@"起床了", nil); // 通知提示音 使用默认的
notification.soundName= UILocalNotificationDefaultSoundName; // 设置应用程序右上角的提醒个数
notification.applicationIconBadgeNumber++; // 设定通知的userInfo,用来标识该通知
NSMutableDictionary *aUserInfo = [[NSMutableDictionary alloc] init];
24 aUserInfo[kLocalNotificationID] = @"LocalNotificationID";
25 notification.userInfo = aUserInfo; // 将通知添加到系统中
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}

repeatInterval表示通知的重复间隔,在SDK中定义如下:

 typedef CF_OPTIONS(CFOptionFlags, CFCalendarUnit) {
kCFCalendarUnitEra = (1UL << ),
kCFCalendarUnitYear = (1UL << ),
kCFCalendarUnitMonth = (1UL << ),
kCFCalendarUnitDay = (1UL << ),
kCFCalendarUnitHour = (1UL << ),
kCFCalendarUnitMinute = (1UL << ),
kCFCalendarUnitSecond = (1UL << ),
kCFCalendarUnitWeek CF_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0) = (1UL << ),
kCFCalendarUnitWeekday = (1UL << ),
kCFCalendarUnitWeekdayOrdinal = (1UL << ),
kCFCalendarUnitQuarter CF_ENUM_AVAILABLE(10_6, 4_0) = (1UL << ),
kCFCalendarUnitWeekOfMonth CF_ENUM_AVAILABLE(10_7, 5_0) = (1UL << ),
kCFCalendarUnitWeekOfYear CF_ENUM_AVAILABLE(10_7, 5_0) = (1UL << ),
kCFCalendarUnitYearForWeekOfYear CF_ENUM_AVAILABLE(10_7, 5_0) = (1UL << ),
};

这里比较不好的一点是该值不能自定义(很遗憾,NSCalendarUnit是个枚举类型),例如你不能塞个10.0给它从而希望它每十秒重复一次。所以如果你想每20分钟发送一次通知,一小时内发送3次,那么只能同时设定三个通知了。

2.收到通知后委托内的自定义实现:

 -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
NSLog(@"Application did receive local notifications"); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"welcome" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}

3.如何取消(删除本地通知)

有一点需要注意,如果我们的应用程序给系统发送的本地通知是周期性的,那么即使把程序删了重装,之前的本地通知在重装时依然存在(没有从系统中移除)。

因此我们需要取消通知的方法,当然该对象也会在scheduledLocalNotifications数组中移除。

取消方法分为两种。

第一种比较暴力,直接取消所有的本地通知:

[[UIApplication sharedApplication] cancelAllLocalNotifications];

这个适合在App重装时第一次启动的时候,或还原程序默认设置等场合下使用。

第二种方法是针对某个特定通知的:

- (void)cancelLocalNotification:(UILocalNotification *)notification 

4.如何标识一个本地通知

需要通知有一个标识,这样我们才能定位是哪一个通知。可以在notification的userInfo(一个字典)中指定。

例如:

 -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
NSLog(@"Application did receive local notifications"); // 取消某个特定的本地通知
for (UILocalNotification *noti in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
NSString *notiID = noti.userInfo[kLocalNotificationID];
7 NSString *receiveNotiID = notification.userInfo[kLocalNotificationID];
if ([notiID isEqualToString:receiveNotiID]) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
return;
}
} UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"welcome" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}

当然使用上述本地通知的前提是,应用获取到了系统的通知权限,需要注册通知:

注册之前有两个前提条件必须准备好:

  • 开发配置文件(provisioning profile,也就是.mobileprovision后缀的文件)的App ID不能使用通配ID必须使用指定APP ID并且生成配置文件中选择Push Notifications服务,一般的开发配置文件无法完成注册;
  • 应用 程序的Bundle Identifier必须和生成配置文件使用的APP ID完全一致
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIDevice *device = [UIDevice currentDevice];
float sysVersion = [device.systemVersion floatValue];
if (sysVersion >= 8.0f) {
UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
if (UIUserNotificationTypeNone != setting.types) {
[self addLocalNotification];
NSLog(@"已经允许了通知");
}else{
[[UIApplication sharedApplication]registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
}else{
UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if(UIRemoteNotificationTypeNone != type){
NSLog(@"已经允许了通知");
}else{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationType)(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
} //[self registerRemoteNotification];
return YES;
} #pragma mark 调用过用户注册通知方法之后执行(也就是调用完registerUserNotificationSettings:方法之后执行)
-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
if (notificationSettings.types!=UIUserNotificationTypeNone) {
//[self addLocalNotification];
NSLog(@"允许了通知");
}
} - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"注册成功");
} - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"注册失败");
}

注:

  • 在使用通知之前必须注册通知类型,如果用户不允许应用程序发送通知,则以后就无法发送通知,除非用户手动到iOS设置中打开通知。
  • 本地通知是有操作系统统一调度的,只有在应用退出到后台或者关闭才能收到通知。(注意:这一点对于后面的推送通知也是完全适用的。 )
  • 通知的声音是由iOS系统播放的,格式必须是Linear PCM、MA4(IMA/ADPCM)、µLaw、aLaw中的一种,并且播放时间必须在30s内,否则将被系统声音替换,同时自定义声音文件必须放到boundle中。
  • 本地通知的数量是有限制的,最近的本地通知最多只能有64个,超过这个数量将被系统忽略。
  • 如果想要移除本地通知可以调用UIApplication的cancelLocalNotification:cancelAllLocalNotifications移除指定通知或所有通知。

从上面的程序可以看到userInfo这个属性我们设置了参数,那么这个参数如何接收呢?

在iOS中如果点击一个弹出通知(或者锁屏界面滑动查看通知),默认会自动打开当前应用。由于通知由系统调度那么此时进入应用有两种情况:

  • 如果应用程序已经完全退出那么此时会调用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法;
  • 如果此时应用程序还在运行(无论是在前台还是在后台)则会调用-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification方法接收消息参数。

当然如果是后者自然不必多说,因为参数中已经可以拿到notification对象,只要读取userInfo属性即可。如果是前者的话则可以访问launchOptions中键为UIApplicationLaunchOptionsLocalNotificationKey的对象,这个对象就是发送的通知,由此对象再去访问userInfo。为了演示这个过程在下面的程序中将userInfo的内容写入文件以便模拟关闭程序后再通过点击通知打开应用获取userInfo的过程。

 #pragma mark - 应用代理方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//添加通知
[self addLocalNotification]; //接收通知参数
UILocalNotification *notification=[launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
NSDictionary *userInfo= notification.userInfo; [userInfo writeToFile:@"/Users/kenshincui/Desktop/didFinishLaunchingWithOptions.txt" atomically:YES];
NSLog(@"didFinishLaunchingWithOptions:The userInfo is %@.",userInfo); return YES;
}

上面的程序可以分为两种情况去运行:

  • 一种是启动程序关闭程序,等到接收到通知之后点击通知重新进入程序;
  • 另一种是启动程序后,进入后台(其实在前台也可以,但是为了明显的体验这个过程建议进入后台),接收到通知后点击通知进入应用。

两种情况会分别按照前面说的情况调用不同的方法接收到userInfo写入本地文件系统。有了userInfo一般来说就可以根据这个信息进行一些处理,例如可以根据不同的参数信息导航到不同的界面,假设是更新的通知则可以导航到更新内容界面等。

IOS本地通知:UILocalNotification使用记录的更多相关文章

  1. IOS 本地通知 UILocalNotification

    IOS 本地通知 UILocalNotification [本文章第四部分中的代码逻辑来自网上的借鉴,并非我自己原创] 大概一个月前,我开始跟着做IOS项目了.学习C++,了解Objective-C, ...

  2. IOS 本地通知UILocalNotification

    //发送通知    UILocalNotification *notification=[[UILocalNotification alloc] init];       if (notificati ...

  3. iOS 本地通知 操作

    iOS 本地通知 操作 1:配置通知:然后退出程序: UILocalNotification *localNotif = [[UILocalNotification alloc] init]; loc ...

  4. 本地通知-UILocalNotification

    第一步:创建本地推送 本地通知 UILocalNotification // 创建⼀一个本地推送 UILocalNotification * notification = [[UILocalNotif ...

  5. ios推送:本地通知UILocalNotification

    Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notificati ...

  6. IOS本地通知

        发送通知: UILocalNotification *newNotification = [[UILocalNotification alloc] init]; if (newNotifica ...

  7. xamarin.ios 本地通知推送

    由于ios10版本以后UILocalNotification被标为弃用了,所以要添加新的本地通知推送功能,下面提供一些代码参考. 一.先在AppDelegate.cs上注册本地通知推送功能. publ ...

  8. iOS: 本地通知的前后变化(iOS10)

    一.介绍  通知和推送是应用程序中很重要的组成部分.本地通知可以为应用程序注册一些定时任务,例如闹钟.定时提醒等.远程推送则更强大,提供了一种通过服务端主动推送消息到客户端的方式,服务端可以更加灵活地 ...

  9. IOS 本地通知推送消息

    在现在的移动设备中,好多应用性的APP都用到了推送服务,但是有好多推送的内容,比如有的只是单纯的进行推送一个闹钟类型的,起了提醒作 用,有的则是推送的实质性的内容,这就分为推送的内容来区别用什么推送, ...

随机推荐

  1. 简单几何(判断矩形的位置) UVALive 7070 The E-pang Palace(14广州B)

    题目传送门 题意:给了一些点,问组成两个不相交的矩形的面积和最大 分析:暴力枚举,先找出可以组成矩形的两点并保存起来(vis数组很好),然后写个函数判断四个点是否在另一个矩形内部.当时没有保存矩形,用 ...

  2. C#中 As 和强制转换的总结

    1.1.1 摘要 C#是一门强类型语言,一般情况下,我们最好避免将一个类型强制转换为其他类型,但有些时候难免要进行类型转换. 先想想究竟哪些操作可以进行类型转换(先不考虑.NET提供的Parse),一 ...

  3. BZOJ3834 : [Poi2014]Solar Panels

    问题相当于找到一个最大的k满足在$[x_1,x_2]$,$[y_1,y_2]$中都有k的倍数 等价于$\frac{x_2}{k}>\frac{x_1-1}{k}$且$\frac{y_2}{k}& ...

  4. BZOJ3679 : 数字之积

    设f[i][p2][p3][p5][p7][j][k]表示前i位,2,3,5,7的次数,前i位是否等于x,是否有数字的方案数 然后数位DP即可,ans=cal(r)-cal(l) #include&l ...

  5. storm源码之一个class解决nimbus单点问题【转】

    本文导读: storm nimbus 单节点问题概述 storm与解决nimbus单点相关的概念 nimbus目前无法做到多节点的原因 解决nimbus单点问题的关键 业界对nimbus单点问题的努力 ...

  6. 模板模式(C++) 【转】

    模板模式(template)在面向对象系统的设计和开发过程中,一定会有这样的情况:对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的,这就是模板(template)模式的用武之地,我 ...

  7. HDU 4417 Super Mario(划分树+二分)

    题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...

  8. COJ 删除数字

    试题描述 输入正整数N和M,在N中删除掉M位,能留下的最大整数是多少? 输入 正整数N和M 输出 留下的最大整数 输入示例 233390323 5 输出示例 9323 其他说明 1<=N< ...

  9. OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化

    OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的 ...

  10. java 遍历文件夹里的文件

    Java遍历文件夹的2种方法: A.不使用递归: import java.io.File; import java.util.LinkedList; public class FileSystem { ...