iOS 普通推送和靜默推送【公司要求用個(gè)推】

寫在前面:應(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="";
  1. 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)。
image.png
以我們公司做的產(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"
}

image.png

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)語音
}
image.png

靜默推送遇到的坑(靜默推送硬生生的做成了普通推送)。

下面就來看看由于我們公司的后臺惨恭,設(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)鍵代碼
image.png

分析靜默推送格式不規(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ì)聽見鐺的一聲玷氏。
  • ③是變量,當(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)容即可
image.png

注意:本地存放的音頻文件一定要放在該工作目錄下
image.png

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)語音怎虫。所以不符合暑认。
所以,針對我們公司的要求大审,只能采用普通推送+靜默推送混合的方式蘸际,這種方式APP在后臺的時(shí)候滿足公司的需求,APP被殺死或者APP未啟動(dòng)的時(shí)候徒扶,不滿足需求粮彤,這是蘋果的機(jī)制問題,這是最能契合公司需求的做法了姜骡,目前只能這么做导坟,如果有其他方法,朋友們麻煩@一下我哦圈澈。

................................

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惫周,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子康栈,更是在濱河造成了極大的恐慌递递,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谅将,死亡現(xiàn)場離奇詭異漾狼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饥臂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門逊躁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隅熙,你說我怎么就攤上這事稽煤『搜浚” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵酵熙,是天一觀的道長轧简。 經(jīng)常有香客問我,道長匾二,這世上最難降的妖魔是什么哮独? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮察藐,結(jié)果婚禮上皮璧,老公的妹妹穿的比我還像新娘。我一直安慰自己分飞,他們只是感情好悴务,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著譬猫,像睡著了一般讯檐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上染服,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天别洪,我揣著相機(jī)與錄音,去河邊找鬼肌索。 笑死蕉拢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诚亚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼午乓,長吁一口氣:“原來是場噩夢啊……” “哼站宗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起益愈,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梢灭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蒸其,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敏释,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年摸袁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钥顽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靠汁,死狀恐怖蜂大,靈堂內(nèi)的尸體忽然破棺而出闽铐,到底是詐尸還是另有隱情,我是刑警寧澤奶浦,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布兄墅,位于F島的核電站,受9級特大地震影響澳叉,放射性物質(zhì)發(fā)生泄漏隙咸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一成洗、第九天 我趴在偏房一處隱蔽的房頂上張望五督。 院中可真熱鬧,春花似錦泌枪、人聲如沸概荷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽误证。三九已至,卻和暖如春修壕,著一層夾襖步出監(jiān)牢的瞬間愈捅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工慈鸠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓝谨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓青团,卻偏偏與公主長得像譬巫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子督笆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1芦昔、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,982評論 3 119
  • 星期一,沒有應(yīng)酬娃肿。在簡書大師群的課堂里咕缎,不由心生創(chuàng)作靈感,五月,于是我愛上了炒面料扰。 新鮮的青豆凭豪,代表五月曾經(jīng)的青春...
    北寒弘谷閱讀 313評論 0 3
  • 嘛,最終我們都會(huì)敗給時(shí)間末早。這話聽了這么多年烟馅,我也覺得累了,反正昨晚又一次體驗(yàn)到了唄然磷。任你戎馬歲月郑趁,逃不過時(shí)光無情。...
    空白_人生閱讀 463評論 0 46