66 lines
2.5 KiB
Rust
66 lines
2.5 KiB
Rust
//! Wraps UNUserNotificationCenter for macOS. Note that this uses the newer
|
|
//! `UserNotifications.framework` API, which requires that your application be properly signed.
|
|
//!
|
|
//! To use this module, you must specify the `user-notifications` feature flag in your
|
|
//! `Cargo.toml`.
|
|
|
|
use block::ConcreteBlock;
|
|
|
|
use objc::{class, msg_send, sel, sel_impl};
|
|
use uuid::Uuid;
|
|
|
|
use crate::foundation::{id, nil, NSString, NSUInteger};
|
|
|
|
pub mod enums;
|
|
pub use enums::NotificationAuthOption;
|
|
|
|
pub mod notifications;
|
|
pub use notifications::Notification;
|
|
|
|
/// Acts as a central interface to the Notification Center on macOS.
|
|
pub struct NotificationCenter;
|
|
|
|
impl NotificationCenter {
|
|
/// Requests authorization from the user to send them notifications.
|
|
pub fn request_authorization(options: &[NotificationAuthOption]) {
|
|
unsafe {
|
|
// @TODO: Revisit.
|
|
let block = ConcreteBlock::new(|_: id, error: id| {
|
|
let localized_description = NSString::new(msg_send![error, localizedDescription]).to_str();
|
|
if localized_description != "" {
|
|
println!("{:?}", localized_description);
|
|
}
|
|
});
|
|
|
|
let mut opts: NSUInteger = 0;
|
|
for opt in options {
|
|
let o: NSUInteger = opt.into();
|
|
opts = opts << o;
|
|
}
|
|
|
|
let center: id = msg_send![class!(UNUserNotificationCenter), currentNotificationCenter];
|
|
let _: () = msg_send![center, requestAuthorizationWithOptions:opts completionHandler:block.copy()];
|
|
}
|
|
}
|
|
|
|
/// Queues up a `Notification` to be displayed to the user.
|
|
pub fn notify(notification: Notification) {
|
|
let uuidentifier = format!("{}", Uuid::new_v4());
|
|
|
|
unsafe {
|
|
let identifier = NSString::new(&uuidentifier);
|
|
let request: id = msg_send![class!(UNNotificationRequest), requestWithIdentifier:identifier content:&*notification.0 trigger:nil];
|
|
let center: id = msg_send![class!(UNUserNotificationCenter), currentNotificationCenter];
|
|
let _: () = msg_send![center, addNotificationRequest:request];
|
|
}
|
|
}
|
|
|
|
/// Removes all notifications that have been delivered (e.g, in the notification center).
|
|
pub fn remove_all_delivered_notifications() {
|
|
unsafe {
|
|
let center: id = msg_send![class!(UNUserNotificationCenter), currentNotificationCenter];
|
|
let _: () = msg_send![center, removeAllDeliveredNotifications];
|
|
}
|
|
}
|
|
}
|