当一段时间没有使用一个APP的时候(例如消消乐, 熊猫读书等), 其都会自动的跳出一个通知, 告诉你多久没有用过这个app了,同时提醒你再次使用,目的是为其留住现有的用户.
本地通知,不像远程通知还要请求苹果APNs服务器,其推送消息的过程较为简单,下面探讨下具体的实现原理.
注意:如果苹果设备是ios8系统以上,需要请求通知,在AppDelegate.m的
<span style="font-size:14px;">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions</span>
这个方法中实现请求通知
<span style="font-size:14px;">//判断当前设备的系统 if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound; UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil]; // 注册通知类型 [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; }</span>
然后,可以在要实现通知的控制器中,具体实现通知的代码逻辑
第一步:创建本地通知;
第二步:设置本地通知的附带信息;
第三步:注册通知.
其中第二步中,通知的附带信息有
<span style="font-size:14px;">@property(nonatomic,copy) NSDate *fireDate; 指定通知发送的时间 @property(nonatomic,copy) NSTimeZone *timeZone; 指定发送通知的时区 @property(nonatomic) NSCalendarUnit repeatInterval; 重复的周期, 枚举 @property(nonatomic,copy) NSCalendar *repeatCalendar; 重复的周期 @property(nonatomic,copy) NSString *alertBody; 通知内容 @property(nonatomic) BOOL hasAction; 是否需要滑动事件 @property(nonatomic,copy) NSString *alertAction; 锁屏状态的标题 @property(nonatomic,copy) NSString *alertLaunchImage; 点击通知之后的启动图片 @property(nonatomic,copy) NSString *soundName; 收到通知播放的音乐 @property(nonatomic) NSInteger applicationIconBadgeNumber; 图标提醒数字 @property(nonatomic,copy) NSDictionary *userInfo; 额外的信息</span>
可以根据具体的要求,实现相关的信息,具体代码为:
<span style="font-size:14px;"> //1.创建本地通知对象 UILocalNotification *note = [[UILocalNotification alloc] init]; //1.1指定通知发送时间 note.fireDate = [NSDate dateWithTimeIntervalSinceNow:5]; //1.2指定通知内容 note.alertBody = @"本地通知测试"; //1.3锁屏状态的标题 note.alertAction = @"锁屏信息"; //1.4额外的信息 note.userInfo = @{ @"name":@"xiaoming", @"age":@"24" }; //2.注册通知 UIApplication *application = [UIApplication sharedApplication]; [application scheduleLocalNotification:note];</span>
当收到通知的信息的时候,系统会执行AppDelegate.m中的代理方法
<span style="font-size:14px;">// 接收到本地通知时就会调用 // 当程序在前台时, 会自动调用该方法 // 当程序 还后台时, 只有用户点击了通知才会调用 //如果应用程序是关闭状态会调用didFinishLaunchingWithOptions - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{ //获取通知的数据 NSLog(@"%@", notification.userInfo); } </span>
当应用程序是关闭状态会调用application:didFinishLaunchingWithOptionS
数据可以从launchOptions中取出