- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Firebase Cloud Messaging 向许多 iOS 应用程序发送推送消息。我的 FCM 设置包含一个 Firebase 项目和多个 Firebase 应用程序:
FB Project
App1 Android
App1 iOS
App2 Android
App2 iOS
...
现在的问题是,发送到我的一个 iOS 应用程序的 FCM 消息最终被 另一个 iOS 应用程序接收(发送到 App1 iOS - App2 iOS 获取消息)。
为了调试这个问题,我遵循了这个优秀的调试指南: https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html
我发现:
然后我意识到我设备上的两个客户端应用程序都具有相同的 firebase 设备 token 。所以 Firebase 似乎不会在 token 级别区分应用程序。
我仍然希望我的 iOS 的 所有 都能收到这条消息,而不是随机收到一条消息。
问题 1:这是 Firebase 的预期行为吗?
现在在真实的应用程序中,我通过注册到不同的 channel 来定位不同的应用程序,并在应用程序标识符前加上这样的前缀:
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[[FIRMessaging messaging] subscribeToTopic:@"/topics/app1-news"]];
}
发送到该 channel 会产生随机结果,包括:
问题 2:我怎样才能做到这一点?
最佳答案
这不是预期的行为。 FCM token 与授权实体(整个 firebase 项目相同)和范围(通常为“*”)一起存储在钥匙串(keychain)中。但是,钥匙串(keychain)根据应用程序的包标识符存储它们,应该将它们彼此分开。
健全性检查:您是否为每个 iOS 应用使用了不同的 GoogleService-Info.plist 文件?
此外,您是否使用共享钥匙串(keychain)访问组?共享钥匙串(keychain)访问组是否位于您权利中 keychain-access-groups
列表的顶部?这可以解释 SDK 如何意外找到其他应用程序的 FCM token 。在documentation for Keychain :
When your app creates a keychain item, if you do not explicitly specify the
kSecAttrAccessGroup
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 akeychain-access-groups
entitlement, Keychain Services uses the first of these. Otherwise, it uses the application identifier, which is always present. Thus, by default, unless you add akeychain-access-groups
entitlement, an app creates keychain items to which only it has access.
SDK 通过尝试创建一个小的钥匙串(keychain)项并查看访问组来确定“默认访问组”(keychain-access-groups
列表中的第一个是默认值)。通常对于钥匙串(keychain)访问组,您希望将应用程序的应用程序标识符作为第一项,然后是任何共享组。这样,除非另有说明,否则您的钥匙串(keychain)项将写入单个应用程序,除非明确存储在共享访问组中。
关于ios - FIrebase FCM - 推送消息最终出现在错误的应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45768939/
考虑需要与 iOS 5 和 iOS 6 兼容的应用。 有没有办法标记纯粹为了 iOS 5 兼容性而存在的代码,以便当部署目标最终更改为 iOS 6 时它显示为编译错误(或警告)? 像这样: #IF_D
我想我知道答案但是...有什么方法可以防止全局变量被稍后执行的 修改吗? ?我知道全局变量首先是不好的,但在必要时,有没有办法让它成为“最终”或“不可变”?欢迎黑客/创造性的解决方案。谢谢 最佳答案
class Foo { final val pi = 3 } 是否每Foo对象有一个 pi成员?因此我应该把 pi在伴生对象中? 最佳答案 如果您担心内存占用,您可以考虑将此字段移动到伴随对象中。
随着可用的 Web 开发框架种类繁多,似乎总是有一种“尝试新事物”的永久动机。因此,我们中的一些人发现自己用一个框架换另一个框架,从来没有对最终结果完全满意。当然,总会有一个特定的 Web 框架可以完
在MDN中指出, If the finally block returns a value, this value becomes the return value of the entire try
我正在尝试用 JavaScript 制作一个基本的井字棋类型游戏。尽管 x 和 y 值在 if 语句的范围内,但除最后一个之外的所有空格都有效。 我不知道为什么最后的 else if 语句不起作用。
我想知道如何使用PowerMock模拟kotlin最终类(class),以便进行测试。我按照指南测试了Java最终类,但仍然出现此错误 Cannot subclass final class 有什么办
考虑以下设置: // debugger class public class Debug { // setting public final static boolean DEBUG
给定以下类(class): public class SomeClass { private final int a; public SomeClass(int a) {
This question already has answers here: What does “final” do if you place it before a variable?
我有一个类PasswordEncryptor,它使用org.jasypt.util.password.StrongPasswordEncryptor作为其字段之一,因为我试图使应用程序“可集群”所有类
我今天有一个关于 StreamReader 类的问题。具体使用文件名参数初始化此类例如: TextReader tr = new StreamReader(fileName); 显然,当此操作完成后,
我想弄清楚什么是使用带锁的 try/finally 的最佳方式。 当我在同一个地方有 lock() 和 unlock() 时,我只使用 try/finally block 作为 JavaDoc还建议:
在 Java 中序列化后是否可以将 final transient 字段设置为任何非默认值?我的用例是一个缓存变量——这就是它是 transient 的原因。我还有一个习惯,就是制作不会改变的 Map
在this问题说 final transient 字段在序列化后不能设置为任何非默认值。那么,为什么我为 aVar1 变量设置了 3,为 aVar3 变量设置了 s3? import java.io.
在Xbox上进行开发时,我使用的是F#规范中最终工作流程的修改版。 Xbox上的.net框架似乎不支持尾部调用。因此,我必须在编译时禁用尾部调用优化。 尽管起初看来这种限制会阻止在计算表达式中使用任何
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想让我的带有自定义对象的ArrayList成为最终对象,以便对象在设置后无法更改。 我试图这样声明它: private final ArrayList XML = new ArrayList();
我有一个场景,我需要类似于 .NET 的 try-catch-finally block 的内容。 在我的尝试中,我将创建一个#temp表,向其中插入数据并基于#temp处理其他数据集。 先是CATC
对此可能有一个简单的答案,但尝试充分使用 Butterknife,将一些 findViewById 转换为 @BindViews,并注意到我无法在需要声明为 Final 的 View 上使用 Bind
我是一名优秀的程序员,十分优秀!