寫在前面:應(yīng)用場景很重要
如果你的公司有這樣一個(gè)硬性的需求:用戶將APP退出到后臺的時(shí)候,當(dāng)該用戶收到推送的時(shí)候渗柿,不讓用戶感覺到推送過來了用僧,不想打擾用戶蜘腌,但是還想拿到推送內(nèi)容做一些事情必盖。
在開發(fā)人員看來就是要實(shí)現(xiàn)如下功能:通知欄沒有文字拌牲、沒有內(nèi)容、也沒有聲音筑悴,同時(shí)還要能實(shí)現(xiàn)客戶端退出到后臺時(shí)们拙,還能執(zhí)行xcode中的某個(gè)特定方法,那么此時(shí)就可以用到靜默推送阁吝。
必須知道個(gè)推中這些名詞的含義,后面再出現(xiàn)這些名詞就不做闡述了
離線:APP在后臺運(yùn)行/APP未啟動(dòng)/APP被殺死械拍。
在線:APP在前臺運(yùn)行突勇。
iOS 個(gè)推透傳機(jī)制
iOS消息推送方式只有兩種:
APNs的通知欄消息
個(gè)推的透傳消息
以下說的是普通推送和靜默推送的不同之處:
普通推送:當(dāng)APP離線時(shí)装盯,當(dāng)有推送下達(dá)的時(shí)候,走的是APNs甲馋,所以手機(jī)會(huì)有鈴聲埂奈、手機(jī)頂部出現(xiàn)橫幅/通知欄會(huì)收到通知。
APP離線時(shí)定躏,相關(guān)方法什么時(shí)候執(zhí)行账磺,看下面1-4就知道了:
1.只有點(diǎn)開通知欄中的通知進(jìn)入APP/點(diǎn)開橫幅中的通知進(jìn)入APP,才會(huì)執(zhí)行方法AAA痊远;不點(diǎn)擊不執(zhí)行垮抗。
2.點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入APP,一定不會(huì)執(zhí)行方法AAA碧聪。
3.APP離線收到推送冒版,點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入APP/點(diǎn)開通知欄中的通知/點(diǎn)開橫幅中的通知進(jìn)入APP,會(huì)執(zhí)行個(gè)推提供的 方法BBB的離線的透傳消息
4.APP在線收到推送逞姿,就不走APNs辞嗡,會(huì)直接執(zhí)行個(gè)推提供的 方法BBB的在線的透傳消息總結(jié):綜合1-4,只要點(diǎn)開APNs發(fā)來的通知滞造,那么先執(zhí)行方法AAA续室,再執(zhí)行個(gè)推的方法BBB
方法AAA
iOS 10之前,點(diǎn)通知谒养,會(huì)調(diào)用如下方法猎贴。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
...
做你想做的操作。例如更新UI蝴光,跳轉(zhuǎn)界面她渴,文字轉(zhuǎn)語音并讀出來,頂部彈框,操作userInfo中的內(nèi)容蔑祟。
...
}
iOS 10 及以后版本趁耗,點(diǎn)擊通知,會(huì)調(diào)用如下方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{
...
做你想做的操作疆虚。例如更新UI苛败,跳轉(zhuǎn)界面,文字轉(zhuǎn)語音并讀出來径簿,頂部彈框罢屈,操作userInfo中的內(nèi)容。
...
NSLog(@"didReceiveNotification:%@", response.notification.request.content.userInfo);
// [ GTSdk ]:將收到的APNs信息傳給個(gè)推統(tǒng)計(jì)
[GeTuiSdk handleRemoteNotification:response.notification.request.content.userInfo];
completionHandler();
}
方法BBB
- 離線的透傳消息:程序離線收到推送時(shí)候篇亭,當(dāng)由離線進(jìn)入在線的時(shí)候會(huì)執(zhí)行(offLine為YES)缠捌。離線的時(shí)候不會(huì)執(zhí)行該方法。
- 在線的透傳消息:程序在線收到推送的時(shí)候會(huì)執(zhí)行(offLine為NO)译蒂。
接收個(gè)推推送的透傳消息曼月,就會(huì)執(zhí)行如下代理方法
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {
拿到payloadData并轉(zhuǎn)成字符串谊却,然后做你想做的操作 :更新UI,跳轉(zhuǎn)界面哑芹,文字轉(zhuǎn)語音并讀出來炎辨,頂部彈框
if (!offLine) {// offLine為NO表示在線的透傳消息。
}else{// offLine為YES表示離線的透傳消息聪姿。
}
}
普通推送->服務(wù)端格式:
$alertmsg=new DictionaryAlertMsg();// 必須有碴萧。 聲明DictionaryAlertMsg的對象alertmsg
$alertmsg->body=$msgContent;// 必須有。 為body賦值
$alertmsg->title=SYS_ZH_NAME;// 必須有末购。 為title賦值
$apn = new IGtAPNPayload();// 必須有破喻。 聲明IGtAPNPayload的對象apn
$apn->alertMsg=$alertmsg;// 必須有alertmsg,且alertmsg中一定有title以及和body招盲,因?yàn)檫@就是客戶端在通知欄/橫幅看到的標(biāo)題和內(nèi)容低缩。
$apn->contentAvailable=0;// 必須為0
$apn->sound=$client_notice;// 必須有sound
$apn->badge=1;// 角標(biāo),可有可無
$apn->add_customMsg("msg",$msgContent);// msg曹货,可有可無
普通推送->客戶端格式:
{
"aps" : {
"sound" : "notice_type1.caf",// 必須有sound
"alert" : { // 必須有咆繁。 服務(wù)器端一定要有alertmsg
"title" : "一秒招聘",// 必須有
"body" : "有一條新的招工信息,點(diǎn)擊查看詳情" // 必須有
},
"badge" : 1,// 角標(biāo)顶籽,可有可無
},
"msg" : "有一條新的招工信息玩般,點(diǎn)擊查看詳情"http:// msg可有可無
}
靜默推送(安安靜靜的、用戶感知不到):當(dāng)APP離線時(shí)礼饱,當(dāng)有推送下達(dá)的時(shí)候,通知欄/橫幅中沒有文字坏为,同時(shí)也不會(huì)發(fā)出聲音)
- 1.應(yīng)用被殺死或者應(yīng)用未啟動(dòng),不會(huì)執(zhí)行如下的代碼。
- 2.應(yīng)用退出到后臺镊绪,當(dāng)收到通知的時(shí)候(不點(diǎn)開通知匀伏,也不打開APP哦),就會(huì)立刻執(zhí)行如下的代碼CCC蝴韭。 所以靜默推送的定義也就出現(xiàn)了:應(yīng)用收到通知后在后臺(background)狀態(tài)下可以執(zhí)行下面一段代碼CCC够颠,可用于從服務(wù)器獲取內(nèi)容更新,做你想做的任何操作(跳轉(zhuǎn)界面,文字轉(zhuǎn)語音并讀出聲音)榄鉴,所以靜默推送不同于其他推送履磨,其他推送不能執(zhí)行代碼CCC。
- 3.APP離線收到推送庆尘,點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入APP/點(diǎn)開通知欄中的通知/點(diǎn)開橫幅中的通知進(jìn)入APP剃诅,會(huì)執(zhí)行個(gè)推提供的 方法DDD的離線的透傳消息
- 4.APP在線收到推送,就不走APNs驶忌,會(huì)直接執(zhí)行個(gè)推提供的 方法DDD的在線的透傳消息
代碼CCC
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
...
做你想做的操作:這里我用蘋果自帶的文字轉(zhuǎn)語音播放userInfo里面的指定內(nèi)容
...
}
方法DDD
- 離線的透傳消息:程序離線收到推送時(shí)候矛辕,當(dāng)由離線進(jìn)入在線的時(shí)候會(huì)執(zhí)行(offLine為YES)。離線的時(shí)候不會(huì)執(zhí)行該方法。
- 在線的透傳消息:程序在線收到推送的時(shí)候會(huì)執(zhí)行(offLine為NO)如筛。
接收個(gè)推推送的透傳消息堡牡,就會(huì)執(zhí)行如下代理方法
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {
拿到payloadData并轉(zhuǎn)成字符串抒抬,然后做你想做的操作 :更新UI杨刨,跳轉(zhuǎn)界面,文字轉(zhuǎn)語音并讀出來擦剑,頂部彈框
if (!offLine) {// offLine為NO表示在線的透傳消息妖胀。
}else{// offLine為YES表示離線的透傳消息。
}
}
靜默推送->服務(wù)端格式:
$apn = new IGtAPNPayload();
$apn->alertMsg="";
$apn->sound="com.gexin.ios.silence";
$apn->contentAvailable=1;
$apn->badge=1;
$apn->add_customMsg("msg",$msgContent);
靜默推送->客戶端格式:
{
"aps" : {
"content-available" : 1,// 必須為1
"badge" : 1 // 角標(biāo)惠勒,可有可無
// 一定不能有alert赚抡,因?yàn)閍lert如果有內(nèi)容,在客戶端的通知欄/橫幅上會(huì)有通知纠屋。
},
"msg" : "有一條新的招工信息涂臣,點(diǎn)擊查看詳情" // 可有可無
}
服務(wù)端(我們公司是PHP)配置靜默推送的格式如下(非常嚴(yán)格,非常嚴(yán)格售担,非常嚴(yán)格赁遗,一項(xiàng)不滿足,就不是靜默推送族铆,那就變成了普通的有文字有聲音的推送):
1.傳入的alertMsg對應(yīng)的值一定為空或者壓根就不傳alertMsg字段岩四。
$apn->alertMsg="";
- contentAvailable的值一定為1
$apn->contentAvailable=1;
3.sound對應(yīng)的值一定為com.gexin.ios.silence.改成其他的字符串的話,應(yīng)用在后臺收到推送時(shí)哥攘,會(huì)聽到"鐺"的一聲剖煌。 或者sound對應(yīng)的值為任意常量也可以實(shí)現(xiàn)靜音(真機(jī)測試過一次,發(fā)現(xiàn)確實(shí)沒有聲音。測試次數(shù)過少逝淹,不是太敢斷定耕姊,如果有想測試的,可以將sound的值設(shè)置成常量試一下)栅葡。
$apn->sound="com.gexin.ios.silence";
4.其他的倒無關(guān)緊要了茉兰,不影響靜默推送的格式。
綜合1.2.3.4,靜默推送妥畏,php服務(wù)端要設(shè)置的核心代碼必定是下面的這種格式:
$apn->alertMsg="";// alertMsg一定不要有值
$apn->sound="com.gexin.ios.silence";
$apn->contentAvailable=1;// 一定為1
以我們項(xiàng)目中靜默推送的實(shí)戰(zhàn)演練
關(guān)鍵代碼如下:
function IGtTransmissionTemplateDemo($appid,$appkey,$msgContent,$keyType,$keyId,$temp_ietm="",$client_notice="default"){
$msg = array(
'keyType' => $keyType,
'keyId' => $keyId,
'msg' => $msgContent,
'nickname' => $temp_ietm
);
$msg = json_encode($msg);
$template = new IGtTransmissionTemplate();
$template->set_appId($appid);//應(yīng)用appid
$template->set_appkey($appkey);//應(yīng)用appkey
$template->set_transmissionType(2);//透傳消息類型
$template->set_transmissionContent($msg);//透傳內(nèi)容
$apn = new IGtAPNPayload();
$alertmsg=new DictionaryAlertMsg();
$alertmsg->body=$msgContent;
$alertmsg->actionLocKey="ActionLockey";
$alertmsg->locKey=$msgContent;
$alertmsg->locArgs=array("locargs");
$alertmsg->launchImage="launchimage";
// IOS8.2 支持
$alertmsg->title=SYS_ZH_NAME;
$alertmsg->titleLocKey=SYS_ZH_NAME;
$alertmsg->titleLocArgs=array("TitleLocArg");
// $apn->alertMsg=$alertmsg;
$apn->alertMsg="";
$apn->sound="com.gexin.ios.silence";
$apn->contentAvailable=1;
$apn->badge=1;
$apn->add_customMsg("payload","payload");
$apn->add_customMsg("keyType",$keyType);
$apn->add_customMsg("keyId",$keyId);
$apn->add_customMsg("nickname",$nickname);
$apn->add_customMsg("msg",$msgContent);
$apn->category="ACTIONABLE";
$template->set_apnInfo($apn);
return $template;
}
來來來邦邦,一起截圖圈重點(diǎn)。
以我們公司做的產(chǎn)品為例:雇主在使用iOS客戶端發(fā)單的時(shí)候醉蚁,后臺監(jiān)聽到雇主成功發(fā)單后燃辖,會(huì)訪問個(gè)推提供的某個(gè)SDK,經(jīng)過一系列的操作。最終iOS客戶端在后臺收到推送通知的時(shí)候网棍,一定會(huì)執(zhí)行xcode中的如下代碼
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
NSLog(@"%@",userInfo);
}
經(jīng)過真機(jī)調(diào)試黔龟,符合靜默推送(因?yàn)槲业膇OS真機(jī)設(shè)備在后臺收到推送時(shí),沒有聲音,沒有文字,并且還執(zhí)行了一段xcode中的方法氏身,方法就在下面)巍棱,
以下截圖是采用靜默推送的方式,iOS客戶端在后臺收到通知時(shí)蛋欣,執(zhí)行xcode中的下面的方法航徙,打印的userInfo中的內(nèi)容。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
// userInfo中的內(nèi)容
{
"_gurl_" : "sdk.open.extension.getui.com:8123",
"_gmid_" : "OSL-0613_EK270rsK7ZA3frD1xut5B5:6b5a07fe4ef9477caa22c01a93aed697:4f561d975e202fcdb57a47068c5b956b",
"keyId" : "1134",
"aps" : {
"content-available" : 1,
"mutable-content" : 1,
"badge" : 1,
"category" : "ACTIONABLE"
},
"keyType" : "7",
"payload" : "payload",
"msg" : "有一條新的招工信息陷虎,點(diǎn)擊查看詳情",
"_ge_" : "1"
}
PS:既然已經(jīng)走到了這里到踏,那么我們就可以實(shí)現(xiàn)這種惡搞的效果了:
用戶已經(jīng)將App退出到后臺,此刻來了一個(gè)推送,通知欄沒有標(biāo)題和內(nèi)容尚猿,但是用戶能聽到一段語音窝稿。用戶很懵逼,不知道是哪個(gè)APP發(fā)出的聲音凿掂。
實(shí)現(xiàn)方法:按照上面的一模一樣的步驟配置成靜默推送伴榔。然后配置如下方法,因?yàn)橄旅娴倪@個(gè)方法是靜默推送必定走的方法(我們在里面偷偷地寫上了文字轉(zhuǎn)語音的代碼庄萎,哈哈哈~~~)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
// 拿到userInfo中的關(guān)鍵內(nèi)容踪少,然后用蘋果自帶的功能進(jìn)行文字轉(zhuǎn)語音
}
靜默推送遇到的坑(靜默推送硬生生的做成了普通推送)。
下面就來看看由于我們公司的后臺惨恭,設(shè)置靜默推送不規(guī)范導(dǎo)致的iOS客戶端在后臺收到推送時(shí)秉馏,有聲音有文字的情況。本質(zhì)上變成了普通推送(有聲音有文字)脱羡。
我們公司的后臺說是 設(shè)置的是靜默推送萝究,但實(shí)際上從他給我PHP文件來看,沒按照靜默推送的格式來锉罐。導(dǎo)致客戶端在后臺時(shí)帆竹,通知欄會(huì)有通知的內(nèi)容展示,同時(shí)也會(huì)有聲音。
這與靜默推送(收到推送,沒有聲音沒有文字)的標(biāo)準(zhǔn)相悖了脓规,導(dǎo)致一直在這個(gè)問題上卡了很久栽连。
在此記錄下來,以備不時(shí)之需侨舆,希望有遇到和我一樣問題的朋友秒紧,少走一些坑。
后臺設(shè)置的有問題的代碼
function IGtTransmissionTemplateDemo($appid,$appkey,$msgContent,$keyType,$keyId,$temp_ietm="",$client_notice="default"){
$msg = array(
'keyType' => $keyType,
'keyId' => $keyId,
'msg' => $msgContent,
'nickname' => $temp_ietm
);
$msg = json_encode($msg);
$template = new IGtTransmissionTemplate();
$template->set_appId($appid);//應(yīng)用appid
$template->set_appkey($appkey);//應(yīng)用appkey
$template->set_transmissionType(2);//透傳消息類型
$template->set_transmissionContent($msg);//透傳內(nèi)容
$apn = new IGtAPNPayload();
$alertmsg=new DictionaryAlertMsg();
$alertmsg->body=$msgContent;
$alertmsg->actionLocKey="ActionLockey";
$alertmsg->locKey=$msgContent;
$alertmsg->locArgs=array("locargs");
$alertmsg->launchImage="launchimage";
// IOS8.2 支持
$alertmsg->title=SYS_ZH_NAME;
$alertmsg->titleLocKey=SYS_ZH_NAME;
$alertmsg->titleLocArgs=array("TitleLocArg");
$apn->alertMsg=$alertmsg;
$apn->contentAvailable=1;
$apn->sound=$client_notice;
$apn->badge=1;
$apn->add_customMsg("payload","payload");
$apn->add_customMsg("keyType",$keyType);
$apn->add_customMsg("keyId",$keyId);
$apn->add_customMsg("nickname",$nickname);
$apn->add_customMsg("msg",$msgContent);
$apn->category="ACTIONABLE";
$template->set_apnInfo($apn);
return $template;
}
截圖展示后臺設(shè)置的有問題的關(guān)鍵代碼
分析靜默推送格式不規(guī)范會(huì)出現(xiàn)哪些問題
以下情況滿足的前提條件:②的值為1挨下,即靜默推送
①是變量熔恢,當(dāng)①有值時(shí),iOS客戶端在后臺收到推送時(shí)臭笆,通知欄會(huì)有推送標(biāo)題和內(nèi)容的展示叙淌。
①是變量秤掌,當(dāng)①?zèng)]有值時(shí),iOS客戶端在后臺收到推送時(shí)鹰霍,通知欄沒有推送標(biāo)題和內(nèi)容的展示闻鉴。
-
③是變量,當(dāng)③有值時(shí):
- 如果xcode中放置的音頻文件和sound對應(yīng)的值一樣茂洒,那么iOS客戶端在后臺收到推送時(shí)孟岛,就會(huì)自動(dòng)
讀出音頻文件的聲音。
- 的是的撒的 - 如果xcode中放置的音頻文件和sound對應(yīng)的值不一樣获黔,或者xcode中根本沒有音頻文件蚀苛,那么iOS客戶端在后臺收到推送時(shí)在验,就會(huì)聽見鐺的一聲玷氏。
- 如果xcode中放置的音頻文件和sound對應(yīng)的值一樣茂洒,那么iOS客戶端在后臺收到推送時(shí)孟岛,就會(huì)自動(dòng)
③是變量,當(dāng)③沒有值時(shí)腋舌,那么iOS客戶端在后臺收到推送時(shí)盏触,就會(huì)聽見鐺的一聲。
PS:以下①和③不是變量的情況块饺。當(dāng)然仍滿足②是靜默推送
PHP后臺代碼中赞辩,將①設(shè)置成空字符串,iOS客戶端在后臺收到推送時(shí)授艰,通知欄沒有推送標(biāo)題和內(nèi)容的展示
PHP后臺代碼中辨嗽,將③設(shè)置成非com.gexin.ios.silence的任意字符串或者不和xcode中的音頻文件重名的,這時(shí)iOS客戶端在后臺收到推送的時(shí)候淮腾,就會(huì)聽見鐺的一聲糟需。
打印的內(nèi)容如下: 經(jīng)過測試iOS客戶端在后臺收到推送時(shí),會(huì)讀取xcode中存放的音頻文件notice_type1.caf,同時(shí)通知欄會(huì)展示標(biāo)題(一秒招聘) 和 內(nèi)容(有一條新的招工信息谷朝,點(diǎn)擊查看詳情)
{
"_gurl_" : "sdk.open.extension.getui.com:8123",
"_gmid_" : "OSL-0613_WzPFJBFf1BAXhORnt7bRn2:e34f8f8517034efa9773415a8d33190f:ada94b80070b9be823f25f8ea4577b92",
"keyId" : "1131",
"aps" : {
"sound" : "notice_type1.caf",
"content-available" : 1,
"alert" : {
"loc-args" : [
"locargs"
],
"title" : "一秒招聘",
"title-loc-args" : [
"TitleLocArg"
],
"title-loc-key" : "一秒招聘",
"action-loc-key" : "ActionLockey",
"body" : "有一條新的招工信息洲押,點(diǎn)擊查看詳情",
"loc-key" : "有一條新的招工信息,點(diǎn)擊查看詳情",
"launch-image" : "launchimage"
},
"mutable-content" : 1,
"category" : "ACTIONABLE",
"badge" : 1
},
"keyType" : "7",
"payload" : "payload",
"msg" : "有一條新的招工信息杈帐,點(diǎn)擊查看詳情",
"_ge_" : "1"
}
以上xcode控制臺輸出的json數(shù)據(jù)若要符合靜默推送,那么必須做如下修改:對應(yīng)的讓服務(wù)端改掉對應(yīng)的內(nèi)容即可
注意:本地存放的音頻文件一定要放在該工作目錄下
PS:當(dāng)然挑童,如果返回的json數(shù)據(jù)里面sound的值為"1"或者任意字符串就會(huì)出現(xiàn)鐺的一聲,如果sound的值能和xcode的該路徑下的音頻文件匹配上站叼,那么iOS客戶端在后臺收到推送時(shí)换薄,會(huì)自動(dòng)讀出匹配到的音頻。
寫到這里我在想冲泥,如果公司沒有強(qiáng)制說要用戶在后臺的時(shí)候,不許在通知欄中展示內(nèi)容和標(biāo)題以及發(fā)出聲音壁涎,那么你可以設(shè)置成在展示內(nèi)容和標(biāo)題以及會(huì)發(fā)出聲音凡恍。此時(shí)content-available設(shè)置為0和1就沒有區(qū)別了,因?yàn)槟阒灰WC如下條件滿足即可:
// alert里面有內(nèi)容 ; 必須保證有值
$apn->alertMsg=$alertmsg;
// 靜默推送 1
$apn->contentAvailable=1;
// sound對應(yīng)的值是字符串com.gexin.ios.silence或者sound對應(yīng)的值是常量會(huì)靜音怔球。
// sound對應(yīng)的值是常量嚼酝,比如$apn->sound=1;會(huì)聽見鐺的一聲。
// sound對應(yīng)的值是變量竟坛,如果xcode中的音頻文件名能和變量對應(yīng)起來闽巩,推送來的時(shí)候,會(huì)自動(dòng)檢索xcode中的音頻文件担汤,檢索到就會(huì)讀出來
$apn->sound=$client_notice;
我們項(xiàng)目中有這么個(gè)需求涎跨,APP中所有的音頻要么采用文字轉(zhuǎn)語音,要么用錄制好的音頻文件崭歧,但是因?yàn)橥扑偷膬?nèi)容有變量隅很,比如xxx簽到了您的家政服務(wù)工作,所以不能用錄制好的音頻文件率碾。所以需求就這么出現(xiàn)了:
當(dāng)推送過來的時(shí)候(在線叔营、離線),有通知播掷、系統(tǒng)推送來的鐺的一聲沒做要求审编、 文字轉(zhuǎn)語音。明確規(guī)定歧匈,要對推送過來的通知內(nèi)容進(jìn)行文字轉(zhuǎn)語音垒酬,不能用錄制好的音頻文件,
分析(在線走個(gè)推件炉,所以肯定能文字轉(zhuǎn)語音勘究,這里就不說了,以下分析的是離線(APP在后臺運(yùn)行/APP未啟動(dòng)/APP被殺死)的情況)斟冕,不考慮點(diǎn)擊通知進(jìn)入APP的情況:
-
如果單純采用標(biāo)準(zhǔn)的靜默推送口糕,肯定達(dá)不到效果:因?yàn)橹灰响o默推送的格式,來推送的時(shí)候磕蛇,沒有通知也沒有聲音(鐺的一聲)景描。
- 當(dāng)程序在后臺的時(shí)候,推送來的時(shí)候十办,還能執(zhí)行一段方法(可以文字轉(zhuǎn)語音讀出來)。效果:通知欄沒有通知超棺、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)向族、文字轉(zhuǎn)語音。所以不符合棠绘。
- 當(dāng)APP被殺死或者APP未啟動(dòng)的時(shí)候件相,推送來的時(shí)候,不會(huì)執(zhí)行這段方法(代碼都不走了氧苍,肯定沒法進(jìn)行文字轉(zhuǎn)語音了)夜矗。效果:通知欄沒有通知、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)让虐、沒有文字轉(zhuǎn)語音紊撕。所以不符合。
-
如果單純采用標(biāo)準(zhǔn)的普通推送澄干,肯定達(dá)不到效果:
- 當(dāng)程序離線(APP在后臺運(yùn)行/APP未啟動(dòng)/APP被殺死)的時(shí)候,推送來的時(shí)候逛揩,有通知,有聲音(鐺的一聲麸俘,不是文字轉(zhuǎn)語音的聲音),由于不能用錄制好的音頻文件惧笛,所以我將xcode里面的音頻文件刪除了从媚,因此不會(huì)讀音頻文件。普通推送不點(diǎn)擊通知患整,離線不會(huì)走xcode項(xiàng)目里面的任何代碼拜效,所以沒法進(jìn)行文字轉(zhuǎn)語音。效果:通知欄有通知各谚、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)紧憾、沒有文字轉(zhuǎn)語音。所以不符合昌渤。
采用普通推送+靜默推送混合的方式赴穗,APP在后臺運(yùn)行能符合要求,APP未啟動(dòng)/APP被殺死不符合要求:
先說一下普通推送+靜默推送混合的后臺大致格式膀息,具體參考上面的代碼:
// alert里面有內(nèi)容 般眉。普通推送alert中有內(nèi)容
$apn->alertMsg=$alertmsg;
// 靜默推送 1 之所以設(shè)置為1,是為了走xcode里面的某個(gè)方法
$apn->contentAvailable=1;
// sound對應(yīng)的值是字符串com.gexin.ios.silence或者sound對應(yīng)的值是常量會(huì)靜音潜支。
// sound對應(yīng)的值是常量甸赃,比如$apn->sound=1;會(huì)聽見鐺的一聲。
// sound對應(yīng)的值是變量冗酿,如果xcode中的音頻文件名能和變量對應(yīng)起來埠对,推送來的時(shí)候络断,會(huì)自動(dòng)檢索xcode中的音頻文件,檢索到就會(huì)讀出來
$apn->sound=1;// 有鐺的聲音
- 當(dāng)程序在后臺的時(shí)候,推送來的時(shí)候项玛,有通知妓羊,鐺的一聲有無(看后臺配置的sound對應(yīng)的值),同時(shí)還能執(zhí)行xcode里面的一段方法(該段方法里面寫了文字轉(zhuǎn)語音的代碼)稍计。效果:通知欄有通知躁绸、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)、文字轉(zhuǎn)語音臣嚣。所以符合净刮。
- 當(dāng)APP被殺死或者APP未啟動(dòng)的時(shí)候,推送來的時(shí)候硅则,通知欄有通知淹父、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)、沒有文字轉(zhuǎn)語音怎虫。所以不符合暑认。