iOS推送實驗室-做之前看看我少走彎路

?寫作原因:網(wǎng)上看了很多推送文章都沒有完美的解答我的疑惑;主要有以下兩點,1:推送來了我點擊應(yīng)用圖標(biāo)進入應(yīng)用怎么取到推送消息?2:怎么保證一定能夠獲取到遠(yuǎn)程推送的消息,因為有的遠(yuǎn)程推送消息很重要;這里主要驗證會在哪幾個回調(diào)收到內(nèi)容,行為(手機頂部有消息彈出我叫做行為)是怎樣的

? 其實收到推送到進入應(yīng)用有這么5種場景,1:程序運行在前臺來推送了,2:程序運行在后臺來推送了,我點擊推送消息進入程序,3:程序運行在后臺來推送了,我點擊應(yīng)用圖標(biāo)進入程序,4:程序沒運行來推送了,我點擊推送消息進入程序,5:程序沒運行來推送了,我點擊應(yīng)用圖標(biāo)進入程序

? 講推送的文章實在是太多了,我就不啰嗦原理(http://www.itdecent.cn/p/ace1b422bad4)和配置(http://www.itdecent.cn/p/db9c95c9e29f)了;我直接拿我的項目(項目最低適配iOS8)來從以下三個方面回答上面5種情況下會在哪些回調(diào)收到內(nèi)容,行為是怎樣的

一:本地推送

我們從UIApplicationDelegate中找一找哪些是和本地推送相關(guān)的回調(diào),可以發(fā)現(xiàn)有下面這三個;假設(shè)現(xiàn)在你不知道B和C什么意思,我也是后面才想起來的(有點癡呆了),不過都寫了這么多了就不想刪除了:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification ?{}//A回調(diào)

(void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void(^)())completionHandler {}//B回調(diào)

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler {}//C回調(diào)

? 細(xì)心的小伙伴可能說了,A回調(diào)后面不是說讓你用XXX回調(diào)代替嗎?哥們,這個函數(shù)有效期是iOSx-iOS10,你慌啥啊,等iOS11出來了再換唄;然后B和C描述一樣說明功能一樣,我們這里使用B,C是iOS9-iOS10,B是iOS8-iOS10我們要適配版本;這里我們還不知道B和C是什么時候調(diào)用,沒關(guān)系我們慢慢來做實驗,我們把A和B寫到AppDelegate.m中;然后我們分別來進行試驗

1:A和B回調(diào)都寫上

1)程序運行在前臺來本地推送了

? 我在我項目中創(chuàng)建一個按鈕,給按鈕響應(yīng)添加一個只觸發(fā)一次的本地推送(代碼就不寫了,都會寫);在這兩個回調(diào)中打上斷點,現(xiàn)在我們運行程序點擊按鈕然后讓程序運行到前臺,慢慢等待本地推送觸發(fā)(看點網(wǎng)站)~~~

? 斷點如約執(zhí)行,先是執(zhí)行了A回調(diào),我們XCode下方打印一下notification看看是什么鬼:

{fire date = 2016年10月24日 星期一 中國標(biāo)準(zhǔn)時間 下午4:03:08, time zone = Asia/Shanghai (GMT+8) offset 28800, repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = (null), user info = {

action = GENERAL;

"company_no" = 10295;

content = "\U4e8b\U52a1\U63d0\U9192: boot1";

"from_user_no" = 21175;

"target_id" = 15812;

time = 1477296248000;

"to_user_no" = 21175;

type = CALENDARTIP;

unread = 1;

}}

? 內(nèi)容大概是觸發(fā)這次推送的時間(fire date)+時區(qū)(time zone)+間隔周期(repeat interval)+重復(fù)次數(shù)(repeat count)+下次觸發(fā)時間(next fire date)+添加到本地推送的內(nèi)容(user info),好了沒有什么問題,然后我們繼續(xù)執(zhí)行程序,B怎么不執(zhí)行了?我擦,我們回過頭看看B回調(diào)上面的注釋:

// Called when your app has been activated by the user selecting an action from a local notification.

// A nil action identifier indicates the default action.

// You should call the completion handler as soon as you've finished handling the action.

