自己做项目,通常会遇到各种需求。现在项目就需要自定义消息提示音。
于是来了官方文档里面搜索,发现大家解决自定义消息提示音的方案都是这样解决的 我直接上代码:
这个我只是说一下,重要的代码在后面。
//------------------------------个推消息接收------------------------------------------------------------
document.addEventListener("plusready", function() {
//message = document.getElementById("message");
//mui.alert("来了");
// 监听点击消息事件
plus.push.addEventListener("click", function(msg) {
// 判断是从本地创建还是离线推送的消息
switch(msg.payload) {
case "LocalMSG":
break;
default:
player();
//清空当前消息
plus.push.clear();
break;
}
// 提示点击的内容
//plus.ui.alert(JSON.stringify(msg));
// 处理其它数据
//logoutPushMsg(msg);
}, false);
// 监听在线消息事件
plus.push.addEventListener("receive", function(msg) {
plus.push.createMessage("消息推送来了",null,{
sound:'none',
delay:3
})
setTimeout(function(){
player();
},3000);
if(msg.aps) {
// Apple APNS message
} else {
//alert("接收到在线透传消息:");
var messageContent=JSON.parse(msg.content);
var type=messageContent.type;
}
//logoutPushMsg(msg);
}, false);
}, false);
简单来说,就是通过个推透传,APP 监听receive 事件,然后来控制消息中心。
plus.push.setAutoNotification( false ); 通过这段代码来自行定义系统消息中心,目前来说 官方文档给出的解释就是Android 支持,而ios不支持。
所以这很坑啊 ,如果通过监听receive 事件,创建本地消息,然后播放声音,这种方式在Android APP 不管出于什么模式都可以,但是如果ios 出于离线模式就行不通了。
那么ios 的自定义消息提示音该如何解决呢?
我们从hbuilder 打包,那么官方返回的是一个ipa 的苹果APP安装包,实际上也是一个压缩文件。
和Hbuilder技术沟通,得到明确的答复是云端打包不支持添加自定义的声音资源到ipa包里去,只能离线打包。看来Hbuilder还是任重而道远啊,有很多技术细节还要不断完善。
下面是ios 自定义消息提示音的解决方案
第一 首先你的有MAC OSX系统,因为以下操作都是在MAC OSX系统里面完成的,如果有苹果电脑那自然好。 如果没有苹果电脑那么怎么办,只能自己安装虚拟机(如果虚拟机不懂,自己百度 )
好人做到底我送上 虚拟机 os 系统的链接:Yosemite Install(14A389).cdr
第二安装好系统后执行如下操作。
正确的解锁姿势来啦:
1、解压
unzip xxx.ipa
得到Payload文件夹,里面有xxx.app包,右键显示包内容,可以增删改里面的资源文件,这里我们就增加几个音频文件,比如 message1.caf、message2.caf、message3.caf 等。
2、删除签名文件夹 _CodeSignature
rm -rf Payload/xxx.app/_CodeSignature/
3、替换证书描述文件(可选,如果是自己的app,描述文件没有改变可以不替换):
cp embedded.mobileprovision Payload/xxx.app
4、重新签名(关键一步):
codesign -f -s "iPhone Distribution: company name (5BF53xxxxx)" --entitlements entitlements.plist Payload/xxx.app
注意,发布证书需要替换成自己的,company name 和 5BF53xxxxx 改成自己的证书信息;entitlements.plist这个文件怎么来的,飘易下面讲。
验证签名后的.app文件
codesign --verify xxx.app
如果没有任何输出信息,代表没有问题。
5、重新打包:
zip -r new.ipa Payload
好了,到这里我们就得到新的.ipa包了,可以拿这个包去app store 重新上架了。
剩下的事情就是服务器端发送消息推送的时候,指明用哪个声音文件即可:
<?php
public function iOS_message($msg_title, $msg_content, $badge=''){
//消息对象
$message = new IOSBuilder();
$message->title($msg_title);//标题
$message->description($msg_content);//内容
$message->body($msg_content);//内容,会覆盖description
$message->soundUrl('shaking.caf');
if(!empty($badge)) $message->badge($badge);//自定义通知数字角标
$message->build();
//返回
return $message;
}
上面重新签名的过程中可能涉及到的几个知识点:
1、查看.app的相关信息
codesign -vv -d Test.app
2、调用xcode查看或修改info.plist:
open Payload/xxx.app/info.plist
注意修改Bundle identifier后的弊端是第三方sdk失效,比如不能进行微博登录,不能收到推送等等。
3、查看.mobileprovision文件内部信息:
security cms -D -i example.mobileprovision
或者从.app包里查看:
codesign -d --entitlements - Test.app
4、从.mobileprovision文件里面直接导出entitlements.plist:
/usr/libexec/PlistBuddy -x -c "print:Entitlements" /dev/stdin <<< $(security cms -D -i embedded.mobileprovision) > entitlements.plist
entitlements.plist文件里面的内容参考:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>Prefix.bundleID</string>
<key>aps-environment</key>
<string>production</string>
<key>beta-reports-active</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>Prefix</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>Prefix.*</string>
</array>
</dict>
</plist>
注意,Prefix 替换成你自己app的。
5、早期的签名codesign有一个参数叫:--resource-rules Payload/xxx.app/ResourceRules.plist
在OSX 10.10的版本及更高的版本上会提示你已弃用:
Warning: --resource-rules has been deprecated in Mac OS X >= 10.10!
6、如何导出iOS支持的音频格式 .aiff 、.wav 、.caf
MAC提供了一个工具 :afconvert
比如, 把16位的PCM 格式的音频sub.aiff 转换成数据类型为 IMA4的后缀为.caf的文件,终端里执行下面的命令即可:
afconvert sub.aiff sub.caf -d ima4 -f caff -v
mp3转成caf:
afconvert sub.mp3 sub.caf -d ima4 -f caff -v
根据飘易的测试,caf后缀的音频文件比wav和aiff的都要小一点。
更多的帮助,查看支持的格式:
afconvert -hf
Android的我就不说了,简单得不要不要的。
效果就是推送 ios 锁屏的时候自定义消息提示音