一、NSNotification是系统内部发出通知,通常用于内部事件的监听,或者状态的改变等等,是不可见的
二、本地通知与远程通知是可见的,主要用于告知用户或者发送一些App的内容更新,推送一些相关的消息,让用户知道App内部发生了什么事情。面试
一、本地推送通知:(Local Notification)
二、远程推送通知:(Remote Notification)服务器
1.设置音效,(提醒做用)
2.设置横幅,
3.设置弹窗,
4.锁屏下也能够呈现,
5.App图标的数字 (即新内容的数量)
至于显示横幅或者弹窗,取决于用户的设置
iOS手机设置中:通知中心-选择应用-选择应用下的通知模式-OK!app
一、App在前台运行的时候,通知不会展现出来
二、点击通知,默认会自动打开推送通知的App
三、无论App是否打开,通知均可以如期发出less
不须要联网就能够发出的通知
使用场景:
提醒用户完成一些任务,好比:定时提醒,生活备注,看电影等等iphone
// 枚举值-发出通知的时间(有局限性) @property(nonatomic) NSCalendarUnit repeatInterval; // 自定义-发出通知的时间(能够自由设定时间) @property(nonatomic,copy) NSCalendar *repeatCalendar; // 区域-建立只须要建立一个中心点与半径就能够了 @property(nonatomic,copy) CLRegion *region // 进入区域发出一个通知,设置yes,只会发出一个通知,设置NO就会每次进入这个区域都发送 @property(nonatomic,assign) BOOL regionTriggersOnce NO // 设置通知的内容 @property(nonatomic,copy) NSString *alertBody; // 决定alertAction是否生效 @property(nonatomic) BOOL hasAction; // 设置滑块的文字 @property(nonatomic,copy) NSString *alertAction; // 设置点击通知的启动图片(通常设置App启动图片后,这里能够随便写) @property(nonatomic,copy) NSString *alertLaunchImage; // 设置alertTitle,就是通知内容上面的文字 @property(nonatomic,copy) NSString *alertTitle // 设置弹出的声音 @property(nonatomic,copy) NSString *soundName; // 设置App的消息条数 @property(nonatomic) NSInteger applicationIconBadgeNumber; // 设置通知一些额外数据 @property(nonatomic,copy) NSDictionary *userInfo;
// 1.建立本地通知 UILocalNotification *localNote = [[UILocalNotification alloc] init]; // 2.设置本地通知的内容 // 2.1.设置通知发出的时间 localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0]; // 2.2.设置通知的内容 localNote.alertBody = @"在干嘛?"; // 2.3.设置滑块的文字(锁屏状态下:滑动来“解锁”) localNote.alertAction = @"解锁"; // 2.4.决定alertAction是否生效 localNote.hasAction = NO; // 2.5.设置点击通知的启动图片 localNote.alertLaunchImage = @"123Abc"; // 2.6.设置alertTitle localNote.alertTitle = @"你有一条新通知"; // 2.7.设置有通知时的音效 localNote.soundName = @"buyao.wav"; // 2.8.设置应用程序图标右上角的数字 localNote.applicationIconBadgeNumber = 999; // 2.9.设置额外信息 localNote.userInfo = @{@"type" : @1}; // 3.调用通知 [[UIApplication sharedApplication] scheduleLocalNotification:localNote]; }
使用注意:
iOS7,不须要用户受权就可发出通知,而iOS8之后,必须用户受权才能够发出通知fetch
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 设置应用程序的图标右上角的数字 [application setApplicationIconBadgeNumber:0]; if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [application registerUserNotificationSettings:settings]; } // 界面的跳转(针对应用程序被杀死的状态下的跳转) // 杀死状态下的,界面跳转并不会执行下面的方法- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification, // 因此咱们在写本地通知的时候,要在这个与下面方法中写,但要判断,是经过哪一种类型通知来打开的 if (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]; } return YES; }
监听通知,若是用户打开通知,可让用户进入一些特定的界面ui
/* 应用程序在进入前台,或者在前台的时候都会执行该方法 */ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { // 必需要监听--应用程序在后台的时候进行的跳转 if (application.applicationState == UIApplicationStateInactive) { NSLog(@"进行界面的跳转"); // 若是在上面的通知方法中设置了一些,能够在这里打印额外信息的内容,就作到监听,也就能够根据额外信息,作出相应的判断 NSLog(@"%@", notification.userInfo); // UIView *redView = [[UIView alloc] init]; redView.frame = CGRectMake(0, 0, 100, 100); redView.backgroundColor = [UIColor redColor]; [self.window.rootViewController.view addSubview:redView]; } }
从远程服务器推送给客户端的通知(须要联网)
远程推送服务---就是APNs
模拟器没法调试远程推送atom
解决获取传统数据的局限性,让数据实时更新spa
聊天功能(通常非即时聊天)、推送一下App的内部新功能、版本下载等3d
长链接的做用:
时间效准、系统升级、查找个人iphone、远程通知
好处:
数据传输快、数据保持最新状态
我在面试中通常也比较喜欢问面试者这个问题。能解释清楚确定就有货真价实的开发经验
一、获取苹果得到deviceToken-获取手机UDID+应用的惟一标识(bundel ID)
二、获得苹果返回的deviceToken
三、发送deviceToken给公司的服务器
四、监听用户对通知的点击
一、真机
二、调试推送须要的证书文件
证书本身配置。。。
三、发布具备推送服务的App
包含推送的cer证书+某个具备发布资格的电脑,就能够发布
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; } else { // iOS7 [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert]; } // 根据远程通知经过UIApplicationLaunchOptionsRemoteNotificationKey打开的状况来进行 if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) { // 跳转 // 添加一个红色的View } return YES; }
// 获取DeviceToken - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // 将DeviceToken传给服务器 NSLog(@"%@", deviceToken.description); }
// 正常接到远程通知的时候会调用这个方法 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"%@", userInfo); // 正常打开推送后, }
// 后台操做(根据收到推送,让程序本身执行一些操做,无论用户是否点击推送) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"---------"); UIView *redV = [[UIView alloc] init]; redView.backgroundColor = [UIColor redColor]; redView.frame = CGRectMake(100, 100, 100, 100); [self.window.rootViewController.view addSubview:redV]; // 1.打开后台模式 2.告诉系统是否有新内容的更新 3.发送的通知有固定的格式("content-available":"1") // 2.告诉系统有新内容 completionHandler(UIBackgroundFetchResultNewData); }
completionHandler(UIBackgroundFetchResultNewData);
("content-available":"1")
找的这张图:也有相应的模拟推送代码,须要的能够联系我
通常开发中直接使用(jpush)激光推送就能够快速完成App的推送功能。具体按照官方文档来进行.(有空会写一篇专门针对激光推送的文稿)