? 依我考過英語四級(只是考過,沒有考過)的水平翻譯一下,這個回調(diào)被觸發(fā)當(dāng)用戶從本地通知點擊一個action,一個不為nil的action指示默認(rèn)的action,你應(yīng)該寫一下完成回調(diào)當(dāng)你握住了這個action(我已經(jīng)被我的英語水平屈服了);不過意思大概懂了是從通知欄點擊某一項激活項目,那么啥算激活項目?后臺進入前臺還是被殺死的項目啟動了?不管了,結(jié)論很重要:

會觸發(fā)哪些回調(diào):應(yīng)用在前臺,只會觸發(fā)A回調(diào)

什么行為:沒行為

2)程序運行在后臺來本地推送了,我點擊推送消息進入程序

? 依然和上面一樣,我們點擊按鈕然后把程序運行到后臺;在這兩個回調(diào)中打上斷點,慢慢等待本地推送觸發(fā)(看點網(wǎng)站)~~~

? 好了,這時候手機頂部彈出消息了,應(yīng)用圖標(biāo)右上角也有數(shù)字了,注意這時候兩個回調(diào)一個都沒有觸發(fā),就像這樣:

通知欄有通知
應(yīng)用圖標(biāo)有數(shù)字

? 好了,我們興奮的點一下通知欄,好的,A回調(diào)先被觸發(fā),我們打印一下notification:

{fire date = 2016年10月24日 星期一 中國標(biāo)準(zhǔn)時間 下午4:25:21, time zone = Asia/Shanghai (GMT+8) offset 28800, repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = (null), user info = {

action = GENERAL;

"company_no" = 10295;

content = "\U4e8b\U52a1\U63d0\U9192: boot3";

"from_user_no" = 21175;

"target_id" = 15815;

time = 1477297581000;

"to_user_no" = 21175;

type = CALENDARTIP;

unread = 1;

}}

? 這個和上面的一樣,不解釋了,我們繼續(xù)運行,好的B沒有被觸發(fā),結(jié)論:

會觸發(fā)哪些回調(diào):點擊通知欄從后臺進入前臺,只會觸發(fā)A回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

3)程序運行在后臺來本地推送了,我點擊應(yīng)用圖標(biāo)進入程序

? 依然重復(fù)上面的步驟,點擊按鈕,把應(yīng)用運行到后臺,在這兩個回調(diào)中打上斷點,慢慢等待本地推送觸發(fā)(看點網(wǎng)站)~~~

? 好了,這時候手機頂部彈出消息了,應(yīng)用圖標(biāo)右上角也有數(shù)字了;注意這時候兩個回調(diào)一個都沒有觸發(fā),和上面的一樣,然后我們點擊應(yīng)用圖標(biāo)進入應(yīng)用:

點應(yīng)用圖標(biāo)進入前臺

?好的,你沒有看錯,A和B一個都沒有觸發(fā),那我怎么獲取到本地推送消息呢,你在逗我嗎?結(jié)論:

會觸發(fā)哪些回調(diào):點擊應(yīng)用圖標(biāo)從后臺進入前臺,不會觸發(fā)A回調(diào),不會觸發(fā)B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

4)程序沒運行來本地推送了,我點擊推送消息進入程序

? 我還在想這個要怎么打斷點呢,因為程序沒有運行。。。那我們就用一個UIAlertView顯示notification吧(后面都用顯示代替斷點,因為XCode8進入斷點實在是太慢);這里我們在啟動程序時:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}

? 這里面也顯示一下launchOptions,因為程序啟動萬一附帶有數(shù)據(jù)呢;同樣的,點擊按鈕然添加本地通知后把程序殺死,慢慢等待本地推送觸發(fā)(看點網(wǎng)站)~~~

? 好了,手機頂部推送如約而至,這時候回調(diào)肯定也不會觸發(fā),我們點擊通知欄啟動程序:

啟動參數(shù)

? 果然,啟動參數(shù)里面帶上了我們的推送內(nèi)容;我們點擊取消,然后A和B的提示框沒有彈出,結(jié)論:

會觸發(fā)哪些回調(diào):程序為運行,點擊通知欄啟動程序,不會觸發(fā)A、B回調(diào),啟動參數(shù)有推送內(nèi)容

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

5)程序沒運行來本地推送了,我點擊應(yīng)用圖標(biāo)進入程序

? 依然如此,我們進應(yīng)用點擊按鈕添加推送,然后殺死程序,等待推送;推送如約而至,這時候兩個回調(diào)也不會觸發(fā),我們點擊應(yīng)用圖標(biāo)進入程序,會看到下面的效果:

