expo_push_notification_client 2.1.0

Expo Push Notification Client for Rust
Documentation
# Expo Push Notification Client for Rust

This is a [community](https://docs.expo.dev/push-notifications/sending-notifications/#send-push-notifications-using-a-server) Expo Push Notification Client for Rust.

[![ci](https://github.com/katayama8000/expo-push-notification-client-rust/workflows/ci/badge.svg)](https://github.com/katayama8000/expo-push-notification-client-rust/actions)
[![crates.io](https://img.shields.io/crates/v/expo_push_notification_client)](https://crates.io/crates/expo_push_notification_client)
[![docs.rs](https://img.shields.io/docsrs/expo_push_notification_client)](https://docs.rs/expo_push_notification_client)
[![license](https://img.shields.io/crates/l/expo_push_notification_client)](LICENSE)

## Client (ReactNative with Expo)

You need to get Expo Push Token from Expo SDK and send it to Expo server first.
See [docs](https://docs.expo.dev/push-notifications/push-notifications-setup/) for more details.

## Server (Rust)

### Install

```bash
cargo add expo_push_notification_client
```

### Usage

```rust
use expo_push_notification_client::{Expo, ExpoClientOptions, ExpoPushMessage};

// Initialize Expo client
let expo = Expo::new(ExpoClientOptions {
    access_token: Some(access_token),
});

// Define Expo Push Tokens to send notifications to
let expo_push_tokens = ["ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]"];

// Build Expo Push Message with specified tokens
let expo_push_message = ExpoPushMessage::builder(expo_push_tokens).build()?;

// Send push notifications using Expo client
let tickets = expo.send_push_notifications(expo_push_message).await;

// Extract push notification IDs from tickets
let mut expo_push_ids = vec![];
for ticket in tickets {
    match ticket {
        ExpoPushTicket::Ok(ticket) => {
            expo_push_ids.push(ticket.id);
        }
        ExpoPushTicket::Error(e) => {
            // Handle error
        }
    }
}

// Retrieve push notification receipts using Expo client
expo.get_push_notification_receipts(expo_push_ids).await;

```
Additionally, you can further customize the ExpoPushMessage by adding more options. Refer to the [docs](https://docs.expo.dev/push-notifications/sending-notifications/#formats) for more details.
```rust
use expo_push_notification_client::{Expo, ExpoClientOptions, ExpoPushMessage, Priority, Sound, InterruptionLevel};

// Build Expo Push Message with detailed configurations
#[derive(Serialize)]
struct Data {
    data: String,
}

let expo_push_message = ExpoPushMessage::builder(["ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]"])
    .body("body")
    .data(&Data { data: "data".to_string()})?
    .ttl(100)
    .expiration(100)
    .priority(Priority::High)
    .subtitle("subtitle")
    .sound(Sound::Default)
    .badge(1)
    .channel_id("channel_id")
    .category_id("category_id")
    .mutable_content(true)
    .interruption_level(InterruptionLevel::TimeSensitive)
    .collapse_id("collapse_id")
    .tag("tag")
    .thread_id("thread_id")
    .icon("myicon")
    .target_content_id("target_content_id")
    .relevance_score(0.5)
    .filter_criteria("filter_criteria")
    .content_available(true)
    .title("title")
    .build()?;
```

### TLS Backend

This crate uses `reqwest` for HTTP requests. By default, it uses `reqwest`'s `default-tls` feature, which currently enables `rustls`, a TLS backend written in Rust.
You can choose a different TLS backend by disabling the default features and enabling one of the following features in your `Cargo.toml`.

#### Using native-tls

```toml
expo_push_notification_client = { version = "2.0.0", default-features = false, features = ["native-tls"] }
```

#### Using `rustls` (explicitly)

If you have disabled default features but still want to use `rustls`, you can enable it explicitly.
```toml
expo_push_notification_client = { version = "2.0.0", default-features = false, features = ["rustls"] }
```