推送通知本身是iOS系統(tǒng)的行為,所以在APP沒有運(yùn)行(沒有再前臺(tái)也沒有再后臺(tái))的時(shí)候,任然能夠推送或接受
收到推送的時(shí)候無(wú)法獲取到內(nèi)容,點(diǎn)擊通知之后能跳轉(zhuǎn)到APP中,可以獲取到推送中帶過(guò)來(lái)的擴(kuò)展內(nèi)容
注冊(cè)推送服務(wù):
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary)launchOptions
{ //注冊(cè)推送
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
}
else {
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert) categories:nil];
}
}
在第一次出發(fā)這段代碼的時(shí)候,會(huì)有一個(gè)系統(tǒng)彈窗,詢問(wèn)你是否允許該APP要給你推送消息
允許:系統(tǒng)打包APP+手機(jī)唯一標(biāo)識(shí)+證書發(fā)送至APNs服務(wù)器注冊(cè)推送服務(wù)
注冊(cè)成功:
可以在此方法中獲取到deviceToken他是對(duì)(手機(jī)+APP)組合的唯一標(biāo)識(shí)
-(void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{ //獲取DeviceToken
[JPUSHService registerDeviceToken:deviceToken];此為極光方法
}
推送通知的提醒
前臺(tái)收到:
系統(tǒng)會(huì)將內(nèi)容傳到didReceiveRemoteNotification
后臺(tái)收到:
· 開啟了RemoteNotification,系統(tǒng)執(zhí)行didReceiveRemoteNotification:fetchCompletionHandler方法
· 展示橫幅、通知中心、聲音、角標(biāo)
退出收到:
· 如果點(diǎn)擊推送橫幅、通知中心而啟動(dòng)APP,執(zhí)行didFinishLaunchingWithOptions方法
· 展示橫幅、通知中心、聲音、角標(biāo)
推送包含
本地通知:
APP指定推送時(shí)間,在該時(shí)間準(zhǔn)時(shí)彈出推送通知
遠(yuǎn)程通知:
1.普通推送
· 最常見的推送通知
· 包含聲音、橫幅、角標(biāo)、自定義字段
· APP: 處于前臺(tái),不展示橫幅,可通過(guò)didReceiveRemoteNotification(iOS7之前)或
didReceiveRemoteNotification:fetchCompletionHandler(iOS7之后)方法獲取內(nèi)容
· 處于后臺(tái)或退出,會(huì)展示橫幅,無(wú)法獲取通知內(nèi)容
· 點(diǎn)擊橫幅啟動(dòng),在didFinishLaunchingWithOptions方法獲取內(nèi)容
2.后臺(tái)推送
· 各種顯示效果如普通推送效果
· 必須攜帶"content-avaliable"=1;
· 必須攜帶alert,badge,sound中至少一個(gè)字段(后臺(tái)如果不給,前臺(tái)就沒有任何聲音)
· 必須在xcode工程中開啟notifications的功能
· APP
1.處于前臺(tái)或退出與普通推送效果一致
2.處于后臺(tái),可通過(guò)didReceiveRemoteNotification:fetchCompletionHandler獲取通知內(nèi)容,獲取情況與普通推送不同的是,此時(shí)iOS系統(tǒng)允許開發(fā)者在APP處于后臺(tái)的情況下執(zhí)行代碼
3.靜默推送
· 沒有任何展示效果
· 必須攜帶"content-avaliable"=1;因此靜默必然是后臺(tái)的
· 不能攜帶alert、badge、sound任何字符
· 可攜帶自定義字段
· APP :效果與后臺(tái)推送效果一直
第三方推送
1.廣播 :
無(wú)差別的發(fā)給所有的用戶
2.別名(alias):
· 第三方提供的功能
· 每個(gè)手機(jī)只能設(shè)置一個(gè)別名alias
· 僅指定alias的用戶能收到推送,不再限制于手機(jī)
3.標(biāo)簽(tag):
· 第三方提供
· 可以設(shè)置多個(gè)、可增加、清空
· 用于指定多樣的屬性,如"1000"+"daily"+"discount" 可用于標(biāo)簽月消費(fèi)超過(guò)1K,喜歡購(gòu)買日用品、偏好折扣商品的用戶
· 如果要?jiǎng)h除,需要在上次設(shè)置的時(shí)候,講設(shè)置的tags保存至NSUserDefaults本次剔除不需要的tag之后,再重新設(shè)置
· 推送時(shí)可指定多個(gè)tag來(lái)統(tǒng)一發(fā)送內(nèi)容
4.Resgistration ID :
· 第三方提供
· 在講deviceToken提供給第三方之后,其服務(wù)器會(huì)自動(dòng)生成的志向該手機(jī)的唯一id
· 可用于對(duì)核心用戶、期間用戶的精準(zhǔn)推送
應(yīng)用內(nèi)消息
· 不需要證書
· 由第三方服務(wù)器下發(fā),而不是APNs
· 比通知快,不延遲,可用于IM消息的即時(shí)送達(dá)
· 能夠長(zhǎng)時(shí)間保留離線消息,可獲取所有歷史消息內(nèi)容
· 能夠長(zhǎng)連接技術(shù)下發(fā)消息 手機(jī)必須啟動(dòng)并與第三方服務(wù)器建立連接
· 如果手機(jī)啟動(dòng)立刻切換到后臺(tái),很可能沒有建立連接
· 手機(jī)必須處于前臺(tái)才能接收消息
· 手機(jī)從后臺(tái)切回前臺(tái),才會(huì)自動(dòng)重新建立連接,并收到離線消息
· 沒有任何展示 只能自己實(shí)現(xiàn)UI效果
· 完全靜默情況下處理APP內(nèi)部邏輯
· AppStore審核必須關(guān)閉一些功能,上架后再通過(guò)后臺(tái)開啟
通知 與 消息對(duì)比
通知 | 消息 | |
---|---|---|
送達(dá)時(shí)間 | 可能存在幾秒的延遲 | 無(wú)延遲 |
獲取時(shí)間 | 前臺(tái)或后臺(tái) | 僅前臺(tái) |
離線內(nèi)容 | 保留一段時(shí)間,無(wú)法查詢歷史內(nèi)容 | 始終保留,可查詢?nèi)繗v史內(nèi)容 |
系統(tǒng)展示 | 靜默或處于前臺(tái)不展示,后臺(tái)或退出展示角標(biāo)、聲音、橫幅 | 不展示 |
QQ/微信聊天
同時(shí)下發(fā)一組通知 + 消息,如果用戶沒有啟動(dòng)APP,雖然有延遲,但是必然能夠收到通知,在通知的提醒之后,用戶打開APP,此時(shí)收到離線消息,及時(shí)更新UI
參考:iOS 推送全解析,你不可不知的所有 Tips!(完整版)