APNs
說(shuō)起蘋果設(shè)備的push推送服務(wù)就要提到蘋果公司偉大的一個(gè)架構(gòu)設(shè)計(jì) APNs(Apple Push Notification Service)。蘋果設(shè)備收到的 push消息實(shí)際上是由APNs向設(shè)備推送的膝舅,并不是直接由開(kāi)發(fā)者向用戶本身推送消息谊迄。有了APNs開(kāi)發(fā)者需要做的只是將DeviceToken和消息內(nèi)容發(fā)送到APNs服務(wù)器,其它都是APNs服務(wù)器完成的豆励。具體過(guò)程如下:
Provider 是自己應(yīng)用服務(wù)器夺荒。
1.客戶端向蘋果公司注冊(cè)push證書(shū)。
2.APNs會(huì)給客戶端返回一個(gè)deviceToken 良蒸。
3.客戶端將deviceToken上傳給Provide技扼。
4.Provider將deviceToken和通知內(nèi)容發(fā)送給APNs。
5.APNs根據(jù)deviceToken查找指定的設(shè)備嫩痰,將通知推送給設(shè)備剿吻。
6.設(shè)備收到通知后根據(jù)SSL證書(shū)判斷這個(gè)push通知是發(fā)個(gè)那個(gè)應(yīng)用。
客戶端部署
更新到iOS 10 之后串纺,Xcode就不需要再兼容iOS 7 丽旅,然而iOS 8 的push系統(tǒng)還是跟iOS 10 不一樣的椰棘。這邊還是要做一下處理。
1.push證書(shū)生成
向蘋果公司注冊(cè)push證書(shū)魔招。在蘋果開(kāi)發(fā)者中心生成push證書(shū)并下載晰搀,將相關(guān)證書(shū)文件添加到Xcode中。
2.注冊(cè)通知
客戶端向系統(tǒng)注冊(cè)通知
- (void)registerPushNotification
{
#if !TARGET_IPHONE_SIMULATOR
if (OSVersionIsAtLeastiOS10()) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if(granted & !error){
[[UIApplication sharedApplication] registerForRemoteNotifications];
// [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
// // todo 可以獲取用戶設(shè)定信息
// }];
}else{
//點(diǎn)擊不允許
DDLogWarn(@"User Close Notification.");
}
}];
}else {
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
}
// else{ // iOS 7
// [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
// }
#else
DDLogWarn(@"Simulator not support push");
#endif
}
3.devToken
向系統(tǒng)注冊(cè)通知办斑,請(qǐng)求成功之后會(huì)給客戶端返回devToken外恕,因?yàn)閐eviceToken 隨時(shí)會(huì)發(fā)生變化,每次啟動(dòng)App的時(shí)候都要請(qǐng)求一次乡翅。得到devToken 需要上傳到服務(wù)器Provider鳞疲。
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken
{
DDLogInfo(@"application didRegisterForRemoteNotificationsWithDeviceToken : %@", devToken);
// 上傳devToken
[self doPushRegDeviceTask:devToken];
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err
{
//注冊(cè)失敗
DDLogError(@"application didFailToRegisterForRemoteNotificationsWithError : %@", err);
}
4.處理回調(diào)函數(shù)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
// 處理通知消息
}
第一次安裝App 有個(gè)彈框獲取用戶的許可是否允許接受App的通知,如果用戶選擇"不允許"蠕蚜,App是不會(huì)收到push通知尚洽。iOS 10 可以獲取用戶對(duì)"通知"操作信息,如果用戶不允許通知靶累,你可以在恰當(dāng)?shù)臅r(shí)機(jī)選擇通知用戶是否開(kāi)啟通知腺毫。想重新收到通知,用戶必須自己去設(shè)置->通知->App->允許通知.
蘋果公司對(duì)iOS10通知系統(tǒng)進(jìn)行了大重構(gòu)挣柬,豐富了push通知內(nèi)容了潮酒。
喵大 -- 活久見(jiàn)的重構(gòu)
信鴿
信鴿 是一款專業(yè)的移動(dòng)App推送平臺(tái),支持百億級(jí)的通知/消息推送邪蛔,秒級(jí)觸達(dá)移動(dòng)用戶急黎,現(xiàn)已全面支持Android和iOS兩大主流平臺(tái)。開(kāi)發(fā)者可以方便地通過(guò)嵌入SDK侧到,通過(guò)API調(diào)用或者Web端可視化操作勃教,實(shí)現(xiàn)對(duì)特定用戶推送,大幅提升用戶活躍度匠抗,有效喚醒沉睡用戶故源,并實(shí)時(shí)查看推送效果。如果不想自己搭建一個(gè)Provider服務(wù)器汞贸,找一個(gè)第三方的服務(wù)器信鴿還是不錯(cuò)的選擇心软,信鴿的接入也比較簡(jiǎn)單。
1.注冊(cè)信鴿
首先注冊(cè)信鴿著蛙,只要登錄QQ就可以,配置自己的應(yīng)用信息耳贬,關(guān)鍵是配置上傳push證書(shū)(iOS 證書(shū)設(shè)置指南)踏堡。獲取access_id
和 access_key
,下載SDK 咒劲。
2.初始化信鴿
初始化信鴿顷蟆,這里就用到從官網(wǎng)獲取的access_id
和access_key
需要注意的是用戶如果注銷的诫隅,再次使用信鴿還是需要重新注冊(cè)的。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//.....
// 信鴿初始化
[XGPush startApp:kXGPush_Id appKey:kXGPush_Key];
//設(shè)置設(shè)備的帳號(hào)
// user_key : 本質(zhì)上是registerDevice的一個(gè)參數(shù)
[XGPush setAccount:user_key]
//注銷之后需要再次注冊(cè)前的準(zhǔn)備
__weak typeof(self) weakSelf = self;
void (^successCallback)(void) = ^(void){
//如果變成需要注冊(cè)狀態(tài)
if(![XGPush isUnRegisterStatus] ){
[weakSelf registerPush];
}
};
[XGPush initForReregister:successCallback];
//[XGPush registerPush]; //注冊(cè)Push服務(wù)帐偎,注冊(cè)后才能收到推送
}
3.注冊(cè)通知 & devToken
這跟上面的操作步驟是一樣的逐纬,一樣要獲取到devToken上傳給信鴿。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString * deviceTokenStr = [XGPush registerDevice:deviceToken];
}
大致就是以上的步驟削樊,官方有提供詳細(xì)Demo 和SDK接入說(shuō)明豁生,感覺(jué)還是很詳細(xì),能幫大家解決大部分問(wèn)題漫贞。
Pusher
Pusher 這是一個(gè)開(kāi)源軟件甸箱,幫助測(cè)試通知的,只需要push證書(shū)和設(shè)備的devToken就可以模擬測(cè)試通知了迅脐。