我在开发环境下进行聊天,但是推送的prod怎么是prod而不是dev,这个字段的值从哪里可以设置?
您的开发环境具体是指什么?如果是指您的本地开发机器的话,通过 SDK 发推送信息,默认是往生产环境的 iOS 应用发的。具体可以参考文档。
我的开发环境就是指 通过xcode安装的app,此时 prod 应该为 "dev",但是leancloud后台推送记录显示的值是 "prod"。
是两个人进行聊天,A给B发送消息,此时B没有在线,应该走apns,并不是我通过REST API 或 SDK 的 Push 发送的推送,然后推送的内容就如提问中的图所示。
所以想问一下 prod 这个属性在测试环境中,值为什么是 "prod" 而不是 "dev",通过什么方式可以改变这个值。
通过xcode安装的app 处于测试环境,是指 prod 属性为 prod 的消息无法推送到「通过xcode安装的app」,只有 prod 属性为 dev 的消息才能推送到「通过xcode安装的app」。
离线消息推送时,默认全部往生产环境的应用发,并不会根据消息来源(来自测试环境的应用还是生产环境的应用)分别推送到对应的环境。
当然,这里开发者是指定推送目标的,详见 其他推送设置。
已经设置了 "_profile": "dev",如下图
但是推送的的记录中看到的的结果是下图所示,第二处框所示是我们设置的,我想问的是第一处框所示这个值是从哪里来的?
另外我项目使用的是Token Authentication方式进行的推送,从leancloud后台在线发送推送,选择开发环境是能正常收到推送的。
抱歉,之前没说清楚。_profile 适用于证书推送的情形。然后 token 方式是另一套机制。基于 token 推送时,离线消息会根据 Installation 中的数据决定推送到开发环境还是生产环境。Installation 中每个 iOS 设备对应的记录会有一个 apnsTopic 字段,这个字段对应 APNS 的相应 Topic,也就决定了是发往开发环境还是生产环境。通过 更新 Installation 可以改变这个行为。
_profile
apnsTopic
不好意思,有点不太理解,首先问一下,APNS的相应Topic是什么意思,从哪里配置的??
我可能也没说清楚我的问题,我再描述一遍:有两个设备A和B,A给B发送聊天消息,此时B处于离线状态,消息应该走APNS(Token Authentication方式),现在的问题就是B没有收到推送消息,具体的一些内容如下。
B在Installation表中的数据:
推送记录:
leancloud文档对invalidTokens的描述:
leancloud文档对prod的描述:
根据文档和推送记录说一下我的理解,B是通过xcode安装的设备,可以认为是在测试环境下,但是推送记录显示"prod":"prod",也就是往生产环境发推送,所以导致invalidTokens: 1,就收不到推送了。正如一开始的提问,此时prod属性值为什么是"prod"呢?是根据什么推断出来的呢?
简单来说,prod 参数是通过 SDK 或 REST API 发推送时指定的参数,而离线消息是由系统自动推送的,系统自动推送离线消息时 prod 这个值永远是 prod ,没有任何推断过程。
prod
所以使用 token 的情况下,控制离线消息推送到哪里,是通过 Installation 的 apnsTopic 字段,这个字段的值对应苹果那边的 apns-topic,需要在苹果那里设置。在苹果那里,apns-topic 对应了 bundle ID(Product Bundle Identifier),然后不同的 bundle ID 可以区分不同种类的设备,这个是由您自行定义的(Xcode 和 developer.apple.com 网站上都要配置) 。比如,上架的应用的 bundle ID 定为 com.example.product,通过 TestFlight 分发的 bundle ID 可以定为 com.example.product.beta,在 Xcode 上测试的 bundle ID 可以定为 com.example.product.debug。这样就通过 Installation 的 apnsTopic 自动分流。
更多 apns-topic 的信息可以参考 Apple 的官方文档: https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns/
非常感谢你的回复,我确实是按照你说的这样去配置的,但是可能某个环节出现了问题,我再重头检查一遍。
你好,咨询一个问题。因为你说‘系统自动推送离线消息时 prod 这个值永远是 prod’,那么在开发环境(使用xcode安装的app)下,怎么设置能让系统自动推送的离线消息被收到?
就像之前说的那样,使用 token 的情况下,通过设置 Installation 的 apnsTopic 字段控制推送目标。您之前说「我确实是按照你说的这样去配置的,但是可能某个环节出现了问题,我再重头检查一遍」,后来查到问题所在了么?
没有检查出问题,我使用leancloud后台的在线推送,选择环境为开发环境是可以正常收到推送的,也就证明我的配置没有问题。
现在的问题就是系统自动推送的离线消息收不到,因为prod的值是prod,是不是意味着会把消息推给apns的生产环境,而apns从生产环境中根据apnsTopic去找推送目标,也是找不到的啊,因为我的app在开发环境中啊。不知道这样理解有没有问题。
您方便提供下 App ID 和控制台相应推送记录的推送 ID 吗?
appId: kTUdviJSAd2N3hoeQQsfWEEr-gzGzoHsznotificationId: 605da85d95211d5b77ff2176+h1IRvJHVRfmkZP1kzUKHiA
不知道我给的两个id是不是你说的意思。
没错,就是这个,感谢提供信息。我们正调查这个问题(可能会改成 token 推送的情况下,_profile 也可以控制发往哪个环境),有进展会回复此帖。
您试下将 pushData 的 _profile 字段从 iOS 移到外层(也就是和 ios、android 平级),看看能不能收到推送?
iOS
ios
android
pushData 中这样写就可以收到测试环境推送了。
{ "alert": "您有一条未读的消息", "_profile": "dev"}
问题已解决,把_profile移到外层,在测试环境下就可以正常收到离线消息推送了,非常感谢。
但是要注意判断环境,在生产环境中,这个字段就不要设置值了。
很高兴您的问题解决了。之前 _profile 只适用于证书推送的错误说法误导了您,非常非常抱歉。