一.基本概念
- ios提供了兩種通知機(jī)制丛晌,本地通知仅炊,推送通知。
- 本地通知和推送通知可以讓不在前端運(yùn)行的程序告知用戶程序內(nèi)部發(fā)生的信息澎蛛。
- 通知的展示:播放聲音抚垄,更新應(yīng)用程序圖標(biāo)上的數(shù)字,顯示一個橫幅谋逻。
二.本地通知
- 通常使用本地通知呆馁,是在應(yīng)用程序退出到后臺調(diào)度的。應(yīng)用程序退出后臺之后毁兆,會在內(nèi)存中駐留10分鐘的時間浙滤,過了10分鐘,系統(tǒng)會自動清理應(yīng)用程序气堕。
- 在進(jìn)入后臺的方法中創(chuàng)建本地通知纺腊。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self loadNotification];
}
#pragma mark - 創(chuàng)建本地通知
- (void)loadNotification
{
UILocalNotification *notification = [[UILocalNotificationalloc]init];
// 5秒鐘之后觸發(fā)
notification.fireDate= [NSDatedateWithTimeIntervalSinceNow:5];
notification.alertBody= @"出大事了";
notification.soundName= UILocalNotificationDefaultSoundName;
notification.applicationIconBadgeNumber= 100;
notification.userInfo= @{@"userName": @"馬大哈", @"age": @(18)};
// 要調(diào)用本地通知,需要通過UIApplication來統(tǒng)一調(diào)度
[[UIApplication sharedApplication]scheduleLocalNotification:notification];
}
3.發(fā)送的通知怎么獲取本地通知
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
// 截獲本地通知茎芭,用戶通過通知的橫幅點(diǎn)擊進(jìn)入系統(tǒng)揖膜,字典中才能找到本地通知
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;
}
三.推送通知
消息推送服務(wù),簡稱APNS梅桩。
推送流程:首先應(yīng)用程序需要注冊接收消息,然后APNS會返回deciceToken摘投,將token保存到本地犀呼,提交開發(fā)商的數(shù)據(jù)服務(wù)器薇组,服務(wù)器保存用戶的token律胀,服務(wù)器向APNS發(fā)送消息炭菌,APNS發(fā)送消息給客戶的應(yīng)用程序黑低。
-
在獲取到token時酌毡,發(fā)送給開發(fā)商服務(wù)器之前枷踏,需要做一步優(yōu)化掰曾。
222.png Device Token的獲取旷坦,DeviceToken是由用戶手機(jī)發(fā)起請求時秒梅,由APNS生成的番电。注意:DeviceToken的生成機(jī)制可能隨時變化,最好方法每次獲取到deviceToken后这刷,與之前(如果有)的deviceToken進(jìn)行比較暇屋,如果發(fā)生變化咐刨,及時更新自己數(shù)據(jù)服務(wù)器上的記錄
4.1向APNS發(fā)送請求扬霜,即注冊應(yīng)用程序接收APNS推送消息
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 注冊應(yīng)用程序接收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. 從系統(tǒng)偏好取之前的token
NSData *oldToken = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"deviceToken"];
// 2. 新舊token進(jìn)行比較
if (![oldToken isEqualToData:deviceToken]) {
// 3. 如果不一致沸久,保存token到系統(tǒng)偏好
[[NSUserDefaultsstandardUserDefaults]setObject:deviceToken forKey:@"deviceToken"];
// 4. 使用post請求傳輸新舊token至服務(wù)器
// 1) url
// 具體的URL地址以及POST請求中的參數(shù)和格式卷胯,是由公司的后端程序員提供的
// 2) request POST body(包含新舊token的數(shù)據(jù))
// 3) connection 的異步
}
}