我无法向使用 Expo.io 创建的 iOS 应用程序发送推送通知。
没有关于如何做到这一点的明确文档,所以这是我的试验和我所做的事情:
在以编程方式调用此端点之前,我尝试使用 POSTMAN 让它工作(就像我在 Android 上用了不到 1 小时所做的那样)
这就是我的电话:
方法:POST
网址:https://fcm.googleapis.com/fcm/send
身体:
{
"to": "token (read about it at the end of the post",
"priority": "high",
"data": {
"experienceId": "@expoAccount/projectSlug",
"title": "Hello there",
"message": "General kenobi",
"content_available": true
},
"content_available": true
}
我已经测试了很多不同的身体结构(带有/不带“content_available”键或带有“通知”对象......因为所有身体结构都不同于 全部 那个 问题 或文档 我已经 阅读 到目前为止
所以我不确定我必须发送的正文...但是如果通知在 Android 上工作,它应该在 iOS 上工作,否则我不明白 FCM 的意义...
对于 iOS,我从
Notifications.getDevicePushTokenAsync()
(expo doc) 获得的令牌不是有效的 FCM 令牌,因为它以某种方式“连接”到某些沙箱或任何 Apple 称之为 如果没有这个线程我会迷失在虚空中......所以我使用的令牌是我在将沙箱令牌“转换”为调用谷歌api的“真实”令牌后获得的令牌:https://iid .googleapis.com/iid/v1:batchImport
我有时会遇到一些奇怪的行为,特别是在使用密钥发送时
"content_available": true
:令牌似乎是“强制未注册”。
我为什么这么说?因为第一次通话的结果是:
"results": [{ "error": "InvalidRegistration" }],
,所有接下来的通话答案都是:"results": [{ "error": "NotRegistered" }],
并且在使用“sandboxToken”调用时,batchImport 会生成一个新令牌,当我收到一些成功返回值(取决于该主体结构)时,该令牌不会改变:
"results": [{"message_id": "0:1632152120739230%37bf04f1f9fd7ecd"}],
注:我有一些成功退货,但手机上根本没有任何通知。
目前 Expo 应用程序不支持 iOS 应用程序的 FCM。
“请注意,FCM 目前不适用于 Expo iOS 应用程序。” -> https://docs.expo.dev/push-notifications/using-fcm/
对于 iOS,目前您有 2 个选择:
致电APN,信息位于您指出的链接上。
在这种情况下,您可以使用 expo eas build 来构建 ios,尽管您使用的是裸工作流程项目,然后 eas 将负责在 ios 上运行 expo 推送通知所需的所有配置
据我了解,expo通过Apples APNs(Apple推送通知服务)传递IOS通知来处理IOS和Android的通知,通过FCM(Firebase Cloud Messaging)传递Android通知。
因此,当使用 expo 到
getDevicePushTokenAsync
时,您返回的令牌类型取决于设备。如果运行 Android 设备,您将获得一个可直接在 Firebase 控制台中使用的令牌来发送测试消息,但如果使用 Apple 设备,您获得的本机令牌只能与 Apple 推送服务器一起使用。这就是为什么从 expo 生成的设备推送令牌不能直接与 FCM 使用。
让事情变得更混乱的是,FCM 仍然可以通过 firebase 云消息传递调用的一些映射/魔法向 IOS 设备发送消息 swizzling,但是如果想使用它,您可能必须使用不同的本机插件,例如react-native-firebase,或通过 google create_registration_tokens_for_apns_tokens api
手动迁移 apns 令牌