请求 APNs VoIP 通知 (Flutter iOS)
Request APNs VoIP notification (Flutter iOS)
我正在开发一个消息传递应用程序,该应用程序现在使用带有 Firebase 功能的 FCM 来推送通知。
对于 VoIP 服务,我使用的是 Agora,但我想在我的应用程序中添加原生外观,在用户接听电话时添加 CallKit 布局。
我正在使用 flutter_ios_voip_kit,并且我在终端中使用 curl 命令正确地获取了 VoIP 通知。
curl -v \
-d '{"aps":{"alert":{"uuid":"982cf533-7b1b-4cf6-a6e0-004aab68c503","incoming_caller_id":"0123456789","incoming_caller_name":"Tester"}}}' \
-H "apns-push-type: voip" \
-H "apns-expiration: 0" \
-H "apns-priority: 0" \
-H "apns-topic: <your app’s bundle ID>.voip" \
--http2 \
--cert ./voip_services.pem \
https://api.sandbox.push.apple.com/3/device/<VoIP device Token for your iPhone>
但我真的不知道如何在我的应用程序上实现该请求。
我想把它保留在客户端,所以当用户点击呼叫按钮时,我尝试 运行 http.post 呼叫,但它不起作用(我不知道是格式错误还是别的东西)。
final url =
'https://api.sandbox.push.apple.com:443/3/device/*myDeviceVoIPToken*';
//final uuid = Uuid().v4();
final Map body = {
"aps": {
"alert": {
"uuid": "${Uuid().v4()}",
"incoming_caller_id": "0123456789",
"incoming_caller_name": "Tester"
}
}
};
Future<http.Response> postRequest() async {
return await http.post(url,
headers: <String, String>{
'apns-push-type': 'voip',
'apns-expiration': '0',
'apns-priority': '0',
'apns-topic': '*myBundleId*.voip'
},
body: jsonEncode(body));
我也尝试过使用 http2,但没有成功。
您能否提供使用 http.post 请求 VoIP 通知的代码示例?或者随时提出更好的选择。
谢谢。
问题是您没有使用 voip 证书来验证您的 HTTP 请求。查看您是否在使用 --cert 命令的 curl 请求中使用它。
我不知道如何用 http.post 做到这一点,但您需要证书的私钥才能使用它来签署您的请求。
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns
但是,您不应该通过您的应用程序发送推送,因为这意味着您需要将您的 voip 证书私钥与您的应用程序打包在一起。通过某种逆向工程,任何人都可以获得您的私钥,并向您的应用程序发送推送。私钥应该安全地保存在您的服务器中,并且永远不要像您计划的那样共享。
已解决。
下面是使用 node.js 和“apn”模块的 VoIP 推送代码示例。
var apn = require("apn");
var deviceToken = "*yourDeviceToken*";
let provider = new apn.Provider(
{
token: {
key: "*yourAuthKey.p8*",
keyId: "*yourKeyId*",
teamId: "*yourTeamId*"
},
production: false
});
let notification = new apn.Notification();
notification.rawPayload = {
"aps": {
"alert": {
"uuid": "*yourUuid*",
"incoming_caller_id": "123456789",
"incoming_caller_name": "Tester",
}
}
};
notification.pushType = "voip";
notification.topic = "*yourBundleId*.voip";
provider.send(notification, deviceToken).then((err, result) => {
if (err) return console.log(JSON.stringify(err));
return console.log(JSON.stringify(result))
});
有关详细信息,请参阅 apn documentation。
我正在开发一个消息传递应用程序,该应用程序现在使用带有 Firebase 功能的 FCM 来推送通知。 对于 VoIP 服务,我使用的是 Agora,但我想在我的应用程序中添加原生外观,在用户接听电话时添加 CallKit 布局。 我正在使用 flutter_ios_voip_kit,并且我在终端中使用 curl 命令正确地获取了 VoIP 通知。
curl -v \
-d '{"aps":{"alert":{"uuid":"982cf533-7b1b-4cf6-a6e0-004aab68c503","incoming_caller_id":"0123456789","incoming_caller_name":"Tester"}}}' \
-H "apns-push-type: voip" \
-H "apns-expiration: 0" \
-H "apns-priority: 0" \
-H "apns-topic: <your app’s bundle ID>.voip" \
--http2 \
--cert ./voip_services.pem \
https://api.sandbox.push.apple.com/3/device/<VoIP device Token for your iPhone>
但我真的不知道如何在我的应用程序上实现该请求。 我想把它保留在客户端,所以当用户点击呼叫按钮时,我尝试 运行 http.post 呼叫,但它不起作用(我不知道是格式错误还是别的东西)。
final url =
'https://api.sandbox.push.apple.com:443/3/device/*myDeviceVoIPToken*';
//final uuid = Uuid().v4();
final Map body = {
"aps": {
"alert": {
"uuid": "${Uuid().v4()}",
"incoming_caller_id": "0123456789",
"incoming_caller_name": "Tester"
}
}
};
Future<http.Response> postRequest() async {
return await http.post(url,
headers: <String, String>{
'apns-push-type': 'voip',
'apns-expiration': '0',
'apns-priority': '0',
'apns-topic': '*myBundleId*.voip'
},
body: jsonEncode(body));
我也尝试过使用 http2,但没有成功。 您能否提供使用 http.post 请求 VoIP 通知的代码示例?或者随时提出更好的选择。 谢谢。
问题是您没有使用 voip 证书来验证您的 HTTP 请求。查看您是否在使用 --cert 命令的 curl 请求中使用它。 我不知道如何用 http.post 做到这一点,但您需要证书的私钥才能使用它来签署您的请求。 https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns
但是,您不应该通过您的应用程序发送推送,因为这意味着您需要将您的 voip 证书私钥与您的应用程序打包在一起。通过某种逆向工程,任何人都可以获得您的私钥,并向您的应用程序发送推送。私钥应该安全地保存在您的服务器中,并且永远不要像您计划的那样共享。
已解决。
下面是使用 node.js 和“apn”模块的 VoIP 推送代码示例。
var apn = require("apn");
var deviceToken = "*yourDeviceToken*";
let provider = new apn.Provider(
{
token: {
key: "*yourAuthKey.p8*",
keyId: "*yourKeyId*",
teamId: "*yourTeamId*"
},
production: false
});
let notification = new apn.Notification();
notification.rawPayload = {
"aps": {
"alert": {
"uuid": "*yourUuid*",
"incoming_caller_id": "123456789",
"incoming_caller_name": "Tester",
}
}
};
notification.pushType = "voip";
notification.topic = "*yourBundleId*.voip";
provider.send(notification, deviceToken).then((err, result) => {
if (err) return console.log(JSON.stringify(err));
return console.log(JSON.stringify(result))
});
有关详细信息,请参阅 apn documentation。