寫在前面:應(yīng)用場景很重要
如果你的公司有這樣一個硬性的需求:用戶將APP退出到后臺的時候,當(dāng)該用戶收到推送的時候,不讓用戶感覺到推送過來了,不想打擾用戶,但是還想拿到推送內(nèi)容做一些事情。
在開發(fā)人員看來就是要實現(xiàn)如下功能:通知欄沒有文字、沒有內(nèi)容、也沒有聲音,同時還要能實現(xiàn)客戶端退出到后臺時,還能執(zhí)行xcode中的某個特定方法,那么此時就可以用到靜默推送。
必須知道個推中這些名詞的含義,后面再出現(xiàn)這些名詞就不做闡述了
離線:APP在后臺運行/APP未啟動/APP被殺死。
在線:APP在前臺運行。
iOS 個推透傳機制
iOS消息推送方式只有兩種:
APNs的通知欄消息
個推的透傳消息
以下說的是普通推送和靜默推送的不同之處:
普通推送:當(dāng)APP離線時,當(dāng)有推送下達的時候,走的是APNs,所以手機會有鈴聲、手機頂部出現(xiàn)橫幅/通知欄會收到通知。
APP離線時,相關(guān)方法什么時候執(zhí)行,看下面1-4就知道了:
1.只有點開通知欄中的通知進入APP/點開橫幅中的通知進入APP,才會執(zhí)行方法AAA;不點擊不執(zhí)行。
2.點擊應(yīng)用圖標進入APP,一定不會執(zhí)行方法AAA。
3.APP離線收到推送,點擊應(yīng)用圖標進入APP/點開通知欄中的通知/點開橫幅中的通知進入APP,會執(zhí)行個推提供的 方法BBB的離線的透傳消息
4.APP在線收到推送,就不走APNs,會直接執(zhí)行個推提供的 方法BBB的在線的透傳消息總結(jié):綜合1-4,只要點開APNs發(fā)來的通知,那么先執(zhí)行方法AAA,再執(zhí)行個推的方法BBB
方法AAA
iOS 10之前,點通知,會調(diào)用如下方法。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
...
做你想做的操作。例如更新UI,跳轉(zhuǎn)界面,文字轉(zhuǎn)語音并讀出來,頂部彈框,操作userInfo中的內(nèi)容。
...
}
iOS 10 及以后版本,點擊通知,會調(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信息傳給個推統(tǒng)計
[GeTuiSdk handleRemoteNotification:response.notification.request.content.userInfo];
completionHandler();
}
方法BBB
- 離線的透傳消息:程序離線收到推送時候,當(dāng)由離線進入在線的時候會執(zhí)行(offLine為YES)。離線的時候不會執(zhí)行該方法。
- 在線的透傳消息:程序在線收到推送的時候會執(zhí)行(offLine為NO)。
接收個推推送的透傳消息,就會執(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,因為這就是客戶端在通知欄/橫幅看到的標題和內(nèi)容。
$apn->contentAvailable=0;// 必須為0
$apn->sound=$client_notice;// 必須有sound
$apn->badge=1;// 角標,可有可無
$apn->add_customMsg("msg",$msgContent);// msg,可有可無
普通推送->客戶端格式:
{
"aps" : {
"sound" : "notice_type1.caf",// 必須有sound
"alert" : { // 必須有。 服務(wù)器端一定要有alertmsg
"title" : "一秒招聘",// 必須有
"body" : "有一條新的招工信息,點擊查看詳情" // 必須有
},
"badge" : 1,// 角標,可有可無
},
"msg" : "有一條新的招工信息,點擊查看詳情"http:// msg可有可無
}
靜默推送(安安靜靜的、用戶感知不到):當(dāng)APP離線時,當(dāng)有推送下達的時候,通知欄/橫幅中沒有文字,同時也不會發(fā)出聲音)
- 1.應(yīng)用被殺死或者應(yīng)用未啟動,不會執(zhí)行如下的代碼。
- 2.應(yīng)用退出到后臺,當(dāng)收到通知的時候(不點開通知,也不打開APP哦),就會立刻執(zhí)行如下的代碼CCC。 所以靜默推送的定義也就出現(xiàn)了:應(yīng)用收到通知后在后臺(background)狀態(tài)下可以執(zhí)行下面一段代碼CCC,可用于從服務(wù)器獲取內(nèi)容更新,做你想做的任何操作(跳轉(zhuǎn)界面,文字轉(zhuǎn)語音并讀出聲音),所以靜默推送不同于其他推送,其他推送不能執(zhí)行代碼CCC。
- 3.APP離線收到推送,點擊應(yīng)用圖標進入APP/點開通知欄中的通知/點開橫幅中的通知進入APP,會執(zhí)行個推提供的 方法DDD的離線的透傳消息
- 4.APP在線收到推送,就不走APNs,會直接執(zhí)行個推提供的 方法DDD的在線的透傳消息
代碼CCC
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
...
做你想做的操作:這里我用蘋果自帶的文字轉(zhuǎn)語音播放userInfo里面的指定內(nèi)容
...
}
方法DDD
- 離線的透傳消息:程序離線收到推送時候,當(dāng)由離線進入在線的時候會執(zhí)行(offLine為YES)。離線的時候不會執(zhí)行該方法。
- 在線的透傳消息:程序在線收到推送的時候會執(zhí)行(offLine為NO)。
接收個推推送的透傳消息,就會執(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 // 角標,可有可無
// 一定不能有alert,因為alert如果有內(nèi)容,在客戶端的通知欄/橫幅上會有通知。
},
"msg" : "有一條新的招工信息,點擊查看詳情" // 可有可無
}
服務(wù)端(我們公司是PHP)配置靜默推送的格式如下(非常嚴格,非常嚴格,非常嚴格,一項不滿足,就不是靜默推送,那就變成了普通的有文字有聲音的推送):
1.傳入的alertMsg對應(yīng)的值一定為空或者壓根就不傳alertMsg字段。
$apn->alertMsg="";
- contentAvailable的值一定為1
$apn->contentAvailable=1;
3.sound對應(yīng)的值一定為com.gexin.ios.silence.改成其他的字符串的話,應(yīng)用在后臺收到推送時,會聽到"鐺"的一聲。 或者sound對應(yīng)的值為任意常量也可以實現(xiàn)靜音(真機測試過一次,發(fā)現(xiàn)確實沒有聲音。測試次數(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
以我們項目中靜默推送的實戰(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;
}
來來來,一起截圖圈重點。
以我們公司做的產(chǎn)品為例:雇主在使用iOS客戶端發(fā)單的時候,后臺監(jiān)聽到雇主成功發(fā)單后,會訪問個推提供的某個SDK,經(jīng)過一系列的操作。最終iOS客戶端在后臺收到推送通知的時候,一定會執(zhí)行xcode中的如下代碼
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
NSLog(@"%@",userInfo);
}
經(jīng)過真機調(diào)試,符合靜默推送(因為我的iOS真機設(shè)備在后臺收到推送時,沒有聲音,沒有文字,并且還執(zhí)行了一段xcode中的方法,方法就在下面),
以下截圖是采用靜默推送的方式,iOS客戶端在后臺收到通知時,執(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" : "有一條新的招工信息,點擊查看詳情",
"_ge_" : "1"
}
PS:既然已經(jīng)走到了這里,那么我們就可以實現(xiàn)這種惡搞的效果了:
用戶已經(jīng)將App退出到后臺,此刻來了一個推送,通知欄沒有標題和內(nèi)容,但是用戶能聽到一段語音。用戶很懵逼,不知道是哪個APP發(fā)出的聲音。
實現(xiàn)方法:按照上面的一模一樣的步驟配置成靜默推送。然后配置如下方法,因為下面的這個方法是靜默推送必定走的方法(我們在里面偷偷地寫上了文字轉(zhuǎn)語音的代碼,哈哈哈~~~)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
// 拿到userInfo中的關(guān)鍵內(nèi)容,然后用蘋果自帶的功能進行文字轉(zhuǎn)語音
}
靜默推送遇到的坑(靜默推送硬生生的做成了普通推送)。
下面就來看看由于我們公司的后臺,設(shè)置靜默推送不規(guī)范導(dǎo)致的iOS客戶端在后臺收到推送時,有聲音有文字的情況。本質(zhì)上變成了普通推送(有聲音有文字)。
我們公司的后臺說是 設(shè)置的是靜默推送,但實際上從他給我PHP文件來看,沒按照靜默推送的格式來。導(dǎo)致客戶端在后臺時,通知欄會有通知的內(nèi)容展示,同時也會有聲音。
這與靜默推送(收到推送,沒有聲音沒有文字)的標準相悖了,導(dǎo)致一直在這個問題上卡了很久。
在此記錄下來,以備不時之需,希望有遇到和我一樣問題的朋友,少走一些坑。
后臺設(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ī)范會出現(xiàn)哪些問題
以下情況滿足的前提條件:②的值為1,即靜默推送
①是變量,當(dāng)①有值時,iOS客戶端在后臺收到推送時,通知欄會有推送標題和內(nèi)容的展示。
①是變量,當(dāng)①沒有值時,iOS客戶端在后臺收到推送時,通知欄沒有推送標題和內(nèi)容的展示。
-
③是變量,當(dāng)③有值時:
- 如果xcode中放置的音頻文件和sound對應(yīng)的值一樣,那么iOS客戶端在后臺收到推送時,就會自動
讀出音頻文件的聲音。
- 的是的撒的 - 如果xcode中放置的音頻文件和sound對應(yīng)的值不一樣,或者xcode中根本沒有音頻文件,那么iOS客戶端在后臺收到推送時,就會聽見鐺的一聲。
- 如果xcode中放置的音頻文件和sound對應(yīng)的值一樣,那么iOS客戶端在后臺收到推送時,就會自動
③是變量,當(dāng)③沒有值時,那么iOS客戶端在后臺收到推送時,就會聽見鐺的一聲。
PS:以下①和③不是變量的情況。當(dāng)然仍滿足②是靜默推送
PHP后臺代碼中,將①設(shè)置成空字符串,iOS客戶端在后臺收到推送時,通知欄沒有推送標題和內(nèi)容的展示
PHP后臺代碼中,將③設(shè)置成非com.gexin.ios.silence的任意字符串或者不和xcode中的音頻文件重名的,這時iOS客戶端在后臺收到推送的時候,就會聽見鐺的一聲。
打印的內(nèi)容如下: 經(jīng)過測試iOS客戶端在后臺收到推送時,會讀取xcode中存放的音頻文件notice_type1.caf,同時通知欄會展示標題(一秒招聘) 和 內(nèi)容(有一條新的招工信息,點擊查看詳情)
{
"_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" : "有一條新的招工信息,點擊查看詳情",
"loc-key" : "有一條新的招工信息,點擊查看詳情",
"launch-image" : "launchimage"
},
"mutable-content" : 1,
"category" : "ACTIONABLE",
"badge" : 1
},
"keyType" : "7",
"payload" : "payload",
"msg" : "有一條新的招工信息,點擊查看詳情",
"_ge_" : "1"
}
以上xcode控制臺輸出的json數(shù)據(jù)若要符合靜默推送,那么必須做如下修改:對應(yīng)的讓服務(wù)端改掉對應(yīng)的內(nèi)容即可
注意:本地存放的音頻文件一定要放在該工作目錄下
PS:當(dāng)然,如果返回的json數(shù)據(jù)里面sound的值為"1"或者任意字符串就會出現(xiàn)鐺的一聲,如果sound的值能和xcode的該路徑下的音頻文件匹配上,那么iOS客戶端在后臺收到推送時,會自動讀出匹配到的音頻。
寫到這里我在想,如果公司沒有強制說要用戶在后臺的時候,不許在通知欄中展示內(nèi)容和標題以及發(fā)出聲音,那么你可以設(shè)置成在展示內(nèi)容和標題以及會發(fā)出聲音。此時content-available設(shè)置為0和1就沒有區(qū)別了,因為你只要保證如下條件滿足即可:
// alert里面有內(nèi)容 ; 必須保證有值
$apn->alertMsg=$alertmsg;
// 靜默推送 1
$apn->contentAvailable=1;
// sound對應(yīng)的值是字符串com.gexin.ios.silence或者sound對應(yīng)的值是常量會靜音。
// sound對應(yīng)的值是常量,比如$apn->sound=1;會聽見鐺的一聲。
// sound對應(yīng)的值是變量,如果xcode中的音頻文件名能和變量對應(yīng)起來,推送來的時候,會自動檢索xcode中的音頻文件,檢索到就會讀出來
$apn->sound=$client_notice;
我們項目中有這么個需求,APP中所有的音頻要么采用文字轉(zhuǎn)語音,要么用錄制好的音頻文件,但是因為推送的內(nèi)容有變量,比如xxx簽到了您的家政服務(wù)工作,所以不能用錄制好的音頻文件。所以需求就這么出現(xiàn)了:
當(dāng)推送過來的時候(在線、離線),有通知、系統(tǒng)推送來的鐺的一聲沒做要求、 文字轉(zhuǎn)語音。明確規(guī)定,要對推送過來的通知內(nèi)容進行文字轉(zhuǎn)語音,不能用錄制好的音頻文件,
分析(在線走個推,所以肯定能文字轉(zhuǎn)語音,這里就不說了,以下分析的是離線(APP在后臺運行/APP未啟動/APP被殺死)的情況),不考慮點擊通知進入APP的情況:
-
如果單純采用標準的靜默推送,肯定達不到效果:因為只要符合靜默推送的格式,來推送的時候,沒有通知也沒有聲音(鐺的一聲)。
- 當(dāng)程序在后臺的時候,推送來的時候,還能執(zhí)行一段方法(可以文字轉(zhuǎn)語音讀出來)。效果:通知欄沒有通知、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)、文字轉(zhuǎn)語音。所以不符合。
- 當(dāng)APP被殺死或者APP未啟動的時候,推送來的時候,不會執(zhí)行這段方法(代碼都不走了,肯定沒法進行文字轉(zhuǎn)語音了)。效果:通知欄沒有通知、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)、沒有文字轉(zhuǎn)語音。所以不符合。
-
如果單純采用標準的普通推送,肯定達不到效果:
- 當(dāng)程序離線(APP在后臺運行/APP未啟動/APP被殺死)的時候,推送來的時候,有通知,有聲音(鐺的一聲,不是文字轉(zhuǎn)語音的聲音),由于不能用錄制好的音頻文件,所以我將xcode里面的音頻文件刪除了,因此不會讀音頻文件。普通推送不點擊通知,離線不會走xcode項目里面的任何代碼,所以沒法進行文字轉(zhuǎn)語音。效果:通知欄有通知、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)、沒有文字轉(zhuǎn)語音。所以不符合。
采用普通推送+靜默推送混合的方式,APP在后臺運行能符合要求,APP未啟動/APP被殺死不符合要求:
先說一下普通推送+靜默推送混合的后臺大致格式,具體參考上面的代碼:
// alert里面有內(nèi)容 。普通推送alert中有內(nèi)容
$apn->alertMsg=$alertmsg;
// 靜默推送 1 之所以設(shè)置為1,是為了走xcode里面的某個方法
$apn->contentAvailable=1;
// sound對應(yīng)的值是字符串com.gexin.ios.silence或者sound對應(yīng)的值是常量會靜音。
// sound對應(yīng)的值是常量,比如$apn->sound=1;會聽見鐺的一聲。
// sound對應(yīng)的值是變量,如果xcode中的音頻文件名能和變量對應(yīng)起來,推送來的時候,會自動檢索xcode中的音頻文件,檢索到就會讀出來
$apn->sound=1;// 有鐺的聲音
- 當(dāng)程序在后臺的時候,推送來的時候,有通知,鐺的一聲有無(看后臺配置的sound對應(yīng)的值),同時還能執(zhí)行xcode里面的一段方法(該段方法里面寫了文字轉(zhuǎn)語音的代碼)。效果:通知欄有通知、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)、文字轉(zhuǎn)語音。所以符合。
- 當(dāng)APP被殺死或者APP未啟動的時候,推送來的時候,通知欄有通知、鐺的一聲有無(看后臺配置的sound對應(yīng)的值)、沒有文字轉(zhuǎn)語音。所以不符合。