公司正在研发的一款App,需要在进行消息推送时支持语音播报。 具体要求:
苹果的APNs消息推送, 支持在应用未打开及设备锁屏状态下收到推送。 而同时进行语音播报,则需要做一些特殊处理。 目前语音播报的场景有两种: 一种是固定音频的播放, 一种是需要动态合成后的音频播放。如支付宝或微信收款的消息提醒: “支付宝/微信成功收款100元” 。 基于以上两种场景,接下来会逐一分析。在分析之前,需要先对APNs做一个简单的了解。
APNs(英文全称:Apple Push Notification service),中文翻译为:苹果推送
通知服务。
通知是由两个主要部分组成的数据:设备令牌deviceToken 和 payload消息。
deviceToken: 是类似于一个电话号码。它包含的信息,使的APN定位到设备上安装的客户端应用程序。APN还用它来验证通知的路由。payload消息:是一个JSON定义的属性列表中指定的设备上的应用程序的用户将被提醒。物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备);参考如下顺序图,会更易理解:

{
"aps" : {
"alert" : {
"title" : "Game Request", // 标题
"body" : "Bob wants to play poker", //内容
},
"badge" : 5, //角标
"sound" : "binggo.caf", //声音
"content-available" : 1,
"mutable-content" : 1, //可变内容
},
}
注意: payload 最大不能超过256字节
aps字典包含苹果用来向用户设备发送通知的keys。key指定了您希望系统在提醒用户时使用的交互类型。
下表列出了包含在该字典中的keys以及每个key的信息类型。注意:非苹果给定的key会被忽略。
| 键 | 值的类型 | 描述 |
|---|---|---|
| alert | Dictionary or String | 当您希望系统显示标准警报或横幅时,请包含此键。用户设备上应用程序的通知设置决定是否显示警报或横幅。该key的首选值是字典 。字典的更多关键字请参阅 Table 9-2。 如果指定字符串作为该键的值,则该字符串将显示为警报或横幅的消息文本。 |
| badge | Number | 当您希望系统修改应用程序图标的角标时,请包含此键。如果字典中没有包含此键,则Badge角标不会更改。若要删除角标,请将此键的值设置为0。 |
| sound | String | 当您希望系统播放声音时,请包含此键。此键的值是应用程序main bundle 或应用程序数据容器的Library/Sounds文件夹中声音文件的名称。如果找不到声音文件,或者为该值指定了default,系统将播放默认警报声音。有关为通知提供声音文件的详细信息;请参阅自定义警报声音。 |
| content-available | Number | 设置此键的值为1,以配置后台更新通知。当此key存在时,系统会在后台唤醒您的应用程序,并将通知发送给其应用程序代理。有关配置和处理后台更新通知的信息,请参阅配置后台更新通知。 |
| category | String | 为该键提供一个表示通知类型的字符串值。此值对应于应用程序的某个注册类别的identifier属性中的值。要了解有关使用自定义操作的更多信息,请参阅配置类别和可操作通知。 |
更多内容详见:https://blog.csdn.net/zhanglei5415/article/details/130316253
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
我正在尝试将我更新的gem推送到rubygems.com并得到以下结果。~/dev/V2/V2GPTI(master)$gembuildv2gpti.gemspecSuccessfullybuiltRubyGemName:v2gptiVersion:0.2File:v2gpti-0.2-universal-darwin-13.gem~/dev/V2/V2GPTI(master)$gempushv2gpti.gemspecERROR:Whileexecutinggem...(Gem::Package::FormatError)packagemetadataismissinginv2g
我们正在开发一个需要推送通知的WP8应用程序。为了测试它,我们使用CURL命令行运行推送通知POST请求,确保它实际连接,使用客户端SSL证书进行身份验证并发送正确的数据。我们确实知道,当我们收到对设备的推送时,这项工作是有效的。这是我们一直用于测试目的的CURL命令:curl--certclient_cert.pem-v-H"Content-Type:text/xml"-H"X-WindowsPhone-Target:Toast"-H"X-NotificationClass:2"-XPOST-d"MytitleMysubtitle"https://db3.notify.live.ne
我知道我们可以做到:sidekiq_optionsqueue:"Foo"但在这种情况下,Worker只分配给一个队列:“Foo”。我需要在特定队列中分配作业(而不是worker)。使用Resque很容易:Resque.enqueue_to(queue_name,my_job)另外,为了并发问题,我需要限制每个队列的Worker数量为1。我该怎么做? 最佳答案 您可能会使用https://github.com/brainopia/sidekiq-limit_fetch然后:Sidekiq::Client.push({'class'=>
OpenSSL::SSL::SSLError(SSL_connectSYSCALLreturned=5errno=0state=SSLv3readserversessionticketA):为苹果推送通知Houstongem集成库。自上两个月以来,它运行顺利,但现在在应用程序中出现错误。尝试多种解决方案来解决问题。也尝试使用新的证书pem文件,但遇到相同的错误..有时它可以工作请帮忙解决问题。 最佳答案 错误严格来说是您使用了错误的APNS证书。它可能已过期,或者它只是一个旧证书的类型(在2015年12月之前创建)。一年前,Appl
我正在开发一个应用程序,用户可以在其中添加他们的Gmail帐户,我会对他们的电子邮件进行一些分类工作。我想在任何注册帐户收到新电子邮件时收到通知。一个解决方案是通过IMAP不断轮询帐户并保存我获取的最后一封电子邮件日期以检查是否有新邮件,但这有很多开销。知道如何监控Gmail并在收到新电子邮件时收到通知并将其与Rails应用集成吗?例如,是否有扩展程序可以执行此操作并将发布请求发送到我的Rails应用程序? 最佳答案 我很确定IMAP是这里唯一的答案。您可能想看看IDLE是否有效——我读过相互矛盾的答案。如果是这样,它比轮询响应更快
将数据从用Sinatra编写的服务器推送到客户端的最佳方法是什么?类似于聊天室,但没有每2500毫秒进行一次Ajax轮询。我知道Rails中的Juggernaut,但对Sinatra很好奇。 最佳答案 谷歌搜索了一下thisblogpostbyMarc-AndréCournoyer,其中讨论了瘦Web服务器的异步响应功能,并包含一个指向async-sinatra库的链接来执行此操作。你也可以看看orbited-ruby,Orbited的Ruby实现cometd服务器。这两个看起来都非常新且未经测试,因此您可能需要自己进行一些修改才能
我在githubwiki上维护页面。该页面在org模式中,使用以下语法嵌入图像:[[images/my-image.png]]我想更新文本和图像,因此我执行了以下步骤:克隆从ssh上的github的维基更改了页面其他地方的一些文字编辑了图像将页面的文件和图像插入了git使用git签署了分阶段的文件,推到SSH上的Github。没有报告错误,并且显示页面的编辑。但是页面仍然具有旧图像。如果我访问图像的URL(https://raw.githubusercontent.com/wiki/myuser/myrepo/images/git-flowchart.png),我看到旧图像,而不是新图像,即使
目前,我正在制作一个简单的应用程序,其中使用语音合成API来朗读文本。我想在说话时突出显示单词(粗体)。我目前有一个非常基本的实现,使用'onboundary'事件来执行此操作。但是,我想知道是否有更好/更好的方法,因为我的实现是基于一些假设。varwords;varwordIdx;vartext;varutterance=newSpeechSynthesisUtterance();utterance.lang='en-UK';utterance.rate=1;window.onload=function(){document.getElementById('textarea').in
我目前正在尝试创建自己的J.A.R.V.I.S系统作为网络应用程序。所以当然,就像任何好的J.A.R.V.I.S系统一样,它需要良好的语音识别。我进行了研究,试图找到一个我可以根据需要自定义的JavaScript语音识别API,并决定使用Annyang。(很简单,效果很好)我花了一些时间试用它,就在我认为它可以正常工作时,我遇到了一个问题。当我尝试在本地查看该文件时它不起作用,所以我将它与MAMP一起托管在我的计算机上以查看它是否有效。它出现了一个对话框,上面写着“本地主机想要访问麦克风”,但是当我点击允许时,它又出现了。它不断出现并且不会消失,直到我单击拒绝。我正在使用以下代码:if