菜鸟教程小白 发表于 2022-12-13 02:33:05

ios - FIrebase FCM - 推送消息最终出现在错误的应用程序中


                                            <p><p>我正在使用 Firebase Cloud Messaging 向可能的 iOS 应用程序发送推送消息。
我的 FCM 设置包含一个带有多个 Firebase 应用的 Firebase 项目:</p>

<pre><code>FB Project
App1 Android
App1 iOS
App2 Android
App2 iOS
...
</code></pre>

<p>现在的问题是,发送到我的一个 iOS 应用程序的 FCM 消息最终被 <em>另一个</em> iOS 应用程序接收(发送到 App1 iOS - App2 iOS 收到消息)。 </p>

<p>为了调试问题,我遵循了这个出色的调试指南:
<a href="https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html" rel="noreferrer noopener nofollow">https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html</a> </p>

<p>我发现:</p>

<ol>
<li>直接通过 APNS 传递消息可以正常工作(请参阅第 4 节)</li>
<li>通过带有 cURL 的 FCM 传递消息(第 5 节)将消息发送到随机应用。</li>
</ol>

<p>然后我意识到我设备上的两个客户端应用程序都有 <em>相同</em> firebase 设备 token 。因此,Firebase 似乎并未在 token 级别区分应用。<br/>
我仍然希望我的 iOS 的 <em>all</em> 会收到该消息,而不是随机的。 </p>

<p><strong>问题 1:这是 Firebase 的预期行为吗?</strong></p>

<p>现在在真正的应用程序中,我通过注册到不同的 channel 来定位不同的应用程序,并为应用程序标识符添加前缀:</p>

<pre><code>- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [ subscribeToTopic:@&#34;/topics/app1-news&#34;]];
}
</code></pre>

<p>发送到该 channel 会产生随机结果,包括:</p>

<ul>
<li>预期 (App1) 收到的消息</li>
<li>另一个应用(例如 App2)收到的消息</li>
<li>多个应用(App1、App2、...)收到的消息</li>
<li>一个应用(App2、App2)多次收到消息</li>
<li>根本没有收到消息</li>
</ul>

<p><strong>问题 2:我怎样才能做到这一点?</strong></p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这不是预期的行为。 FCMtoken 与授权实体(整个 firebase 项目相同)和范围(通常为“*”)存储在钥匙串(keychain)中。但是,钥匙串(keychain)是根据应用程序的包标识符存储它们的,这应该将它们彼此分开。</p>

<p>完整性检查:您是否为每个 iOS 应用使用不同的 GoogleService-Info.plist 文件?</p>

<p>另外,您是否使用共享钥匙串(keychain)访问组?您的权利中 <code>keychain-access-groups</code> 中的列表顶部是否有共享钥匙串(keychain)访问组?这将解释 SDK 如何意外找到其他应用程序的 FCMtoken 。在 <a href="https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html#//apple_ref/doc/uid/TP30000897-CH204-SW1" rel="noreferrer noopener nofollow">documentation for Keychain</a> :</p>

<blockquote>
<p>When your app creates a keychain item, if you do not explicitly specify the <code>kSecAttrAccessGroup</code> key in the item’s attributes dictionary, Keychain Services uses the first group of the app’s access groups array (ordered as shown above) as the default access group. If your app has a <code>keychain-access-groups</code> entitlement, Keychain Services uses the first of these. Otherwise, it uses the application identifier, which is always present. Thus, by default, unless you add a <code>keychain-access-groups</code> entitlement, an app creates keychain items to which only it has access.</p>
</blockquote>

<p>SDK 通过尝试创建一个小的钥匙串(keychain)项目并查看访问组来确定“默认访问组”(<code>keychain-access-groups</code> 列表中的第一个是默认值)。通常对于钥匙串(keychain)访问组,您希望将应用程序的应用程序标识符作为第一项,然后是任何共享组。这样,除非另有说明,否则您的钥匙串(keychain)项将写入单个应用程序,除非明确存储在共享访问组中。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - FIrebase FCM - 推送消息最终出现在错误的应用程序中,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/45768939/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/45768939/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - FIrebase FCM - 推送消息最终出现在错误的应用程序中