Buttons don't show on local interactive notification in iOS - ios

I've been busting my head against the table al morning with this. I know it's been asked before, but I really don't understand what's the problem with my code.
Here's the code I use to register and send interactive notifications.
Thanks in advance.
#define kNotificationActionNo #"ActionKeyNo"
#define kNotificationActionYes #"ActionKeyYes"
#define kNotificationCategoryVendingMachine #"VendingMachineNotification"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[self registerForNotification];
...
}
+ (void)sendLocalNotification:(NSString*)message info:(NSDictionary*)infoDict {
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.alertBody = message;
localNotification.fireDate = [NSDate date];
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.category = kNotificationCategoryVendingMachine;
localNotification.userInfo = infoDict;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
- (void)registerForNotification {
UIMutableUserNotificationAction *action1;
action1 = [[UIMutableUserNotificationAction alloc] init];
[action1 setActivationMode:UIUserNotificationActivationModeBackground];
[action1 setTitle:NSLocalizedString(#"YES_LEGEND", nil)];
[action1 setIdentifier:kNotificationActionYes];
[action1 setDestructive:NO];
[action1 setAuthenticationRequired:NO];
UIMutableUserNotificationAction *action2;
action2 = [[UIMutableUserNotificationAction alloc] init];
[action2 setActivationMode:UIUserNotificationActivationModeBackground];
[action2 setTitle:NSLocalizedString(#"NO_LEGEND", nil)];
[action2 setIdentifier:kNotificationActionNo];
[action2 setDestructive:NO];
[action2 setAuthenticationRequired:NO];
UIMutableUserNotificationCategory *actionCategory;
actionCategory = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory setIdentifier:kNotificationCategoryVendingMachine];
[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];
}

Well first things first,
I don't see you actually calling your sendLocalNotification method anywhere in your didFinishLaunchingWithOptions: method. You should call it to see if it actually fires, because aesthetically, you've done everything you should have done in order to set up a category-based notification. kudos, and well written for a newcomer to StackOverflow. Additionally, if you are calling it and you just simply omitted it from the question, then your problem probably lies in how you are setting your method. Right now it's a class method, if its intended or not I'm not sure, however, my point is, if it's not working, and the notifications are showing up, just not the category actions, then you should probably call it correctly or change it to an instance method.
See the difference between the two here
You are so close. You had everything set up properly and then swayed on the end. You should call your sendLocalNotification like this:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self sendLocalNotification:#"Estas cerca de una máquina expendedora. ¿Quieres realizar una compra?" info:#{#"type":#"near_vending"}];
}
And change your method to properly reflect what kind of method it is. I included a a link above to show you the difference. You will set it like this:
-(void)sendLocalNotification:
NOT
+(void)sendLocalNotification:

Related

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

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];

Setting dynamic button titles in iOS8 local notifications

I have followed the examples here and elsewhere for setting up 1 or 2 button local notifications and have that working just fine. The examples are just fine if you need canned buttons like Accept/Delete/etc, but I need need to set the button titles for what is happening in the app at the time. This is for a game and needs a generic engine. I need to be able to set the button titles to match the needs at the time. I have two categories so I can do one button or two button notification. It seems like the actions and categories need to be setup when you register for the notification. The title on the UIMutableUserNotificationCategory is shown as "read only". I know this can be done. For example the game "Spy Watch" can be played 90% of the time from the notifications.
Is there anyway set the titles when scheduling the notification? I have passed dictionaries with the data I need to process the response.
This is the AppDelegate side
NSString * const NotificationCategoryIdent1 = #"1BUTTON";
NSString * const NotificationCategoryIdent2 = #"2BUTTON";
NSString * const NotificationActionOneIdent = #"ACTION_ONE";
NSString * const NotificationActionTwoIdent = #"ACTION_TWO";
- (void)registerForNotification {
UIMutableUserNotificationAction *action1;
action1 = [[UIMutableUserNotificationAction alloc] init];
[action1 setActivationMode:UIUserNotificationActivationModeBackground];
[action1 setTitle:#"Button 1"];
[action1 setIdentifier:NotificationActionOneIdent];
[action1 setDestructive:NO];
[action1 setAuthenticationRequired:NO];
UIMutableUserNotificationAction *action2;
action2 = [[UIMutableUserNotificationAction alloc] init];
[action2 setActivationMode:UIUserNotificationActivationModeBackground];
[action2 setTitle:#"Button 2"];
[action2 setIdentifier:NotificationActionTwoIdent];
[action2 setDestructive:NO];
[action2 setAuthenticationRequired:NO];
UIMutableUserNotificationCategory *actionCategory2;
actionCategory2 = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory2 setIdentifier:NotificationCategoryIdent2];
[actionCategory2 setActions:#[action1, action2]
forContext:UIUserNotificationActionContextDefault];
UIMutableUserNotificationCategory *actionCategory1;
actionCategory1 = [[UIMutableUserNotificationCategory alloc] init];
[actionCategory1 setIdentifier:NotificationCategoryIdent1];
[actionCategory1 setActions:#[action1]
forContext:UIUserNotificationActionContextDefault];
NSSet *categories = [NSSet setWithObjects:actionCategory1, actionCategory2, nil];
UIUserNotificationType types = (UIUserNotificationTypeAlert|
UIUserNotificationTypeSound|
UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings;
settings = [UIUserNotificationSettings settingsForTypes:types
categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
Here is how I set up the notification in my view controller
UILocalNotification* localNotification2 = [[UILocalNotification alloc] init];
localNotification2.fireDate = [NSDate dateWithTimeIntervalSinceNow:30];
localNotification2.alertBody = #"Alert Body2";
localNotification2.timeZone = [NSTimeZone defaultTimeZone];
localNotification2.soundName = UILocalNotificationDefaultSoundName;
localNotification2.category = #"2BUTTON";
//localNotification.userInfo = infoDict;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification2];

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

Resources