Firebase Cloud Messaging是否支持VOIP Pushkit服务?

39

有人了解Firebase Cloud Messaging是否支持VOIPpushkit服务吗?

如果是的话,能否请提供相关指南。

与Skype / Hangout / WhatsApp或其他基于VOIP的应用程序实现的相同。

先感谢您的协助。


嘿,由于使用 FCM 不可能实现,你找到其他方法来做这件事了吗? - Abdullah Ajmal
只有通过苹果VOIP证书才能实现,并发送VOIP推送通知。 - Hasya
4个回答

21
在撰写此文时(FirebaseMessaging 1.1.0 / Firebase 3.2.0),FCM 在 iOS 上使用常规 APNs,因此不支持 PushKit 通知。

5
据我了解,是的,FMC与PushKit配合使用,因为从服务器实例来看,不需要进行任何更改!它确实通过APN传输。在iOS中实现方式(不同的回调)与常规推送通知不同。如果您通过PushKit获取标识符并将其提供给FCM,则命中服务和有效负载的服务相同。它只是通过不同的回调再次到达iOS设备。虽然我没有测试过,但我愿意打赌它能够正常工作。我没有看到使用PHP脚本推送到PushKit与使用简单推送通知的脚本之间有任何区别。 - EdGs
2
@EdGs 这不仅仅是客户端上的不同回调函数。PushKit 通知发送到 Apple 的“主题”与 Firebase 服务器发送的主题不同,因此 Firebase 服务器必须知道发送正确的主题。现在有来自 Apple 的通用推送证书,因此您应该能够创建支持它的证书,但除非 Firebase 发送正确的主题,否则它将成为常规 APN 而不是 PushKit。 - chadbag
12
昨天我查询了谷歌关于通过FCM支持VoIP通知的问题,他们告诉我这是不受支持的,并且仍在他们的功能请求列表上,没有预计完成时间。 - CoastalB
1
它仍然不受支持吗?我们正在网上搜索使用它,但我没有找到任何有用的链接。 - Vasanth
1
它仍然不受支持吗? - Shubham1164
显示剩余2条评论

5

这对我很有帮助!别忘了在您的目录中添加Authkey_xxxx.p8文件,并且不要忘记将.voip添加到通知主题的捆绑标识符中。

export const test = functions.https.onRequest((request, response) => {
    const config = {
        production: false, /* change this when in production */
        token: {
        key: "./AuthKey_xxxx.p8",
        keyId: "xxxx",
        teamId: "yyyy"
      } 
    };
    const apnProvider = new apn.Provider(config);
    const notification = new apn.Notification();

    const recepients: string[] = [];
    recepients.push(apn.token('SOME PUSHKIT TOKEN'));
    recepients.push(apn.token('ANOTHER PUSHKIT TOKEN'));

    notification.topic = 'com.your.app.voip'; // you have to add the .voip here!!
    notification.payload = {
        // some payload
    };

    return apnProvider.send(notification, recepients).then((reponse) => {
        console.log(reponse);
        return response.send("finished!");
    });
});

我在通知主题的捆绑标识符中缺少.voip。 - Robert Sutton
这是否意味着客户端也需要订阅主题“com.your.app.voip”才能收到通知? - SleepNot
@marouan azizi 所以,使用这个服务器代码后,应用程序的 PKPushRegistry:didReceiveIncomingPushWithPayload() 方法被调用,而不是 UIApplication:didReceiveRemoteNotification() 方法? - Gruntcakes
在将“.voip”添加到捆绑标识符中时,出现了“failed”:[{"status":"400","response":{"reason":"DeviceTokenNotForTopic"}的错误。 - Arjun

3
我通过node-apn使PushKit + Firebase工作了。 只需通过npm将其安装到您的云函数文件夹中即可。 您可以从Firestore或类似的地方获取令牌,但我认为这是不言自明的...
以下是一些虚拟代码:
export const test = functions.https.onRequest((request, response) => {
        const config = {
            production: false, /* change this when in production */
            cert: 'yourCERT.pem',
            key: 'yourKey.pem', 
        };

        const apnProvider = new apn.Provider(config);
        const notification = new apn.Notification();

        const recepients: string[] = [];
        recepients.push(apn.token('SOME PUSHKIT TOKEN'));
        recepients.push(apn.token('ANOTHER PUSHKIT TOKEN'));

        notification.topic = 'com.your.app.voip'; // you have to add the .voip here!!
        notification.payload = {
            // some payload
        };

        return apnProvider.send(notification, recepients).then((reponse) => {
            console.log(reponse);
            return response.send("finished!");
        });
    });

链接至node-apn


所以,使用这个服务器代码后,应用程序的 PKPushRegistry:didReceiveIncomingPushWithPayload() 方法被调用,而不是 UIApplication:didReceiveRemoteNotification() 方法? - Gruntcakes
这种行为是有意的,因为PushKit通知与常规远程通知没有任何关系...如果这就是你的意思...? - p.wiesinger
在将“.voip”添加到捆绑标识符中时,出现了“failed”:[{"status":"400","response":{"reason":"DeviceTokenNotForTopic"}的错误。 - Arjun
请问您能指出此代码中 Firebase 的用法吗?它似乎只使用了 node-apn - Anubhab Maji

1

2022年写作

总结

目前不可能。

为什么?

理论上,根据苹果apns请求规范,似乎我们只需要在头文件中指定以下内容:

apns-push-type: "voip",
apns-topic: "<app-bundle-id>.voip"

这将通过 PushKit 发送 VoIP 通知(当然,我们必须启用 PushKit 和后台通知功能)。
在 FCM 消息中设置这些标题可以按照 FCM 文档 进行设置。
{
    "message": {
        "token": "fcm-token",
        "apns": {
            "headers": {
                "apns-push-type": "voip",
                "apns-topic": "<app-bundle-id>.voip"
            },
            "payload": {
                "aps": {
                    "contentAvailable": 1
                },
                "customKey": "customValue"
            }
        }
    }
}

在此,FCM将message.apns.payload对象与headers一同发送到APNs服务器。
但是:
问题出现在证书和密钥上。苹果不允许单个密钥或证书具有APNs和VoIP权限范围,并且FCM不允许为同一项目上传多个密钥或证书。
因此,理论上可以将FCM与PushKit一起使用,但不能同时与APNs一起使用。尽管Apple指定 PushKit在底层使用APNs,但它使用不同的身份验证。
我们可以创建两个不同的项目(很难管理),或者使用其他服务来处理PushKit。我正在使用无服务器架构,但APNs服务器不适合于无服务器环境,因为需要保持持久连接。

1
就我所看到的“Apple Push Notification service SSL (Sandbox & Production)”证书描述,它支持常规和VoIP推送: “建立您的通知服务器、Apple Push Notification服务沙盒和生产环境之间的连接,向您的应用程序传递远程通知。当使用HTTP/2时,同一证书可用于传递应用程序通知、更新ClockKit复杂数据,并提醒后台VoIP应用程序有来电活动。” - Kirill Pisarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接