一.基本概念
- ios提供了两种通知机制,本地通知,推送通知。
- 本地通知和推送通知可以让不在前端运行的程序告知用户程序内部发生的信息。
- 通知的展示:播放声音,更新应用程序图标上的数字,显示一个横幅。
二.本地通知
- 通常使用本地通知,是在应用程序退出到后台调度的。应用程序退出后台之后,会在内存中驻留10分钟的时间,过了10分钟,系统会自动清理应用程序。
- 在进入后台的方法中创建本地通知。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self loadNotification];
}
#pragma mark - 创建本地通知
- (void)loadNotification
{
UILocalNotification *notification = [[UILocalNotificationalloc]init];
// 5秒钟之后触发
notification.fireDate= [NSDatedateWithTimeIntervalSinceNow:5];
notification.alertBody= @"出大事了";
notification.soundName= UILocalNotificationDefaultSoundName;
notification.applicationIconBadgeNumber= 100;
notification.userInfo= @{@"userName": @"马大哈", @"age": @(18)};
// 要调用本地通知,需要通过UIApplication来统一调度
[[UIApplication sharedApplication]scheduleLocalNotification:notification];
}
3.发送的通知怎么获取本地通知
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
// 截获本地通知,用户通过通知的横幅点击进入系统,字典中才能找到本地通知
UILocalNotification *notification =launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
// 判断通知是否存在
if (notification) {
NSLog(@"%@", notification.userInfo);
[notification.userInfowriteToFile:@"/users/apple/Desktop/123.plist"atomically:YES];
}
self.window= [[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]];
self.window.backgroundColor= [UIColorwhiteColor];
[self.windowmakeKeyAndVisible];
return YES;
}
三.推送通知
消息推送服务,简称APNS。
推送流程:首先应用程序需要注册接收消息,然后APNS会返回deciceToken,将token保存到本地,提交开发商的数据服务器,服务器保存用户的token,服务器向APNS发送消息,APNS发送消息给客户的应用程序。
-
在获取到token时,发送给开发商服务器之前,需要做一步优化。
Device Token的获取,DeviceToken是由用户手机发起请求时,由APNS生成的。注意:DeviceToken的生成机制可能随时变化,最好方法每次获取到deviceToken后,与之前(如果有)的deviceToken进行比较,如果发生变化,及时更新自己数据服务器上的记录
4.1向APNS发送请求,即注册应用程序接收APNS推送消息
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 注册应用程序接收APNS推送的消息
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound];
self.window= [[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]];
self.window.backgroundColor= [UIColorwhiteColor];
[self.windowmakeKeyAndVisible];
return YES;
}
4.2 获取Device Token。
#pragma mark - 获取DeviceToken
- (void)application:(UIApplication*)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSLog(@"%@", deviceToken);
// 1. 从系统偏好取之前的token
NSData *oldToken = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"deviceToken"];
// 2. 新旧token进行比较
if (![oldToken isEqualToData:deviceToken]) {
// 3. 如果不一致,保存token到系统偏好
[[NSUserDefaultsstandardUserDefaults]setObject:deviceToken forKey:@"deviceToken"];
// 4. 使用post请求传输新旧token至服务器
// 1) url
// 具体的URL地址以及POST请求中的参数和格式,是由公司的后端程序员提供的
// 2) request POST body(包含新旧token的数据)
// 3) connection 的异步
}
}