Amplify Swift Utilities for Notifications provides helpful functionality for working with push notifications on iOS and macOS.
Although it was developed for use with AWS Amplify, it can also be used independently.
- Convenience methods to support requesting notification permissions and registering with APNs
- Push Notification Service extension to support fetching and attaching remote media to notifications
Amplify Swift Utilities for Notifications package supports iOS 13+ and macOS 10.15+.
This package is licensed under the Apache-2.0 License.
This package requires Xcode 13.4 or higher to build.
-
Swift Package Manager is distributed with Xcode. To start adding this package to your iOS project, open your project in Xcode and select File > Add Packages.
-
Enter the package GitHub repo URL (https://github.com/aws-amplify/amplify-swift-utils-notifications) into the search bar.
-
You'll see the repository rules for which version you want Swift Package Manager to install. Choose Up to Next Major Version and enter 1.0.0 as the minimum version for the Dependency Rule, then click Add Package.
-
Select
AmplifyUtilsNotifications
, then click Add Package. -
In your app code, explicitly import the plugin as needed.
import SwiftUI import AmplifyUtilsNotifications @main struct HelloWorldApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate var body: some Scene { WindowGroup { ContentView() } } } class AppDelegate: NSObject, UIApplicationDelegate { func applicationDidFinishLaunching(_ application: UIApplication) { Task { let isPushNotificationAllowed = await AmplifyUtilsNotifications.AUNotificationPermissions.allowed // ... } } }
-
This package is also available through CocoaPods. If you have not installed CocoaPods, follow the instructions here.
-
Add the package as a dependency to your Podfile.
platform :ios, '13.0' use_frameworks! target 'HelloWorldApp' do pod 'AmplifyUtilsNotifications', '~> 1.0.0' end
-
Then run the following command:
pod install
-
Open up *.xcworkspace with Xcode, and you will be able to use the
AmplifyUtilsNotifications
package in your project.
This package includes a ready to use implementation(AUNotificationService
) for handling remote notifications sent by AWS Pinpoint. It helps with decoding notification json data and retrieving the remote media url as an attachment.
-
Add a Service App Extension to Your Project. Apple Doc.
-
Update
info.plist
of the newly created Notification Service Extension.<dict> <key>NSExtension</key> <dict> <key>NSExtensionPointIdentifier</key> <string>com.apple.usernotifications.service</string> <key>NSExtensionPrincipalClass</key> <string>AmplifyUtilsNotifications.AUNotificationService</string> </dict> </dict>
Note:
We suggest you either keep the auto generated
NotificationService.swift
source file or add an empty swift file for your Notification Service Extension target. An empty source list will cause an error when you try to install the extension to a real device.
You can also subclass AUNotificationService
to support a different notification payload format or add custom functionality.
For example, we want to send the push notification with a field name video_url
.
-
Define a
MyPayload
struct that conforms to theAUNotificationPayload
protocol. It defines theremoteMediaURL
. -
Subclass
AUNotificationService
and change thepayloadSchema
property toMyPayload
that was defined in the previous step.import AmplifyUtilsNotifications struct MyPayload: AUNotificationPayload { var remoteMediaURL: String? { video_url } let video_url: String } class NotificationService: AUNotificationService { override init() { super.init() self.payloadSchema = MyPayload.self } }
-
Update the
info.plist
by settingNSExtensionPrincipalClass
to$(PRODUCT_MODULE_NAME).NotificationService
.
You can also override the didReceive
function to modify the content as desired. For example, attach suffix [MODIFIED]
to your notification title.
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
super.didReceive(request) { content in
self.contentHandler = contentHandler
let mutableContent = content.mutableCopy() as? UNMutableNotificationContent
mutableContent?.title = content.title + "[MODIFIED]"
if let mutableContent {
contentHandler(mutableContent)
}
}
}
We welcome you to use the GitHub issue tracker to report bugs or suggest features.
When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already reported the issue. Please try to include as much information as you can. Details like these are incredibly useful:
- Expected behavior and observed behavior
- A reproducible test case or series of steps
- The version of our code being used
- Any modifications you've made relevant to the bug
- Anything custom about your environment or deployment