啟動參數(shù)

? 點擊取消,繼續(xù)運行,然后A和B的提示框沒有彈出,結(jié)論:

會觸發(fā)哪些回調(diào):程序未運行,點擊應(yīng)用圖標(biāo)啟動程序,不會觸發(fā)A、B回調(diào),啟動參數(shù)也沒有內(nèi)容

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

好了,是不是很蛋疼,A和B加一起B(yǎng)永遠(yuǎn)都不會觸發(fā);接下來我們來驗證只寫其中一個函數(shù)是怎樣的(這時候我還沒有想起來B是干啥的,還在試錯呢)

2:只寫A回調(diào)

? 驗證方法和上面的一樣,我就不截圖了(但是我真的重復(fù)了一遍哦),直接寫結(jié)論

1)程序運行在前臺來本地推送了

會觸發(fā)哪些回調(diào):應(yīng)用在前臺,會觸發(fā)A回調(diào)

什么行為:沒有行為

2)程序運行在后臺來本地推送了,我點擊推送消息進入程序

會觸發(fā)哪些回調(diào):應(yīng)用在后臺,點擊通知欄進入前臺,會觸發(fā)A回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

3)程序運行在后臺來本地推送了,我點擊應(yīng)用圖標(biāo)進入程序

會觸發(fā)哪些回調(diào):應(yīng)用在后臺,點擊應(yīng)用圖標(biāo)進入前臺,不會觸發(fā)A回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

4)程序沒運行來本地推送了,我點擊推送消息進入程序

會觸發(fā)哪些回調(diào):程序未運行,點擊通知欄啟動程序,不會觸發(fā)A回調(diào),啟動參數(shù)有內(nèi)容

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

5)程序沒運行來本地推送了,我點擊應(yīng)用圖標(biāo)進入程序

會觸發(fā)哪些回調(diào):程序未運行,點擊應(yīng)用圖標(biāo)啟動程序,不會觸發(fā)A回調(diào),啟動參數(shù)也沒有內(nèi)容

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

? 好的,和上面一樣,所以我們現(xiàn)在只寫B(tài)回調(diào)驗證一下

3:只寫B(tài)回調(diào)

? 馬上就可以做完本地推送了,有點激動;同理,直接來結(jié)論(我還是沒有想起來B是干嘛的)

1)程序運行在前臺來本地推送了

會觸發(fā)哪些回調(diào):應(yīng)用在前臺,不會觸發(fā)B回調(diào)

什么行為:沒有行為

居然沒有觸發(fā),我都不相信自己的眼睛,于是我又重新測了一次,還是沒有觸發(fā)

2)程序運行在后臺來本地推送了,我點擊推送消息進入程序

會觸發(fā)哪些回調(diào):應(yīng)用在后臺,點擊通知欄進入前臺,不會觸發(fā)B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

3)程序運行在后臺來本地推送了,我點擊應(yīng)用圖標(biāo)進入程序

會觸發(fā)哪些回調(diào):應(yīng)用在后臺,點擊應(yīng)用圖標(biāo)進入前臺,不會觸發(fā)B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

4)程序沒運行來本地推送了,我點擊推送消息進入程序

會觸發(fā)哪些回調(diào):程序未運行,點擊通知欄啟動程序,不會觸發(fā)B回調(diào),啟動參數(shù)有內(nèi)容

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

5)程序沒運行來本地推送了,我點擊應(yīng)用圖標(biāo)進入程序

會觸發(fā)哪些回調(diào):程序未運行,點擊應(yīng)用圖標(biāo)啟動程序,不會觸發(fā)B回調(diào),啟動參數(shù)也沒有內(nèi)容

什么行為:圖標(biāo)有數(shù)字,通知欄有通知?

好了,現(xiàn)在是時候谷歌一下B函數(shù)到底是干嘛的了,為啥都沒有觸發(fā);我在這里找到了答案http://www.bozhiyue.com/ios/2016/0811/358999.html,好吧我終于知道什么意思了;B函數(shù)是點擊這里會觸發(fā):

這才是action啊,我的天

所以我們把結(jié)論重新整理一下(好吧,這時候終于步入正軌了),

1)程序運行在前臺來本地推送了

