Inbox is a drop-in view controller which contains the read and unread push notifications. Even if the user has not clicked on a notification, it will be present in the Inbox and will be highlighted to signify it is unread status. The title and the look and feel of the view are also customisable.
Inbox view controller is added as a child view controller to your own controller. This helps you get the delegate callback in the same controller, which you can further use for navigation to different screens.
SDK Installation
From MoEngage-iOS-SDK version 8.2.0 ,Inbox module is separated from the SDK to a separate module as MoEngageInbox and hence has to be added separately.
Install using CocoaPod
Integrate MoEngageInbox framework by adding the dependency in the podfile as show below.
pod 'MoEngageInbox','~>1.2.0'
Now run pod install
to install the framework
Install using Swift Package Manager
MoEngageInbox is supported through SPM from SDK version 1.2.0. To integrate use the following git hub url link and set the branch as master or version as 1.2.0 and above https://github.com/moengage/MoEngage-iOS-Inbox.git
Inbox Setup Checklist
Make sure the following items are implemented before using the Inbox Module:
-
Update the MoEngage-iOS-SDK to version >= 8.2.0
- Integrate the MoEngageInbox module of version >= 1.2.0
-
Implement Notification Service Extension and Integrate MoEngageRichNotiifcation(>= 6.2.0).
-
AppGroupID is set in App Target Capabilities and the same is passed to the SDK.
-
AppGroupID is set in Notification Service Extension Target Capabilities and the same is passed to the MoEngageRichNotification SDK.
warning |
App Group ID: Make sure the App Group ID configured for both the App Target and the Notification Service Extension Target are the same. |
How to use Inbox?
- Import
MoEngageInbox
in your View Controller. - Create a property - @property(nonatomic, strong) MOInboxViewController *inboxController.
- In viewDidLoad, add the below code to fetch MOInboxViewController
MOInbox.sharedInstance.getInboxViewController(withUIConfiguration: nil, forAppID: "YOUR Workspace ID") { inboxController in
self.inboxController = inboxController
}
[[MOInbox sharedInstance] getInboxViewControllerWithUIConfiguration:nil withInboxWithControllerDelegate:nil forAppID:@"YOUR Workspace ID" withCompletionBlock:^(MOInboxViewController * _Nullable inboxController) {
self.inboxController = inboxController;
}];
Push/Present the MOInboxViewController
In order for the SDK to handle the transition, use one of the methods.
MOInbox.sharedInstance.pushInboxViewController(toNavigationController: self.navigationController, withUIConfiguration: nil)
// Present
MOInbox.sharedInstance.presentInboxViewController(withUIConfiguration: nil)
[[MOInbox sharedInstance] pushInboxViewControllerToNavigationController:navigationController withUIConfiguration:nil withInboxWithControllerDelegate:nil forAppID:@"YOUR Workspace ID"];
// Present
[[MOInbox sharedInstance] presentInboxViewControllerWithUIConfiguration:nil withInboxWithControllerDelegate:nil forAppID:@"YOUR Workspace ID"];
MOInboxViewControllerDelegate Methods
Use MOInboxViewControllerDelegate
protocol for getting the callbacks from the Inbox Module:
extension NotificationsViewController: MOInboxViewControllerDelegate {
//Called when inbox cell is selected
func inboxEntryClicked(_ inboxItem: MOInboxEntry) {
print("Inbox Clicked")
}
//Called when inbox item is deleted
func inboxEntryDeleted(_ inboxItem: MOInboxEntry) {
print("Inbox item deleted")
}
// Called when MOInboxViewController is dismissed after being presented
func inboxViewControllerDismissed() {
print("Dismissed")
}
}
//Called when inbox cell is selected
- (void)inboxEntryClicked:(MOInboxEntry *)inboxItem {
NSLog(@"Inbox item Clicked");
}
//Called when inbox item is deleted
- (void)inboxEntryDeleted:(MOInboxEntry *)inboxItem {
NSLog(@"Inbox item Deleted");
}
// Called when MOInboxViewController is dismissed after being presented
- (void)inboxViewControllerDismissed {
NSLog(@"Inbox Dismissed");
}
Set MOInboxViewControllerDelegate by passing the delegate as parameter in the below functions.
//Push
MOInbox.sharedInstance.pushInboxViewController(toNavigationController: self.navigationController!, withUIConfiguration: nil, withInboxWithControllerDelegate: self)
//Present
MOInbox.sharedInstance.presentInboxViewController(withUIConfiguration: nil, withInboxWithControllerDelegate: self)
//Fetch MOInboxViewController
MOInbox.sharedInstance.getInboxViewController(withUIConfiguration: nil, withInboxWithControllerDelegate: self, forAppID: "YOUR Workspace ID") { inboxController in
self.inboxController = inboxController
}
//Push
[[MOInbox sharedInstance] pushInboxViewControllerToNavigationController:navigationController withUIConfiguration:nil withInboxWithControllerDelegate:self forAppID:@"YOUR Workspace ID"];
//Present
[[MOInbox sharedInstance] presentInboxViewControllerWithUIConfiguration:nil withInboxWithControllerDelegate:self forAppID:@"YOUR Workspace ID"];
//Fetch MOInboxViewController
[[MOInbox sharedInstance] getInboxViewControllerWithUIConfiguration:nil withInboxWithControllerDelegate:self forAppID:@"YOUR Workspace ID" withCompletionBlock:^(MOInboxViewController * _Nullable inboxController) {
self.inboxController = inboxController;
}];
}
Customizing Appearance
- You can push/present your controller. If you push your controller, make sure to add “Done” or “Cancel” button as a UIBarButtonItem to dismiss your View Controller.
- You can get the delegate callback of the click action on inbox cells.
- You can use this data for tracking events or navigation to another screen.
- You can customize the look and feel of the inbox view controller using the method:
let configuration = MOInboxUIConfiguration()
configuration.cellDefaultBackgroundColor = .red
configuration.cellHeaderLabelFont = UIFont.systemFont(ofSize: 15)
configuration.cellMessageLabelFont = UIFont.systemFont(ofSize: 13)
configuration.cellSelectionTintColor = .red
configuration.cellHeaderLabelTextColor = .white
configuration.cellMessageLabelTextColor = .white
configuration.cellUnreadBackgroundColor = .blue
let navigationBarStyle = MOInboxNavigationBarStyle()
navigationBarStyle.navigationBarColor = .black
navigationBarStyle.navigationBarTintColor = .blue
navigationBarStyle.navigationBarTitleColor = .blue
navigationBarStyle.navigationBarTransluscent = false
configuration.navigationBarStyle = navigationBarStyle
//Present
MOInbox.sharedInstance.presentInboxViewController(withUIConfiguration: configuration, forAppID: "YOUR Workspace ID")
//Push
MOInbox.sharedInstance.pushInboxViewController(toNavigationController: self.navigationController!, withUIConfiguration: configuration, forAppID: "Workspace ID")
//Fetch MOInboxViewController
MOInbox.sharedInstance.getInboxViewController(withUIConfiguration: configuration, forAppID: "YOUR Workspace ID") { controller in
}
MOInboxUIConfiguration* configuration = [[MOInboxUIConfiguration alloc] init];
configuration.cellDefaultBackgroundColor = [UIColor redColor];
configuration.cellHeaderLabelFont =[UIFont fontWithName:@"AvenirNext-Bold" size:18];
configuration.cellMessageLabelFont = [UIFont fontWithName:@"AvenirNext-Bold" size:15];
configuration.cellHeaderLabelTextColor = [UIColor whiteColor];
configuration.cellMessageLabelTextColor =[UIColor whiteColor];
configuration.cellUnreadBackgroundColor = [UIColor blueColor];
MOInboxNavigationBarStyle* navigationBarStyle = [[MOInboxNavigationBarStyle alloc] init];
navigationBarStyle.navigationBarColor = [UIColor blackColor];
navigationBarStyle.navigationBarTintColor = [UIColor blueColor];
navigationBarStyle.navigationBarTitleColor = [UIColor blueColor];
navigationBarStyle.navigationBarTransluscent = true;
configuration.navigationBarStyle = navigationBarStyle;
//Present
[[MOInbox sharedInstance] presentInboxViewControllerWithUIConfiguration:configuration withInboxWithControllerDelegate:self forAppID:@"YOUR Workspace ID"];
//Push
[[MOInbox sharedInstance] pushInboxViewControllerToNavigationController:navigationController withUIConfiguration:configuration withInboxWithControllerDelegate:nil forAppID:@"YOUR Workspace ID"];
//Fetch MOInboxViewController
[[MOInbox sharedInstance] getInboxViewControllerWithUIConfiguration:configuration withInboxWithControllerDelegate:nil forAppID:@"YOUR Workspace ID" withCompletionBlock:^(MOInboxViewController * _Nullable inboxController) {
}];
Self Handled Inbox
Fetch Inbox Messages:
Inbox can be completely customized now. Use getMessagesWithCompletionBlock:
to fetch the inbox messages.
MOInbox.sharedInstance.getInboxMessages(forAppID: "YOUR Workspace ID") { inboxMessages, account in
print("Received Inbox messages")
}
[[MOInbox sharedInstance] getInboxMessagesForAppID:@"YOUR Workspace ID" withCompletionBlock:^(NSArray * _Nonnull inboxEntry, MOAccountMeta * _Nullable accountMeta) {
NSLog(@"Received Inbox messages");
}];
Mark a notification as Read:
An inbox notification can be marked as read with the method markInboxNotificationReadForCampaignID:
by providing the campaign ID of the notification while calling the method. The method will return the updated notification payload where the isRead
key will be set to true.
//Get the MOInboxEntry instance
let pushModel = inboxMessages[]
if !pushModel.isRead {
MOInbox.sharedInstance.markInboxNotificationClicked(withCampaignID: pushModel.campaignID)
}
//An example of marking the inbox message as read
MOInboxModel *pushDataObj = [self.inboxMessagesArray objectAtIndex:<get the index>];
if (!pushDataObj.isRead){
[[MOInboxHandler sharedInstance] markInboxNotificationReadForCampaignID:pushDataObj.campaignID];
//Rest of the implementation
}
Track Inbox Notification Clicks:
An inbox notification click can be tracked by using method trackInboxNotificationClickForCampaignID:
by providing the campaign ID of the notification while calling the method.
//Get the MOInboxEntry instance
let pushModel = inboxMessages[]
MOInbox.sharedInstance.trackInboxClick(withCampaignID: pushModel.campaignID)
//An example of marking the inbox message as read
MOInboxModel *pushDataObj = [self.inboxMessagesArray objectAtIndex:<get the index>];
[[MOInboxHandler sharedInstance] trackInboxNotificationClickForCampaignID:pushDataObj.campaignID];
Process the Inbox Clicks:
If you want to perform the actions supported by the SDK(i.e, rich landing, deep linking, coupon code etc) associated with the notifications on clicking the entry in Inbox call processInboxNotificationWithCampaignID:
method as shown below.
//Get the MoInboxEntry instance
let pushModel = inboxMessages[]
MOInbox.sharedInstance.processInboxNotification(withCampaignID: pushModel.campaignID)
//An example of process the notification actions
MOInboxModel *pushDataObj = [self.inboxMessagesArray objectAtIndex:<get the index>];
[[MOInbox sharedInstance] processInboxNotificationWithCampaignID:pushDataObj.campaignID forAppID:@"YOUR Workspace ID"];
Get Unread Notifications count:
You can obtain the unread notifications count from the Inbox by using getUnreadNotifictionCount
method as shown below:
//Get Unread Notifications count
MOInbox.sharedInstance.getUnreadNotificationCount() { count, accountMeta in
print("Unread message count is \(count)")
}
//Get Unread Notifications count
[[MOInbox sharedInstance] getUnreadNotificationCountForAppID:@"YOUR Workspace ID" withCompletionBlock:^(NSInteger count, MOAccountMeta * _Nullable accountMeta) {
NSLog(@"Fetched unread message Count");
}];
Deleting Messages
Use this method to remove all the messages currently stored in inbox.
MOInbox.sharedInstance.removeInboxMessages()
[[MOInbox sharedInstance] removeInboxMessagesForAppID:@"YOUR Workspace ID"];
Use the below method to remove the single message stored in inbox by passing the Campaign ID.
MOInbox.sharedInstance.removeInboxMessage(withCampaignID: "YOUR CAMPAIGN ID")
[[MOInbox sharedInstance] removeInboxMessageWithCampaignID:@"CAMPAIGN ID" forAppID:@"YOUR Workspace ID"];
Methods deprecated in SDK version 4.4.0
We have revamped the Inbox Module in the SDK version 4.4.0 and following this, we have deprecated MOInboxPushDataModel
class and use MOInboxModel
class instances as the model object for notifications. Along with this, we have also deprecated few of the existing methods of MOInbox
as listed below:
+(NSArray *)getInboxMessages __deprecated_msg("This method is deprecated as the payload structure has changed, this method will be removed in SDK Version 5.0.0. Use getInboxMessagesWithCompletionBlock: instead");
+(void)trackInboxNotificationClickForCampaign:(MOInboxPushDataModel*)campaignObj andIsFirstClick:(BOOL)isFirstClick __deprecated_msg("This method is deprecated as MOInboxPushDataModel Class is depreacted, this method will be removed in SDK Version 5.0.0. Use trackInboxNotificationClickWithCampaignID: instead");
+(void)processInboxNotificationOnClickForCampaign:(MOInboxPushDataModel*)campaignObj __deprecated_msg("This method is deprecated as MOInboxPushDataModel Class is depreacted, this method will be removed in SDK Version 5.0.0. Use processInboxNotificationWithCampaignID: instead");
+(NSMutableDictionary*)markNotificationReadWithCampaignID:(NSString*)cid __deprecated_msg("This method is deprecated as MOInboxPushDataModel Class is depreacted, this method will be removed in SDK Version 5.0.0. Use markInboxNotificationClickedWithCampaignID: instead");
+(void)writeArrayToFile:(NSMutableArray *)anArray __deprecated_msg("Method Deprecated. From SDK Version 5.0.0 you will not be able to change the inbox file content.");
These methods will be removed from the SDK version 5.0.0, therefore make sure you have updated all the Inbox feature to use the newer APIs.