Starting from MoEngage iOS SDK version 6.2.0
and MORichNotification version 4.0.0
, push templates will be supported where you would be able to customize the way notification looks in expanded mode. This feature is supported in iOS 12.0 and above. For info on how to create campaigns with templates in the dashboard refer to this link.
info |
iOS 15.0 Update With iOS 15.0 update, we have released |
library_add_check |
Prerequisites Make sure you have completed the App Target and Notification Service Extension Implementation for supporting Rich Push in your project before proceeding with the below steps. |
STEPS:
For supporting these custom push templates, your project needs to have a Notification Content Extension. Follow the below steps to create Content Extension and to set it up to support MoEngage templates:
1. Create a Notification Content Extension
Once the target is created, Activate the scheme for Extension when prompted for the same. After this, your extension will be added to the project you will see a class with the extension name provided by you while creating and .plist file associated with it.
2. Set deployment target and Add Required frameworks
Now set the deployment target to iOS 12.0 or above, since we support this feature from iOS 12.0. After that add UserNotifications.framework
and UserNotificationsUI.framework
in Frameworks and Libraries as shown below:
3. Add required Capabilities
In Capabilities Section add App Groups and select the same app group id which you have configured in your App target and Notification Service Extension target.
info |
App Group ID Recommendation: We recommend having a separate App Group ID set for MoEngage with the format |
4. Info.plist changes
Make the changes in the Info.plist
of your Notification Content Extension, as shown above, set NSExtensionAttributes as following:
Attribute | Attribute Value |
---|---|
UNNotificationExtensionCategory | MOE_PUSH_TEMPLATE |
UNNotificationExtensionInitialContentSizeRatio | 1.2 |
UNNotificationExtensionDefaultContentHidden | YES |
UNNotificationExtensionUserInteractionEnabled | YES |
5. Storyboard changes
Select MainInterface.storyboard
in your Content extension and remove the default label which is placed there and set the background color of the view to clear color, as shown below:
6. MORichNotification Integration
For integrating through CocoaPod, include MORichNotification pod for your Notification Content Extension as shown below, and run pod update / install command :
target "PushTemplatesExtension" do
pod 'MORichNotification','~>5.0.0'
end
info |
Manual Integration
|
7. Code Changes in Content Extension:
import UIKit
import UserNotifications
import UserNotificationsUI
import MORichNotification
class NotificationViewController: UIViewController, UNNotificationContentExtension {
override func viewDidLoad() {
super.viewDidLoad()
// Set App Group ID
MORichNotification.setAppGroupID("Your App Group ID")
}
func didReceive(_ notification: UNNotification) {
// Method to add template to UI
MOPushTemplateHandler.sharedInstance().addPushTemplate(to: self, with: notification)
}
}
#import "NotificationViewController.h"
#import <UserNotifications/UserNotifications.h>
#import <UserNotificationsUI/UserNotificationsUI.h>
#import <MORichNotification/MORichNotification.h>
@interface NotificationViewController () <UNNotificationContentExtension>
@end
@implementation NotificationViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Set App Group ID
[MORichNotification setAppGroupID:@"Your App Group ID"];
}
- (void)didReceiveNotification:(UNNotification *)notification {
// Method to add template to UI
[[MOPushTemplateHandler sharedInstance] addPushTemplateToController:self withNotification:notification];
}
@end
As shown above, make these changes in your NotificationViewController
class:
- Set the same App Group ID in
viewDidLoad()
method which was enabled in Capabilities.[Recommended: group.{app bundle id}.MoEngage]
- Call
MOPushTemplateHandler
method to add template indidReceiveNotification()
callback.
8. Notification Click callback in App:
In the case of Simple Image Carousel notification, to know which slide was clicked by the user, make use of MOMessagingDelegate
to get notificationClicked(withScreenName: andKVPairs:)
callback to get key-value pairs and screen name if set for the clicked slide. Refer to the example below, here we are registering for the callback in AppDelegate:
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MOMessagingDelegate{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Set the delegate
MOMessaging.sharedInstance().messagingDelegate = self
//Rest of the implementation
}
// Notification Clicked Callback
func notificationClicked(withScreenName screenName: String?, andKVPairs kvPairs: [AnyHashable : Any]?) {
if let screenName = screenName {
print("Navigate to Screen:\(screenName)")
}
if let actionKVPairs = kvPairs {
print("Selected Action KVPair:\(actionKVPairs)")
}
}
// Notification Clicked Callback with Push Payload
func notificationClicked(withScreenName screenName: String?, kvPairs: [AnyHashable : Any]?, andPushPayload userInfo: [AnyHashable : Any]) {
print("Push Payload: \(userInfo)")
if let screenName = screenName {
print("Navigate to Screen:\(screenName)")
}
if let actionKVPairs = kvPairs {
print("Selected Action KVPair:\(actionKVPairs)")
}
}
}
@interface AppDelegate () <UNUserNotificationCenterDelegate, MOMessagingDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Set the delegate
MOMessaging.sharedInstance.messagingDelegate = self;
//Rest of the implementation
}
// Notification Clicked Callback
-(void)notificationClickedWithScreenName:(NSString *)screenName andKVPairs:(NSDictionary *)kvPairs{
if (screenName) {
NSLog(@"Screen Name : %@",screenName);
}
if (kvPairs) {
NSLog(@"KV Pairs : %@",kvPairs);
}
}
// Notification Clicked Callback with Push Payload
-(void)notificationClickedWithScreenName:(NSString *)screenName KVPairs:(NSDictionary *)kvPairs andPushPayload:(NSDictionary *)userInfo{
NSLog(@"Push Payload: %@",userInfo);
if (screenName) {
NSLog(@"Screen Name : %@",screenName);
}
if (kvPairs) {
NSLog(@"KV Pairs : %@",kvPairs);
}
}
@end
This callback will also be called for normal and Stylized Basic Notifications and could be made use of there as well.