會觸發(fā)哪些回調(diào):應(yīng)用在前臺,不會觸發(fā)B回調(diào)(因為沒有點擊action)

什么行為:沒有行為

2)程序運行在后臺來本地推送了,我點擊推送消息的action

會觸發(fā)哪些回調(diào):程序運行在后臺,推送action不會進入前臺,不會觸發(fā)B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

還是沒有觸發(fā),我去;這又是鬧哪樣?能不能少點套路,我們繼續(xù)谷歌;http://www.itdecent.cn/p/803bfaae989e這里說到遠(yuǎn)程推送可以觸發(fā),那是不是本地推送不會觸發(fā)呢?而且我也是加了自定義action的:

自定義action

那到底是什么意思呢?我們繼續(xù)往下面做實驗,看看到后面的遠(yuǎn)程推送會不會觸發(fā)

3)程序運行在后臺來本地推送了,我點擊應(yīng)用圖標(biāo)進入程序

會觸發(fā)哪些回調(diào):應(yīng)用在后臺,點擊應(yīng)用圖標(biāo)進入前臺,不會觸發(fā)B回調(diào)(因為沒有點擊action)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

4)程序沒運行來本地推送了,我點擊推送消息的action

會觸發(fā)哪些回調(diào):應(yīng)用未運行,點擊推送消息action不會啟動程序,不會觸發(fā)B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

5)程序沒運行來本地推送了,我點擊應(yīng)用圖標(biāo)進入程序

會觸發(fā)哪些回調(diào):應(yīng)用在后臺,點擊應(yīng)用圖標(biāo)進入前臺,不會觸發(fā)B回調(diào)(因為沒有點擊action)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

? 好吧,我得再寫一篇文章專門寫怎么自定義推送action還有上面5種情況對應(yīng)的行為了,可這里不觸發(fā)可能是我沒有加正確;

? 那我們現(xiàn)在來看看遠(yuǎn)程推送,這次終于弄明白A和B是干嘛的了;所以我們做本地推送兩個回調(diào)都要寫上,因為作用不一樣。

二:遠(yuǎn)程推送,不使用第三方

? 遠(yuǎn)程推送必須真機,提醒一下!我們先在UIApplicationDelegate中找找遠(yuǎn)程推送相關(guān)的回調(diào)(和action有關(guān)的我們就不管了,另起一篇文章寫action):

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {}//B

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {}//C

? 然后B回調(diào)https://docs.kii.com/cn/guides/cloudsdk/ios/managing-push-notification/push-to-user/receiving-messages/有解釋說的是靜默推送使用B回調(diào),那么啥是靜默推送呢?http://www.devlizy.com/ios-ding-shi-huo-qu-he-jing-mo-tui-song/這里給出了解釋,也就是說你的程序在后臺收到遠(yuǎn)程推送將直接觸發(fā)這個回調(diào)而不用等應(yīng)用進入前臺,這么好玩,但是我們不驗證這個;C回調(diào)就是收到遠(yuǎn)程推送了,C回調(diào)注釋說明了用B接收靜默推送,用XXX接收遠(yuǎn)程推送,我們不管;所以我們在AppDelegate.m中加上C一個回調(diào)就行了,內(nèi)容就像這樣:

遠(yuǎn)程推送回調(diào)

? 由于我們項目已經(jīng)集成了個推三方推送,要實現(xiàn)不使用第三方推送來測試;我們就要用到下面的工具來測試環(huán)境模擬推送了(你們不用下載,看我表演就行了)。

測試環(huán)境模擬遠(yuǎn)程推送

? 這個工具我們下載安裝后,啟動就看到這個界面:

模擬推送工具

? 怎么用就不說了吧,這么簡單;我們先獲取設(shè)備token,然后我們在獲取時得到下面的錯誤:

獲取token失敗

趕緊谷歌,找到了http://blog.csdn.net/u013263917/article/details/24712797和http://blog.csdn.net/soindy/article/details/46537095,于是我重新在官網(wǎng)生成一次開發(fā)者證書、推送證書和描述文件等;還是一樣的問題;我在想是不是因為我項目集成了個推,然后我把個推關(guān)閉了;還是一樣的問題(此刻我心里有點慌);然后http://www.itdecent.cn/p/c2bb07786fd1說打開這里:

開啟推送

? 這個紅色的錯誤不用解決,然后可以看到這里:

測試和正式不一樣

