Local Notifications
Local notifications allow your app to alert users at specified times when the app is in the background or not running. This implementation provides two main functionalities:
- Requesting notification permissions from users
- Scheduling time-based local notifications
Implementation
- Create a Swift File
- In Xcode, go to File > New > File From Template...
- Select Swift File, name it
NotificationManager.swift
, and paste the following code:
swift
import Foundation
import UserNotifications
class NotificationManager {
// This function requests notification permission from the user
func requestNotificationAuthorization(completion: @escaping (Bool) -> Void) {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if granted {
print("Notification authorization granted")
} else {
print("Notification authorization denied")
}
completion(granted)
}
}
// This function schedules a local notification in x seconds
func scheduleNotificationInSeconds(title: String, body: String, sound: String, identifier: String = "com.example.enclose", seconds: Double) {
let center = UNUserNotificationCenter.current()
center.removePendingNotificationRequests(withIdentifiers: [identifier])
let content = UNMutableNotificationContent()
content.title = title
content.body = body
content.sound = UNNotificationSound(named: UNNotificationSoundName(sound))
content.interruptionLevel = .active
// Prepare "trigger" and "request"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: seconds, repeats: false)
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
// Schedule the local notification
UNUserNotificationCenter.current().add(request) { error in
if let error = error {
print("Error scheduling notification: \(error.localizedDescription)")
} else {
print("Notification scheduled successfully")
}
}
}
}
- Integrate with Your View Controller
- In your
MainViewController.swift
file, add these methods to bridge between JavaScript and native notifications:
- In your
swift
// This function returns the status of notifications authorization
@objc func getNotificationsAuthorizationStatus(_ params: [String: String]) {
var javaScript = ""
let notificationManager = NotificationManager()
notificationManager.requestNotificationAuthorization { granted in
if granted {
Task {
if let successCallback = params["successCallback"] {
javaScript = "\(successCallback)(true);"
self.evaluateJavascript(javaScript: javaScript)
}
}
} else {
if let successCallback = params["successCallback"] {
javaScript = "\(successCallback)(false);"
self.evaluateJavascript(javaScript: javaScript)
}
}
}
}
// This method will schedule a local notification that will fire in X seconds
@objc func scheduleNotificationInSeconds(_ params: [String: String]) {
let secondsDoubleValue = Double(params["seconds"] ?? "5")
let notificationManager = NotificationManager()
notificationManager.scheduleNotificationInSeconds(
title: params["title"] ?? "Title",
body: params["body"] ?? "Body",
sound: params["sound"] ?? "default",
identifier: params["identifier"] ?? "com.example.enclose",
seconds: secondsDoubleValue ?? 5
)
}
- Using the Notifications in JavaScript
- To check check/request notification permission call
getNotificationsAuthorizationStatus
method:
- To check check/request notification permission call
javascript
// Check if our app has authorization to send notifications
enClose({
nativeCall: 'getNotificationsAuthorizationStatus',
// callback function will receive a boolean value
successCallback: ''
});
- To schedule a local notification that will trigger in X seconds call
scheduleNotificationInSeconds
method:
javascript
// Schedule a local notification in 10 seconds
const randomString = Math.random().toString(36).substring(2,7);
enClose({
nativeCall: 'scheduleNotificationInSeconds',
data: {
title: 'Notification title goes here',
body: 'Notification body goes here',
sound: 'default',
seconds: 10,
identifier: randomString
}
});
Advanced Usage
- To use custom sounds, add your MP3 files to the Xcode project and pass the filename (without extension) in the
sound
parameter - To cancel a pending notification, store the identifier and implement a cancellation method
- For recurring notifications, modify the trigger to use
repeats: true
with appropriate time intervals