-
Notifications
You must be signed in to change notification settings - Fork 55
/
certificate_client.rs
76 lines (64 loc) · 2.74 KB
/
certificate_client.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use a2::{Client, DefaultNotificationBuilder, NotificationBuilder, NotificationOptions};
use argparse::{ArgumentParser, Store, StoreOption, StoreTrue};
// An example client connectiong to APNs with a certificate and key
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
tracing_subscriber::fmt().init();
let mut certificate_file = String::new();
let mut password = String::new();
let mut device_token = String::new();
let mut message = String::from("Ch-check it out!");
let mut sandbox = false;
let mut topic: Option<String> = None;
{
let mut ap = ArgumentParser::new();
ap.set_description("APNs certificate-based push");
ap.refer(&mut certificate_file)
.add_option(&["-c", "--certificate"], Store, "Certificate PKCS12 file location");
ap.refer(&mut password)
.add_option(&["-p", "--password"], Store, "Certificate password");
ap.refer(&mut device_token)
.add_option(&["-d", "--device_token"], Store, "APNs device token");
ap.refer(&mut message)
.add_option(&["-m", "--message"], Store, "Notification message");
ap.refer(&mut sandbox)
.add_option(&["-s", "--sandbox"], StoreTrue, "Use the development APNs servers");
ap.refer(&mut topic)
.add_option(&["-o", "--topic"], StoreOption, "APNS topic");
ap.parse_args_or_exit();
}
// Connecting to APNs using a client certificate
let new_client = || -> Result<Client, Box<dyn std::error::Error + Sync + Send>> {
#[cfg(feature = "openssl")]
{
// Which service to call, test or production?
let endpoint = if sandbox {
a2::Endpoint::Sandbox
} else {
a2::Endpoint::Production
};
let mut certificate = std::fs::File::open(certificate_file)?;
// Create config with the given endpoint and default timeouts
let client_config = a2::ClientConfig::new(endpoint);
Ok(Client::certificate(&mut certificate, &password, client_config)?)
}
#[cfg(all(not(feature = "openssl"), feature = "ring"))]
{
Err("ring does not support loading of certificates".into())
}
};
let client = new_client()?;
let options = NotificationOptions {
apns_topic: topic.as_deref(),
..Default::default()
};
// Notification payload
let builder = DefaultNotificationBuilder::new()
.set_body(message.as_ref())
.set_sound("default")
.set_badge(1u32);
let payload = builder.build(device_token.as_ref(), options);
let response = client.send(payload).await?;
println!("Sent: {:?}", response);
Ok(())
}