? 這時候就能得到設(shè)備token了:

能獲取token了

? 用上模擬推送的工具開始驗證!

一:測試C回調(diào)

1)程序運行在前臺來遠(yuǎn)程推送了

? 啟動真機,然后我們點擊這里模擬推送(以下用"push"按鈕代替說明):

推送

等待;然后我們程序彈窗了,內(nèi)容就是工具模擬的內(nèi)容,結(jié)論:

會觸發(fā)哪些回調(diào):應(yīng)用在前臺,會觸發(fā)C回調(diào)

什么行為:沒有行為

2)程序運行在后臺來遠(yuǎn)程推送了,我點擊推送消息進入程序

? 把應(yīng)用切換到后臺,點擊工具的"push"按鈕,等待推送;點擊推送進入前臺彈出提示框,結(jié)論:

會觸發(fā)哪些回調(diào):程序運行在后臺,點擊推送會進入前臺,觸發(fā)C回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

3)程序運行在后臺來遠(yuǎn)程推送了,我點擊應(yīng)用圖標(biāo)進入程序

? 依然,切換到后臺,點擊工具"push"按鈕,等待;沒有彈窗,結(jié)論:

會觸發(fā)哪些回調(diào):程序運行在后臺,點擊應(yīng)用圖標(biāo)會進入前臺,不會觸發(fā)C回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

4)程序沒運行來遠(yuǎn)程推送了,我點擊推送消息進入程序

? 我們把程序殺死,點擊工具"push"按鈕,等待;點擊推送欄進入程序,啟動參數(shù)顯示了,沒有觸發(fā)A回調(diào),結(jié)論:

會觸發(fā)哪些回調(diào):程序未運行,點擊推送進入前臺,不會觸發(fā)C回調(diào),啟動參數(shù)有內(nèi)容

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

5)程序沒運行來遠(yuǎn)程推送了,我點擊應(yīng)用圖標(biāo)進入程序

殺死程序,點擊"push"按鈕,等待;點擊圖標(biāo)啟動程序,啟動參數(shù)沒有,沒有觸發(fā)C回調(diào),結(jié)論:

會觸發(fā)哪些回調(diào):程序未運行,點擊應(yīng)用圖標(biāo)進入前臺,不會觸發(fā)C回調(diào),啟動參數(shù)無內(nèi)容

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

? 這個和本地推送是吻合的,但是發(fā)現(xiàn)了沒,原生遠(yuǎn)程推送沒辦法保證用戶一定能得到數(shù)據(jù),因為從應(yīng)用圖標(biāo)進入程序是得不到的,所以只有服務(wù)器存客戶端進應(yīng)用就拉取是不?那么第三方推送做了嗎?我們滿懷期待的來測試一下

三:遠(yuǎn)程推送,使用個推等第三方

? 同樣的,我們不講怎么配置個推http://docs.getui.com/mobile/ios/overview/;集成之后個推接收推送的回調(diào)長得像這樣(你們不用集成,看我就行):

- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {}//A

? 在回調(diào)中加上顯示內(nèi)容代碼:

個推回調(diào)

? 同樣的我們要加上原生的遠(yuǎn)程推送來看看會不會也顯示出來:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {}//B

? 同樣的我們啟動程序,然后讓后臺給我們發(fā)一個個推推送

1)程序運行在前臺來個推推送了

? 等待推送;這時候個推A回調(diào)彈窗了,原生B沒有執(zhí)行,結(jié)論:

會觸發(fā)哪些回調(diào):應(yīng)用在前臺,會觸發(fā)個推A回調(diào),不會觸發(fā)原生B回調(diào)

什么行為:沒有行為

? ?這里我們可以認(rèn)為是個推推過來的,不管原生的事情,先這么理解吧

2)程序運行在后臺來個推推送了,我點擊推送消息進入程序

? 然后,我們把程序切換到后臺,等待推送;這時候我們點擊推送進入前臺,個推A顯示了,然后原生B也彈出來了,我們來看看原生的是什么內(nèi)容:

原生的被觸發(fā)了

? 這個內(nèi)容不是我讓后臺發(fā)送的內(nèi)容,應(yīng)該是個推那邊附加的,那么結(jié)論:

會觸發(fā)哪些回調(diào):程序運行在后臺,點擊推送會進入前臺,觸發(fā)個推A回調(diào),然后觸發(fā)原生B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

