iOS推送實(shí)驗(yàn)室-自定義Action

寫作原因:上文http://www.itdecent.cn/p/fa17ffa7262e 中在做自定義action時始終沒有進(jìn)入回調(diào),今天解決了在這里記錄下,建議你先看看上文,不然你可能看不懂我在說什么
上文中我們說到,我推送自定義了action,而且推送來了也沒有顯示這些按鈕:

UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];
action.identifier = @"finish";//按鈕的標(biāo)示
action.title=@"完成";//按鈕的標(biāo)題
action.activationMode = UIUserNotificationActivationModeForeground;//當(dāng)點(diǎn)擊的時候啟動程序
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];  //第二按鈕
action2.identifier = @"delete";
action2.title=@"刪除";
action2.activationMode = UIUserNotificationActivationModeBackground;//當(dāng)點(diǎn)擊的時候不啟動程序,在后臺處理
action.authenticationRequired = YES;//需要解鎖才能處理 action.destructive = YES;//YES后按鈕為紅色
UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
categorys.identifier = @"alert";//這組動作的唯一標(biāo)示 [categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)];
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObjects:categorys,nil]];//推送來了要彈窗、角標(biāo)和聲音 還要自定義action
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];

注意自定義action按鈕的activationMode屬性,所以我們只測試點(diǎn)擊"完成"action的行為
但是上文我們點(diǎn)擊action時沒有進(jìn)入A回調(diào):

//點(diǎn)擊遠(yuǎn)程推送的action觸發(fā)
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler {
    
}//A回調(diào)

感謝http://www.itdecent.cn/p/803bfaae989e 給我的幫助,文中有一個重要的地方在這里:

{ "aps":
    {          "alert":"推送內(nèi)容", 
               "sound":"default", 
               "badge":0, 
            "category":"alert"http://上文原生模擬推送時少發(fā)送了這個字段
    } 
}

看到了嗎?推送的時候要加一個字段category才行,而且要和自定義action的categories的identifier一樣,可以定義多組動作,后臺根據(jù)內(nèi)容不同發(fā)送不同的category,我們這里實(shí)驗(yàn)就定義一組就好了:

UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
categorys.identifier = @"alert";//這組動作的唯一標(biāo)示 
[categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)];

我的上篇文章自定義action加了identifier但是原生模擬推送工具里的內(nèi)容沒有加category(真是慚愧),好了目標(biāo)清晰了,我們只需要推送時加上就可以了,我們打開上文的模擬遠(yuǎn)程推送的工具看看能不能加:

看看黑色箭頭內(nèi)容,加需要錢.png

內(nèi)容說的是要在商店購買才能自定義內(nèi)容,所以我們干嘛?
卸載這個工具.png

然后我們找到另外一個工具https://github.com/KnuffApp/Knuff/releases 同樣的,你們不用下載看我表演就好了,我們打開工具看看:
Knuff模擬推送.png

界面依然清爽,而且可以自定義內(nèi)容,所以我們加上category,值目前就用這一個,就像這樣:
寫上自定義內(nèi)容.png

一:使用原生推送

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

當(dāng)然不會執(zhí)行A回調(diào)了,因?yàn)闆]有點(diǎn)擊actio嘛

2:程序在后臺來遠(yuǎn)程推送了,我點(diǎn)擊"完成action"

我們在模擬推送工具中添上設(shè)備token選好證書,啟動真機(jī),然后點(diǎn)擊模擬推送工具的"push"按鈕等待推送的到來;然后我們終于可以在通知欄中左滑消息看到這陌生的一幕了:


終于出現(xiàn)了.png

然后我們點(diǎn)擊完成action,觸發(fā)回調(diào)了(現(xiàn)在我不懵逼了):


觸發(fā)回調(diào)了.png

依然,結(jié)論:
程序在后臺,點(diǎn)擊action會觸發(fā)A回調(diào),再不觸發(fā)我是不是又要另外起一篇文章了

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

當(dāng)然不會執(zhí)行A回調(diào),因?yàn)闆]有點(diǎn)擊action嘛

4:程序未運(yùn)行來遠(yuǎn)程推送了,點(diǎn)擊action進(jìn)入程序

同樣的,程序沒有運(yùn)行就沒有斷點(diǎn),我們就用彈窗代碼代替;現(xiàn)在把程序退出,點(diǎn)擊模擬工具"push"等待推送;然后我們左滑推送消息點(diǎn)擊完成,會進(jìn)入程序然后A回調(diào)顯示了推送內(nèi)容,結(jié)論:
程序未運(yùn)行點(diǎn)擊推送action,會執(zhí)行A回調(diào),啟動參數(shù)沒有內(nèi)容

5:程序未運(yùn)行來遠(yuǎn)程推送了,點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入程序

結(jié)論:
程序未運(yùn)行,點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入程序,不會執(zhí)行A回調(diào),沒有啟動參數(shù),因?yàn)闆]有點(diǎn)action嘛
好了,到這里大家應(yīng)該還是能夠理解的,點(diǎn)擊action才會執(zhí)行A回調(diào),那么下面用第三方推送就有點(diǎn)意思了,還記得嗎?個推有附加消息哦,那么我們開始吧,激動!

二:使用個推等第三方推送

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

當(dāng)然不會執(zhí)行A回調(diào)了,因?yàn)闆]有點(diǎn)擊actio嘛

2:程序在后臺來遠(yuǎn)程推送了,我點(diǎn)擊"完成action"

依然等待推送;不過可能讓你失望了,個推的附加消息左滑沒有你自定義的 action按鈕組:


并沒有自定義action按鈕.png

說明個推的附加消息沒有那個category唄,結(jié)論:
無action可點(diǎn)

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

當(dāng)然不會執(zhí)行A回調(diào),因?yàn)闆]有點(diǎn)擊action嘛

4:程序未運(yùn)行來遠(yuǎn)程推送了,點(diǎn)擊action進(jìn)入程序

依然如此,沒有自定義action按鈕,結(jié)論:
無action可點(diǎn)

5:程序未運(yùn)行來遠(yuǎn)程推送了,點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入程序

結(jié)論:
程序未運(yùn)行,點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入程序,不會執(zhí)行A回調(diào),沒有啟動參數(shù)

三:結(jié)論

看來自定義action還是有很多坑的,所以你可以多定義幾組UIMutableUserNotificationCategory給不同的標(biāo)識符,然后服務(wù)器根據(jù)內(nèi)容選擇性推送;因?yàn)槲覀円豺?yàn)證了,自己做推送還好,如果是個推那邊會比較坑,因?yàn)橛懈郊酉?,所以根本沒有讓你點(diǎn)action的機(jī)會,因?yàn)檎嬲膬?nèi)容個推是要你程序在前臺才會給你。
而且這次我的代碼片段是不是好看多了

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

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

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