关于通知的一些见解,可能现在有好多初学者分不清远程推送、本地通知、和通知(通知中心一系列的)。(本文的推送采取苹果自带推送apns,采用三方推送不在此文范围)
远程推送大家大概是没什么问题
无非就那么几行固定代码
1注册远程推送、
1.1注册
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil];
[[UIApplication sharedApplication] registerForRemoteNotifications];
[[UIApplication sharedApplication] registerUserNotificationSettings:uns];
} else {
UIRemoteNotificationType apn_type = (UIRemoteNotificationType)(UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge);
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:apn_type];
}
}
1.2注册回调
注册成功
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;此方法选用{
就是注册通知设置成功后你想干啥
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED{
纪录下deviceToken 发送该服务器
}
注册失败
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED{
}
2、然后就坐等通知来
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userinfo
{
//这里面是 收到通知的操作
*//这个要注意程序在后台还是在前台,因为只有在后台的时候才会有弹框和声音,当你点击弹框时才会走这个方法;程序在前台时没有弹框和提示,如果想要app有提示,可以再次方法体自行内实现弹框等,但是要注意程序在后台已经有弹框当进入前台时又执行该方法时又会弹出自己写的坦框等,所以要进行判断,具体判断不说了,提示一点在app生命周期方法里进行处理。
}
下面讲与远程推送相对应的本地通知,什么是本地通知,NSnsnotification?或者NSnotificationcenter?是吗?并非如此远程推送全称是什么?
UIremotenotification 注意到了吗!一个时NS开头一个是UI开头!两个完全没有关系,都他妈不是一个框架的东西!
那么本地通知是什么呢UI这个是必须有的吧,是的是UIlocalnotification
怎么用,他跟远程推送相似也要注册通知的的样式和注册通知,但是有一点,远程推送的i 通知由服务器生成,本地通知呢需要你自己初始化
代码如下
-(void)registerLocalNotification{//本地通知的注册可以在随意那个可执行代码块里
notify = [[UILocalNotification alloc] init];
notify.repeatCalendar = [NSCalendar currentCalendar];
notify.hasAction = YES;
notify.soundName = @"hh.caf";//此音乐必须copy到项目文件
notify.timeZone = [NSTimeZone systemTimeZone];
notify.alertAction = @"知道了";
notify.alertBody = @"时间到啦";
notify.alertTitle =@"闹钟";
NSDate *date = [NSDate dateWithTimeInterval:time sinceDate:[NSDate date]];
notify.fireDate = date;
[[UIApplication sharedApplication] scheduleLocalNotification:notify];//在这里注册
}
然后呢又到了爽歪歪的时候,坐等通知
appdelegate里面
applicationdidrecieveLocalnotification
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
if (front) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"闹钟" message:@"时间到啦" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[alert dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:action];
[_window.rootViewController presentViewController:alert animated:YES completion:nil];
NSLog(@"收到通知");
}
[application cancelAllLocalNotifications];
}
前面说过远程通知的前后台问题,本地通知与远程推送一样有这个问题
可以看到我在代码里判断的front那个变量吗,他是啥,下面揭秘他的用法,个人的用法,也可能你有自己的更好的用法
@interface AppDelegate ()
{
BOOL front;
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
front = NO;
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
front = YES;
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
game over,谢谢!