wolfmanlx
wolfmanlx
  • 发布:2017-09-25 10:41
  • 更新:2019-10-16 14:10
  • 阅读:8297

ios 自定义消息提示音, 当APP处于离线模式的时候,为了满足我们的需求通常需要自定义消息提示音

分类:5+ SDK

自己做项目,通常会遇到各种需求。现在项目就需要自定义消息提示音。

于是来了官方文档里面搜索,发现大家解决自定义消息提示音的方案都是这样解决的 我直接上代码:
这个我只是说一下,重要的代码在后面。
//------------------------------个推消息接收------------------------------------------------------------
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 锁屏的时候自定义消息提示音

0 关注 分享

要回复文章请先登录注册

t***@163.com

t***@163.com

回复 wolfmanlx :
楼主,安卓的自定义推送语音怎么做啊?
2019-10-16 14:10
1***@163.com

1***@163.com

能看到吗???大佬急需您的指点
2019-03-14 14:20
flymoo

flymoo

楼主抄袭别人的文章,也不标注下参考来源?
2017-10-23 10:03
wolfmanlx

wolfmanlx (作者)

有问题可以联系我,我的功能已实现、:qq 1273751522@qq.com
2017-09-25 10:44