From ed9d16799f72b250ebc4a4d4bc0cbbe81006ea7a Mon Sep 17 00:00:00 2001 From: Thilo Molitor Date: Sun, 26 May 2024 03:26:50 +0200 Subject: [PATCH] Implement APNS additional data --- Cargo.lock | 1 + fpush-apns/Cargo.toml | 1 + fpush-apns/src/config.rs | 7 +++++++ fpush-apns/src/push.rs | 14 +++++++++++++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index cc90555..452ff3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -455,6 +455,7 @@ dependencies = [ "log", "serde", "serde_derive", + "serde_json", ] [[package]] diff --git a/fpush-apns/Cargo.toml b/fpush-apns/Cargo.toml index bbd2f9d..0fe0b8e 100644 --- a/fpush-apns/Cargo.toml +++ b/fpush-apns/Cargo.toml @@ -11,6 +11,7 @@ async-trait = "^0.1" serde_derive = "^1.0" serde = { version = "^1.0", features = ["derive"] } +serde_json = "1.0" a2 = { git = "https://github.com/monal-im/apns2.git", branch = "faltheide/sync" } diff --git a/fpush-apns/src/config.rs b/fpush-apns/src/config.rs index cbc1e82..9d534dc 100644 --- a/fpush-apns/src/config.rs +++ b/fpush-apns/src/config.rs @@ -1,4 +1,6 @@ +use std::collections::HashMap; use serde::Deserialize; +use serde_json::Value; #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] @@ -6,6 +8,7 @@ pub struct AppleApnsConfig { cert_file_path: String, cert_password: String, topic: String, + additional_data: Option>, #[serde(default = "ApnsEndpoint::production")] environment: ApnsEndpoint, } @@ -29,6 +32,10 @@ impl AppleApnsConfig { ApnsEndpoint::Sandbox => a2::Endpoint::Sandbox, } } + + pub fn additional_data(&self) -> &Option> { + &self.additional_data + } } #[derive(Debug, Deserialize)] diff --git a/fpush-apns/src/push.rs b/fpush-apns/src/push.rs index ad2e396..daddb5a 100644 --- a/fpush-apns/src/push.rs +++ b/fpush-apns/src/push.rs @@ -1,4 +1,5 @@ use std::time::SystemTime; +use std::collections::HashMap; use a2::{ Client, DefaultNotificationBuilder, NotificationBuilder, NotificationOptions, Priority, @@ -8,11 +9,13 @@ use fpush_traits::push::{PushError, PushResult, PushTrait}; use async_trait::async_trait; use log::{debug, error}; +use serde_json::Value; use crate::AppleApnsConfig; pub struct FpushApns { apns: a2::client::Client, topic: String, + additional_data: Option>, } impl FpushApns { @@ -35,6 +38,7 @@ impl FpushApns { let wrapped_conn = Self { apns: apns_conn, topic: apns_config.topic().to_string(), + additional_data: apns_config.additional_data().clone(), }; Ok(wrapped_conn) } @@ -56,7 +60,7 @@ impl PushTrait for FpushApns { .set_body("New Message?") .set_mutable_content() .set_sound("default"); - let payload = notification_builder.build( + let mut payload = notification_builder.build( &token, NotificationOptions { apns_priority: Some(Priority::High), @@ -68,6 +72,14 @@ impl PushTrait for FpushApns { ..Default::default() }, ); + match &self.additional_data { + None => {} + Some(additional_data) => { + for (key, value) in additional_data { + payload.add_custom_data(key, value).unwrap(); + } + } + } log::debug!( "Payload send to apple: {}", payload.clone().to_json_string().unwrap()