并非所有 iOS 订阅主题的设备都会收到数据通知,最常见的是 none。没有数据的通知按预期工作
Not all subscribed iOS devices to topic receive data notification, most often none at all. Notification without data works as expected
我的应用程序是在 React Native 中实现的,并使用 Firebase 进行通知。我们在 Web 应用程序上有 webhooks,它们会在某些事件上触发。这些 webhook 然后向相应的 Firebase Cloud Function 发送请求。通过请求的 header 中的信息,他们获得了必须将通知发送到的主题;它从请求的 body 收集要作为数据发送到设备的信息。它们仅作为数据通知发送,处理程序(使用 React Native FCM API) then shows a local notification already translated with i18n using the react-native-push-notifications 包。一切正常,直到我遇到下面描述的奇怪情况。
在 Android 和 iOS 上一切正常,直到我在 Test Flight 上启动该应用程序进行内部测试,然后在 iOS 上一段时间后它停止工作。最终,我注意到当不止一个 iPhone 订阅同一个主题时,它最终会导致数据通知的传递不一致。第一个订阅该主题的 iPhone 通常有效,其他人则没有,第一个大多数时候最终也停止工作,或者有时它只是继续工作而其他人仍然没有。我使用 Firebase 控制台向订阅的设备发送了一些测试通知,它们确实收到了。然后我更改了 Cloud Functions 的代码以避免发送任何数据,只发送了一些示例 body 和标题,结果发现问题出在这里。一旦我通过 admin.messaging.Message object 中的数据字段发送一些内容作为参数发送给 admin.messaging( ).send 方法,它们不会被订阅该主题的 iPhone 设备接收(或者它被最多一两个接收,当前订阅该主题的第一批设备。但他们通常一段时间后也停止接收它们)。
这真的很奇怪,而且如此不一致,以我目前的知识几乎无法调试。要记住的一些事情:
- 所有 Android 设备仍然可以毫无问题地接收通知
- 我已经通过 Xcode 观察了 iPhone 的控制台,以查看在处理通知时是否出现错误,以防他们实际上收到了通知但在通知之前失败了已显示给用户。但是 SpringBoard 进程没有记录任何内容,让我得出结论,通知实际上并没有到达设备
- 我已经使用 cURL 将通知手动发送到 APNs(使用 this 指南)。他们收到了罚款
- 接收所有没有数据的通知,无论 iOS 特定的 apn headers、负载等如何
问题的原因可能是什么?或者我的代码中有某些东西导致了这种奇怪的行为(我对此表示怀疑,因为它在 Android 上工作正常并且在 iOS 以及特定情况下工作正常),Firebase 方面存在某种类型的错误导致一些通知未发送,或者最后,Apple 的 APNs 方面出现了一些错误导致了这种情况。高度怀疑最后一个,如果错误在于任何外部因素,它可能应该在 Firebase 对主题的处理上。
非常感谢您的帮助。提前致谢。对不起,如果我没有提供足够的信息,我实际上从来没有必要在 Stack Overflow 上做一个问题。我也会在下面留下一个云函数的例子。
exports.orderPending = functions
.region("europe-west2")
.https.onRequest((req, res) => {
if (req.method == "POST") {
res.status("200").send("Webhook successful");
const topic = req.headers["code"];
const message = {
data: {
id: JSON.stringify(req.body.order.id),
event: "orderPending",
order: JSON.stringify(req.body.order),
},
topic,
android: {
priority: "high",
},
apns: {
payload: {
aps: {
contentAvailable: true,
},
},
headers: {
"apns-push-type": "background",
"apns-priority": "5",
"apns-topic": "APP BUNDLE ID HERE",
},
},
};
functions.logger.log(req.body.order.id);
functions.logger.log(topic);
admin.messaging().send(message)
.then((response) => {
console.log("Successfully sent message: ", response);
})
.catch((error) => {
console.log("Error sending message: ", error);
});
}
});
事实证明数据负载超过了 4KB APNs 限制,但是当你按主题发送时它根本没有显示任何错误我无法知道。所以,是的,将其添加到您的清单中
我的应用程序是在 React Native 中实现的,并使用 Firebase 进行通知。我们在 Web 应用程序上有 webhooks,它们会在某些事件上触发。这些 webhook 然后向相应的 Firebase Cloud Function 发送请求。通过请求的 header 中的信息,他们获得了必须将通知发送到的主题;它从请求的 body 收集要作为数据发送到设备的信息。它们仅作为数据通知发送,处理程序(使用 React Native FCM API) then shows a local notification already translated with i18n using the react-native-push-notifications 包。一切正常,直到我遇到下面描述的奇怪情况。
在 Android 和 iOS 上一切正常,直到我在 Test Flight 上启动该应用程序进行内部测试,然后在 iOS 上一段时间后它停止工作。最终,我注意到当不止一个 iPhone 订阅同一个主题时,它最终会导致数据通知的传递不一致。第一个订阅该主题的 iPhone 通常有效,其他人则没有,第一个大多数时候最终也停止工作,或者有时它只是继续工作而其他人仍然没有。我使用 Firebase 控制台向订阅的设备发送了一些测试通知,它们确实收到了。然后我更改了 Cloud Functions 的代码以避免发送任何数据,只发送了一些示例 body 和标题,结果发现问题出在这里。一旦我通过 admin.messaging.Message object 中的数据字段发送一些内容作为参数发送给 admin.messaging( ).send 方法,它们不会被订阅该主题的 iPhone 设备接收(或者它被最多一两个接收,当前订阅该主题的第一批设备。但他们通常一段时间后也停止接收它们)。
这真的很奇怪,而且如此不一致,以我目前的知识几乎无法调试。要记住的一些事情:
- 所有 Android 设备仍然可以毫无问题地接收通知
- 我已经通过 Xcode 观察了 iPhone 的控制台,以查看在处理通知时是否出现错误,以防他们实际上收到了通知但在通知之前失败了已显示给用户。但是 SpringBoard 进程没有记录任何内容,让我得出结论,通知实际上并没有到达设备
- 我已经使用 cURL 将通知手动发送到 APNs(使用 this 指南)。他们收到了罚款
- 接收所有没有数据的通知,无论 iOS 特定的 apn headers、负载等如何
问题的原因可能是什么?或者我的代码中有某些东西导致了这种奇怪的行为(我对此表示怀疑,因为它在 Android 上工作正常并且在 iOS 以及特定情况下工作正常),Firebase 方面存在某种类型的错误导致一些通知未发送,或者最后,Apple 的 APNs 方面出现了一些错误导致了这种情况。高度怀疑最后一个,如果错误在于任何外部因素,它可能应该在 Firebase 对主题的处理上。
非常感谢您的帮助。提前致谢。对不起,如果我没有提供足够的信息,我实际上从来没有必要在 Stack Overflow 上做一个问题。我也会在下面留下一个云函数的例子。
exports.orderPending = functions
.region("europe-west2")
.https.onRequest((req, res) => {
if (req.method == "POST") {
res.status("200").send("Webhook successful");
const topic = req.headers["code"];
const message = {
data: {
id: JSON.stringify(req.body.order.id),
event: "orderPending",
order: JSON.stringify(req.body.order),
},
topic,
android: {
priority: "high",
},
apns: {
payload: {
aps: {
contentAvailable: true,
},
},
headers: {
"apns-push-type": "background",
"apns-priority": "5",
"apns-topic": "APP BUNDLE ID HERE",
},
},
};
functions.logger.log(req.body.order.id);
functions.logger.log(topic);
admin.messaging().send(message)
.then((response) => {
console.log("Successfully sent message: ", response);
})
.catch((error) => {
console.log("Error sending message: ", error);
});
}
});
事实证明数据负载超过了 4KB APNs 限制,但是当你按主题发送时它根本没有显示任何错误我无法知道。所以,是的,将其添加到您的清单中