Local notification override Remote notification (Actionable notification) setting in iOS 9? - ios

I used following code for remote notification
UIMutableUserNotificationAction *action1;
action1 = [[UIMutableUserNotificationAction alloc] init];
[action1 setActivationMode:UIUserNotificationActivationModeBackground];
[action1 setTitle:#"REJECT"];
[action1 setIdentifier:NotificationActionOneIdent];
[action1 setDestructive:NO];
[action1 setAuthenticationRequired:NO];
UIMutableUserNotificationAction *action2;
action2 = [[UIMutableUserNotificationAction alloc] init];
[action2 setActivationMode:UIUserNotificationActivationModeBackground];////UIUserNotificationActivationModeBackground
[action2 setTitle:#"ACCEPT"];
[action2 setIdentifier:NotificationActionTwoIdent];
[action2 setDestructive:NO];
[action2 setAuthenticationRequired:NO];
UIMutableUserNotificationCategory *actionCategory;
actionCategory = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory setIdentifier:NotificationCategoryIdent];
[actionCategory setActions:#[action1, action2]
forContext:UIUserNotificationActionContextDefault];
NSSet *categories = [NSSet setWithObject:actionCategory];
//Right, that is the point
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:
UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
//register to receive notifications
[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
This works fine show's correct (Accept/Reject buttons). For some condition i want to wake up app to Foreground so i am using following local notification code in
(void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void
(^)())completionHandler method.
UIMutableUserNotificationAction *action1;
action1 = [[UIMutableUserNotificationAction alloc] init];
[action1 setActivationMode:UIUserNotificationActivationModeForeground];
[action1 setTitle:#"LAUNCH"];
[action1 setIdentifier:#"OPEN_ACTION"];
[action1 setDestructive:NO];
[action1 setAuthenticationRequired:NO];
UIMutableUserNotificationCategory *actionCategory;
actionCategory = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory setIdentifier:#"LOCAL_NOTIFICATIOn"];
[actionCategory setActions:#[action1]
forContext:UIUserNotificationActionContextDefault];
[actionCategory setActions:#[action1]
forContext:UIUserNotificationActionContextMinimal];
NSSet *categories1 = [NSSet setWithObject:actionCategory];
UIUserNotificationSettings *settings2 = [UIUserNotificationSettings settingsForTypes:
UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:categories1];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings2];
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate date];
localNotification.alertTitle= #"Security settings enabled,";
localNotification.alertBody = #"tap the Launch button to start the application";
localNotification.category = #"LOCAL_NOTIFICATIOn";
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
Problem: First time Remote notification show's Accept/Reject button correctly but after registering Local notification Remote notification doesn't shows action buttons(Accept/Reject). I can't seen buttons in alerts?

Your remote notification setting overridden by local notification setting.
// Registering UIUserNotificationSettings more than once results in previous settings being overwritten.
- (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;
comment this code:
[[UIApplication sharedApplication] registerUserNotificationSettings:settings2];

Related

Can't make UIUserNotificationActionBehaviorTextInput work

UIMutableUserNotificationAction *answer;
answer = [[UIMutableUserNotificationAction alloc] init];
[answer setActivationMode:UIUserNotificationActivationModeBackground];
[answer setTitle:#"Answer"];
[answer setIdentifier:#"Answer"];
[answer setDestructive:NO];
[answer setAuthenticationRequired:NO];
[answer setBehavior:UIUserNotificationActionBehaviorTextInput];
UIMutableUserNotificationCategory *actionCategory;
actionCategory = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory setIdentifier:NotificationCategoryIdent];
[actionCategory setActions:#[answer]
forContext:UIUserNotificationActionContextDefault];
NSSet *categories = [NSSet setWithObject:actionCategory];
UIUserNotificationType types = (UIUserNotificationTypeAlert|
UIUserNotificationTypeSound|
UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings;
settings = [UIUserNotificationSettings settingsForTypes:types
categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
This is how I set up my "Reply" action. As you can see, I specified the desired behavior. However, when I receive some notification, I pull it down and see this "Answer" button. What's the problem? Where is the textfield?

Action Buttons won't show in Notification

I'm trying to add iOS8 Action Buttons to my already working notifications. But they won't show up. It's just a normal notification without buttons.
//Action
UIMutableUserNotificationAction* loginAction = [[UIMutableUserNotificationAction alloc] init];
loginAction.identifier = #"loginAction"; //ID string to be passed back to your app when you handle the action
loginAction.title = #"login";
loginAction.activationMode = UIUserNotificationActivationModeForeground;
loginAction.destructive = NO;
loginAction.authenticationRequired = YES;
//Category
UIMutableUserNotificationCategory* loginCategory = [[UIMutableUserNotificationCategory alloc] init];
loginCategory.identifier = #"loginCategory"; //ID to include in your push payload
[loginCategory setActions:[NSArray arrayWithObjects:loginAction, nil] forContext:UIUserNotificationActionContextDefault];
//Register Settings and Notification
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:[NSSet setWithObject:loginCategory]]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
Using this code will have the same effect as setting the categories parameter to nil.
The payload looks like this:
'{"aps":{"alert":{"body":"text"},"category":"loginCategory"}}'
I just added the category key to the payload.
What am i missing?
Here is a very simple example, in Objective-C, of how to register a notification that has 2 actions.
NSString * const NotificationCategoryIdent = #"ACTIONABLE";
NSString * const NotificationActionOneIdent = #"ACTION_ONE";
NSString * const NotificationActionTwoIdent = #"ACTION_TWO";
- (void)registerForNotification {
UIMutableUserNotificationAction *action1;
action1 = [[UIMutableUserNotificationAction alloc] init];
[action1 setActivationMode:UIUserNotificationActivationModeBackground];
[action1 setTitle:#"Action 1"];
[action1 setIdentifier:NotificationActionOneIdent];
[action1 setDestructive:NO];
[action1 setAuthenticationRequired:NO];
UIMutableUserNotificationAction *action2;
action2 = [[UIMutableUserNotificationAction alloc] init];
[action2 setActivationMode:UIUserNotificationActivationModeBackground];
[action2 setTitle:#"Action 2"];
[action2 setIdentifier:NotificationActionTwoIdent];
[action2 setDestructive:NO];
[action2 setAuthenticationRequired:NO];
UIMutableUserNotificationCategory *actionCategory;
actionCategory = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory setIdentifier:NotificationCategoryIdent];
[actionCategory setActions:#[action1, action2]
forContext:UIUserNotificationActionContextDefault];
NSSet *categories = [NSSet setWithObject:actionCategory];
UIUserNotificationType types = (UIUserNotificationTypeAlert|
UIUserNotificationTypeSound|
UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings;
settings = [UIUserNotificationSettings settingsForTypes:types
categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
To send this type of notification simply add the category to the payload.
"aps" : {
"alert" : "Pull down to interact.",
"category" : "ACTIONABLE"
}
These methods will get called, in the background, when the user selects an action from your push notification.
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler {
if ([identifier isEqualToString:NotificationActionOneIdent]) {
NSLog(#"You chose action 1.");
}
else if ([identifier isEqualToString:NotificationActionTwoIdent]) {
NSLog(#"You chose action 2.");
}
if (completionHandler) {
completionHandler();
}
}
Hope this helps...cheers !!!

Schedule Interactive UILocalNotification - Obj-C

I'm trying to schedule an interactive UILocalNotifaction.
My attempt has been to use the following code, which I grabbed from this tutorial:
NSString * const NotificationCategoryIdent = #"ACTIONABLE";
NSString * const NotificationActionOneIdent = #"ACTION_ONE";
NSString * const NotificationActionTwoIdent = #"ACTION_TWO";
- (void)registerForNotification {
UIMutableUserNotificationAction *action1;
action1 = [[UIMutableUserNotificationAction alloc] init];
[action1 setActivationMode:UIUserNotificationActivationModeBackground];
[action1 setTitle:#"Action 1"];
[action1 setIdentifier:NotificationActionOneIdent];
[action1 setDestructive:NO];
[action1 setAuthenticationRequired:NO];
UIMutableUserNotificationAction *action2;
action2 = [[UIMutableUserNotificationAction alloc] init];
[action2 setActivationMode:UIUserNotificationActivationModeBackground];
[action2 setTitle:#"Action 2"];
[action2 setIdentifier:NotificationActionTwoIdent];
[action2 setDestructive:NO];
[action2 setAuthenticationRequired:NO];
UIMutableUserNotificationCategory *actionCategory;
actionCategory = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory setIdentifier:NotificationCategoryIdent];
[actionCategory setActions:#[action1, action2]
forContext:UIUserNotificationActionContextDefault];
NSSet *categories = [NSSet setWithObject:actionCategory];
UIUserNotificationType types = (UIUserNotificationTypeAlert|
UIUserNotificationTypeSound|
UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings;
settings = [UIUserNotificationSettings settingsForTypes:types
categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
However, this code doesn't seem to actually schedule the notification anywhere. What am I missing?
Apollo,
Scheduling a local notification is relatively easy. Piggy backing off the tutorial you referenced I kind of switched it up so it can make more sense, you can deter or alter the code as need be, but this will give you a better starting point than the tutorial did. Please know it's not mandatory to put this in application didFinishLaunchingWithOptions: you can schedule a UILocalNotification anywhere app-wide. See the references below for complete properties of each method
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//Here we are just going to create the actions for the category.
UIMutableUserNotificationAction *acceptAction = [self createAction];
UIMutableUserNotificationAction *laterAction = [self createLaterAction];
laterAction.title = #"Not Now";
//Creating the category and assigning the actions:
UIMutableUserNotificationCategory *acceptCategory = [self createCategory:#[acceptAction, laterAction]];
//Register the categories
[self registerCategorySettings:acceptCategory];
//For testing purposes we will just fire a local notification on load. This is just for reference, but you don't have to call it in applicationDidFinishLaunching
[self fireLocalNotification];
return YES;
}
//Create a category
- (UIMutableUserNotificationCategory *)createCategory:(NSArray *)actions {
UIMutableUserNotificationCategory *acceptCategory = [[UIMutableUserNotificationCategory alloc] init];
acceptCategory.identifier = #"ACCEPT_CATEGORY";
[acceptCategory setActions:actions forContext:UIUserNotificationActionContextDefault];
return acceptCategory;
}
//Register your settings for that category
- (void)registerCategorySettings:(UIMutableUserNotificationCategory *)category {
UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound);
NSSet *categories = [NSSet setWithObjects:category, nil];
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
//Create Actions Methods
- (UIMutableUserNotificationAction *)createAction {
UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];
acceptAction.identifier = #"ACCEPT_IDENTIFIER";
acceptAction.title = #"Accept";
acceptAction.activationMode = UIUserNotificationActivationModeBackground;
acceptAction.destructive = NO;
// If YES requires passcode
acceptAction.authenticationRequired = NO;
return acceptAction;
}
- (UIMutableUserNotificationAction *)createLaterAction {
UIMutableUserNotificationAction *laterAction = [[UIMutableUserNotificationAction alloc] init];
laterAction.identifier = #"LATER_IDENTIFIER";
laterAction.title = #"Not Now";
laterAction.activationMode = UIUserNotificationActivationModeBackground;
laterAction.destructive = NO;
laterAction.authenticationRequired = NO;
return laterAction;
}
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
UIUserNotificationType allowedTypes = [notificationSettings types];
NSLog(#"Registered for notification types: %u", allowedTypes);
}
//Fire a local Notification: For testing purposes we are just going to fire this immediately after launch. But this will give you a general idea of how to create a UILocalNotification app-wide:
- (void)fireLocalNotification {
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = #"We are just testing -";
notification.category = #"ACCEPT_CATEGORY";
notification.fireDate = [NSDate dateWithTimeInterval:15 sinceDate:[NSDate date]];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
And your outcome will be as anticipated:
Don't forget to call the completion handlers for the actions that were selected.
application:handleActionWithIdentifier:forLocalNotification:completionHandler:
Please review the documentation and references below for further customization. Again, i'm not saying this is the right way and it's definetly not the only, it's just a great starting point for you to understand how they work. There are lots of customizable properties for actions and UILocalNotifications
REFERENCES
UILocalNotification & Properties : Documentation
iOS8 Notification Actions & Properties : Documentation

How do I make interactive notifications in iOS 8 app?

In iOS 8, there is a new feature to notifications where you can slide down on it and do an action. For example, when you get a message from iMessage and slide down on the notification, you can type in a quick response.
I've been looking through docs on how to do this, but I couldn't find it. Does anyone know where I can find out how to do it this/ where it is in docs?
Note :- This is Step 1
NSString * const NotificationCategoryIdent = #"ACTIONABLE";
NSString * const NotificationActionOneIdent = #"ACTION_ONE";
NSString * const NotificationActionTwoIdent = #"ACTION_TWO";
- (void)registerForNotification {
UIMutableUserNotificationAction *action1;
action1 = [[UIMutableUserNotificationAction alloc] init];
[action1 setActivationMode:UIUserNotificationActivationModeBackground];
[action1 setTitle:#"Action 1"];
[action1 setIdentifier:NotificationActionOneIdent];
[action1 setDestructive:NO];
[action1 setAuthenticationRequired:NO];
UIMutableUserNotificationAction *action2;
action2 = [[UIMutableUserNotificationAction alloc] init];
[action2 setActivationMode:UIUserNotificationActivationModeBackground];
[action2 setTitle:#"Action 2"];
[action2 setIdentifier:NotificationActionTwoIdent];
[action2 setDestructive:NO];
[action2 setAuthenticationRequired:NO];
UIMutableUserNotificationCategory *actionCategory;
actionCategory = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory setIdentifier:NotificationCategoryIdent];
[actionCategory setActions:#[action1, action2]
forContext:UIUserNotificationActionContextDefault];
NSSet *categories = [NSSet setWithObject:actionCategory];
UIUserNotificationType types = (UIUserNotificationTypeAlert|
UIUserNotificationTypeSound|
UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings;
settings = [UIUserNotificationSettings settingsForTypes:types
categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
Note :- This is Step 2
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler {
if ([identifier isEqualToString:NotificationActionOneIdent]) {
NSLog(#"You chose action 1.");
}
else if ([identifier isEqualToString:NotificationActionTwoIdent]) {
NSLog(#"You chose action 2.");
}
if (completionHandler) {
completionHandler();
}
}
Note :- If you want to learn more, Visit this link.
https://nrj.io/simple-interactive-notifications-in-ios-8/
take a look at
https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/NotificationCenter.html
for details on widgets on the notification center as well as
https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIMutableUserNotificationCategory_class/index.html#//apple_ref/doc/uid/TP40014610
where UIMutableUserNotification is what you're looking for.
Note that this documentation is pre-release so it can be changed whenever production is pushed.
I take no credit for this answer, I just found it online but it was very useful in helping my understanding of iOS8 Interactive Notifications:
http://docs.appcelerator.com/titanium/3.0/#!/guide/iOS_Interactive_Notifications-section-40930452_iOSInteractiveNotifications-CreateaNotificationAction

Register for Remote AND Local Notifications

In my app I want to support both - Remote Notifications and Local Notifications. The Remote Notification should have two actions that let the user interact with it in Notification Center.
Currently I have this code to register for notifications. My question is do I have to call register for local notifications separately or are local notifications already included in this registration process.
if ([[UIApplication sharedApplication] respondsToSelector:#selector(registerUserNotificationSettings:)]) {
UIMutableUserNotificationAction *actionCancel = [[UIMutableUserNotificationAction alloc] init];
[actionCancel setActivationMode:UIUserNotificationActivationModeBackground];
[actionCancel setTitle:#"Cancel"];
[actionCancel setIdentifier:NotificationActionOneIdent];
[actionCancel setDestructive:NO];
[actionCancel setAuthenticationRequired:NO];
UIMutableUserNotificationAction *actionOk = [[UIMutableUserNotificationAction alloc] init];
[actionOk setActivationMode:UIUserNotificationActivationModeBackground];
[actionOk setTitle:#"Ok"];
[actionOk setIdentifier:NotificationActionTwoIdent];
[actionOk setDestructive:NO];
[actionOk setAuthenticationRequired:NO];
UIMutableUserNotificationCategory *actionCategory = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory setIdentifier:NotificationCategoryIdent];
[actionCategory setActions:#[actionCancel, actionOk]
forContext:UIUserNotificationActionContextDefault];
NSSet *categories = [NSSet setWithObject:actionCategory];
UIUserNotificationType types = (UIUserNotificationTypeAlert|
UIUserNotificationTypeSound|
UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings;
settings = [UIUserNotificationSettings settingsForTypes:types
categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
locals are included when you registerUserNotificationSettings so your code is fine

Resources