3)程序運行在后臺來個推推送了,我點擊應(yīng)用圖標(biāo)進入程序

? 依然如此,切換到后臺,等待推送;點擊應(yīng)用圖標(biāo)進入程序,個推A觸發(fā),原生B沒有觸發(fā),結(jié)論:

會觸發(fā)哪些回調(diào):程序運行在后臺,點擊應(yīng)用圖標(biāo)會進入前臺,觸發(fā)個推A回調(diào),不觸發(fā)原生B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

? 這就比較好了嘛,應(yīng)用圖標(biāo)進入都會有推送內(nèi)容,這就是我想要的功能

4)程序沒運行來個推推送了,我點擊推送消息進入程序

? 把程序殺死,等待推送;點擊推送進入程序,啟動參數(shù)有內(nèi)容但不是我讓后臺發(fā)送的內(nèi)容(也是附加內(nèi)容),然后會觸發(fā)個推A回調(diào),不會觸發(fā)原生B回調(diào),結(jié)論:

會觸發(fā)哪些回調(diào):程序未運行,點擊推送進入程序,啟動參數(shù)有內(nèi)容,觸發(fā)個推A回調(diào),不觸發(fā)原生B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

?附加內(nèi)容還是很好理解的,就是提醒你一下有消息,然后等你正在進入的時候再給你發(fā)真正的內(nèi)容

5)程序沒運行來個推推送了,我點擊應(yīng)用圖標(biāo)進入程序

依然殺死程序,等待推送;點擊應(yīng)用圖標(biāo)進入程序,啟動參數(shù)沒有內(nèi)容,個推A觸發(fā),原生B沒有觸發(fā),結(jié)論:

會觸發(fā)哪些回調(diào):程序未運行,點擊圖標(biāo)進入程序,啟動無內(nèi)容,觸發(fā)個推A回調(diào),不觸發(fā)原生B回調(diào)

什么行為:圖標(biāo)有數(shù)字,通知欄有通知

好了,第三方推送能保證消息一定能發(fā)送到用戶,這點比較好的,你可能會說個推怎么做到的?給你一個網(wǎng)址去看看

四:結(jié)論

? 英語真的是一個好東西,做東西之前要多看文章,看不懂就要多驗證

一:使用本地推送

? 1:推送內(nèi)容會在啟動參數(shù)或本地推送回調(diào)中獲取,2:應(yīng)用圖標(biāo)進入程序不會獲取到任何內(nèi)容

二:使用原生遠(yuǎn)程推送

? 1:推送內(nèi)容會在啟動參數(shù)或遠(yuǎn)程推送回調(diào)中獲取,2:應(yīng)用圖標(biāo)進入程序不會獲取到任何內(nèi)容,3:服務(wù)器要保存推送內(nèi)容,以免重要數(shù)據(jù)丟失

三:使用個推三方推送

? 1:用戶在程序就一定能從個推回調(diào)中得到推送內(nèi)容,2:原生遠(yuǎn)程推送回調(diào)和啟動參數(shù)是附加內(nèi)容不用處理

五:花絮

? 首先,自己懵逼了居然忘記下面這個回調(diào)是干嘛的,于是花了一上午來才坑:

-(void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void(^)())completionHandle{}//自定義推送消息的action被點擊

? 然后,我前面的個推推送測試都是在測試環(huán)境進行的沒有任何問題,然后第二天我又去了正式環(huán)境發(fā)現(xiàn)表現(xiàn)不一樣了,我有點慌了馬上加了個推服務(wù)方QQ,然后終于明白了,是自己證書的問題http://www.qingpingshan.com/rjbc/ios/139338.html;還終于弄明白了公司在個推首頁為啥注冊了兩個同樣的應(yīng)用:

兩個一樣的應(yīng)用

這就是一個拿來測試環(huán)境,一個正式環(huán)境?。?/p>

?然后我已經(jīng)寫好了自定義action,你們可以點看看下面的拓展閱讀!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • 寫作原因:上文http://www.itdecent.cn/p/fa17ffa7262e 中在做自定義action...
    Thebloodelves閱讀 1,636評論 8 11
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,873評論 10 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 人生就是一場旅行,漫卷詩書,只要自己喜歡就好,
    最愛麻薯閱讀 368評論 0 0

友情鏈接更多精彩內(nèi)容