飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

APP使用小米消息推送自定义铃声iOS版

Author:飘易 Source:飘易
Categories:移动开发 PostTime:2017-7-13 10:09:45
正 文:

APP使用小米消息推送sdk的情况下,怎么自定义铃声呢?项目场景是利用Hbuilder云端打包iOS版,我们拿到手的是云端打包好的.ipa文件,和Hbuilder技术沟通,得到明确的答复是云端打包不支持添加自定义的声音资源到ipa包里去,只能离线打包。看来Hbuilder还是任重而道远啊,有很多技术细节还要不断完善。


先看小米推送iOS版官方文档

自定义通知声音需要满足以下条件:

1. 声音文件必须放在app bundle中

2. 声音文件的格式只支持aiff, wav, caf

3. 声音文件的时长不能超过30秒,否则会用默认系统通知声音替代。

具体做法:
1. 将声音文件 pushsound.aiff 拖入Xcode工程的main bundle的目录下

2. 发送推送的时候设置SDK自定义声音字段 soundURL = “pushsound.aiff”,在收到消息的中,”aps”: { “sound” : “pushsound.aiff”}



再看下apple官方对于消息推送自定义铃声的说明文档

Preparing Custom Alert Sounds

Local and remote notifications can specify custom alert sounds to be played when the notification is delivered. You can package the audio data in an aiff, wav, or caf file. Because they are played by the system-sound facility, custom sounds must be in one of the following audio data formats:

Linear PCM
MA4 (IMA/ADPCM)
uLaw
aLaw

Place custom sound files in your app bundle or in the Library/Sounds folder of your app’s container directory. Custom sounds must be under 30 seconds when played. If a custom sound is over that limit, the default system sound is played instead.


可以看出,小米只是照搬了Apple的说明而已,毕竟所有集成iOS消息推送的第三方推送都是靠苹果的APNS吃饭而已(再套一层壳)。


在原生iOS开发中,要添加声音资源,必须把这些资源添加到app bundle中,实现方法有二:

方法1、项目设置中 Build Phases ->Copy Bundle Resources 中添加声音文件。

方法2、采用 “Add Files to xx(project name)”的方式将对应的声音文件夹添加到工程里面。


还要满足下述条件

1.音频文件格式: .aiff 、.wav 、.caf ;

2.自定义音频文件位置:App bundle 或者 Library/Sounds 文件夹下;

3.自定义音频时长:不超过30s,过长会被默认音替代;

4.服务器端的Sound字段:需要同App内的音频文件名字相同,带上后缀名(例如:sub.caf)。


好,回到正题,我们手里已经拿到了.ipa文件包,如何实现消息推送时的自定义铃声呢?


首先,我们明确.ipa包其实本质上是zip压缩包而已,我们把后缀改成.zip,就可以打开查看里面的目录结构 Payload/DCloud_Pandora.app/:


_CodeSignature 文件夹存放的是签名文件信息,所有的文件都会进行签名,所以如果你直接修改里面的任意一个文件都会导致签名校验失败,从而不能安装;

embedded.mobileprovision 文件是从apple官网上下载下来的发布描述文件。


那么,我们现在要增加声音文件到这个包里,势必会破坏上面的签名,所以在添加了声音等资源文件之后,我们必须要重新签名,下面跟着飘易走一遍流程吧(注意下面的操作都是在MAC OSX系统里):


正确的解锁姿势来啦(请先确保 OSX系统 & XCODE & Hbuilder 都是最新版本):


1、解压

unzip Demo.ipa

得到Payload文件夹,里面有DCloud_Pandora.app包,右键显示包内容,可以增删改里面的资源文件,这里我们就增加几个音频文件,比如 message1.caf、message2.caf、message3.caf 等。


2、删除签名文件夹 _CodeSignature(可选,不删除后面签名时强制覆盖即可)

rm -rf Payload/DCloud_Pandora.app/_CodeSignature/


3、替换证书描述文件(可选,如果是自己的app,描述文件没有改变可以不替换):

cp embedded.mobileprovision Payload/DCloud_Pandora.app

注意,该 embedded.mobileprovision 文件就是我们从苹果开发者中心下载下来的 描述文件


4、OSX系统里重新签名(关键一步):

codesign -f -s "iPhone Distribution: company name (5BF53xxxxx)" --entitlements entitlements.plist Payload/DCloud_Pandora.app

注意,发布证书需要替换成自己的,company name 和 5BF53xxxxx 改成自己的证书信息,这个证书信息在OSX系统里的 钥匙串 里查找;entitlements.plist这个文件怎么来的,其实就是从第3步里提到的描述文件里导出来的,具体的飘易下面讲。


验证签名后的.app文件

codesign --verify Payload/DCloud_Pandora.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的,【bundleID】是打包的app id。


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


安卓版本的可以查看APP集成小米消息推送自定义铃声设置



【参考】:

1、Apple官方Managing Your App's Notification Support

2、iOS代码签名探析

3、iOS技术-APP的签名和重打包的学习

4、ios打包--ipa包重签

5、iOS批量自动打包和部署(Ⅲ):重新签名和自动部署

6、iOS证书及ipa包重签名探究

7、iOS开发——ipa包重签

作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:APP消息推送是否进入消息中心和click、receive事件分析
下一篇:C#创建window service服务启动另外的winform
0条评论 “APP使用小米消息推送自定义铃声iOS版”
No Comment .
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2019 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有