如何在 iOS Objective-c 中实现交互式远程通知
Posted
技术标签:
【中文标题】如何在 iOS Objective-c 中实现交互式远程通知【英文标题】:How to implement interactive remote notifications in iOS Objective-c 【发布时间】:2017-12-05 09:22:08 【问题描述】:我是 Objective-c 的新手。我想创建一个交互式远程通知,它有两个动作,一个是调用“OK”,另一个是调用“VIEW”。当用户通过 APNS 收到通知时,如果用户单击“确定”,则必须关闭通知,并且如果用户单击“查看”,则该时间打开我的应用程序的特定页面。就是这样。
我浏览了许多网络文档并掌握了一些通知负载的概念。但我无法明智地实施这一步。任何人都可以帮助我,我该如何实现这个功能。并且请任何人不要标记为重复的问题。谢谢
【问题讨论】:
***.com/a/29118483/4601900检查 ***.com/questions/29484951/… makeapppie.com/2017/01/09/actions-in-push-notifications 嗨@Prashant,您提供的文档适用于ios 的更高版本。喜欢iOS10,11? 要求大于等于ios8 @PrashantTukadiya,还有一个问题,是远程通知,对吧? 【参考方案1】:注意:我在这里使用了我自己的常量,比如KNotificatoin_IDENTIFIER_CATEGORY_NEW_BID
在那个地方使用你的
注册推送
- (void) registerPushNotification
UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:type categories:[NSSet setWithObjects:[self createActionNotificationsSettingForApproveBID],[self createActionNotificationsSettingForCancelingRequest ], nil]];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
[[UIApplication sharedApplication] registerForRemoteNotifications];
- (UIMutableUserNotificationCategory *) createActionNotificationsSettingForApproveBID
UIMutableUserNotificationAction *actionApproveBID = [[UIMutableUserNotificationAction alloc] init];
[actionApproveBID setIdentifier:KNotificatoin_IDENTIFER_ACTION_APPROVEBID];
actionApproveBID.activationMode = UIUserNotificationActivationModeForeground;
actionApproveBID.title = @"Approve";
actionApproveBID.authenticationRequired = true;
[actionApproveBID setDestructive: false];
UIMutableUserNotificationAction *actionCancelDialog = [[UIMutableUserNotificationAction alloc] init];
[actionCancelDialog setIdentifier:KNotificatoin_IDENTIFER_ACTION_DETAILS];
actionCancelDialog.activationMode = UIUserNotificationActivationModeForeground;
actionCancelDialog.title = @"Details";
actionCancelDialog.authenticationRequired = true;
[actionCancelDialog setDestructive: false];
UIMutableUserNotificationCategory *cateogoryApproveBID = [[UIMutableUserNotificationCategory alloc] init];
cateogoryApproveBID.identifier = KNotificatoin_IDENTIFIER_CATEGORY_NEW_BID;
[cateogoryApproveBID setActions:@[actionApproveBID,actionCancelDialog] forContext:UIUserNotificationActionContextDefault];
[cateogoryApproveBID setActions:@[actionApproveBID,actionCancelDialog] forContext:UIUserNotificationActionContextMinimal];
return cateogoryApproveBID;
- (UIMutableUserNotificationCategory *) createActionNotificationsSettingForCancelingRequest
UIMutableUserNotificationAction *actionGetMoreBids = [[UIMutableUserNotificationAction alloc] init];
[actionGetMoreBids setIdentifier:KNotificatoin_IDENTIFER_ACTION_APPROVEBID];
actionGetMoreBids.activationMode = UIUserNotificationActivationModeForeground;
actionGetMoreBids.title = @"Get more bids";
actionGetMoreBids.authenticationRequired = true;
[actionGetMoreBids setDestructive: false];
UIMutableUserNotificationAction *actionEditRequest = [[UIMutableUserNotificationAction alloc] init];
[actionEditRequest setIdentifier:KNotificatoin_IDENTIFER_ACTION_EDIT_REQUEST];
actionEditRequest.activationMode = UIUserNotificationActivationModeForeground;
actionEditRequest.title = @"Edit request";
actionEditRequest.authenticationRequired = true;
[actionEditRequest setDestructive: false];
UIMutableUserNotificationCategory *categoryCancelRequest = [[UIMutableUserNotificationCategory alloc] init];
categoryCancelRequest.identifier = KNotificatoin_IDENTIFER_ACTION_MORE_BIDS;
[categoryCancelRequest setActions:@[actionGetMoreBids,actionEditRequest] forContext:UIUserNotificationActionContextDefault];
[categoryCancelRequest setActions:@[actionGetMoreBids,actionEditRequest] forContext:UIUserNotificationActionContextMinimal];
return categoryCancelRequest;
你将如何处理动作?
- (void) application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
NSLog(@" APPLICATION STATUS %ld",(long)[UIApplication sharedApplication].applicationState);
if ([[[userInfo objectForKey:@"aps"] objectForKey:kCategory] isEqualToString:KNotificatoin_IDENTIFIER_CATEGORY_NEW_BID])
if ([identifier isEqualToString:KNotificatoin_IDENTIFER_ACTION_APPROVEBID])
NSMutableDictionary *dictData = [NSMutableDictionary dictionaryWithDictionary:userInfo];
[dictData setObject:@17 forKey:kType];
if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive || self.isApplicationIsInActiveState)
[self saveDictionaryForPushActiveState:dictData];
else
[self navigatateAsPerPush:dictData allowInActiveState:NO];
else if ([identifier isEqualToString:KNotificatoin_IDENTIFER_ACTION_DETAILS])
NSLog(@"You chose action 2.");
if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive || self.isApplicationIsInActiveState)
[self saveDictionaryForPushActiveState:userInfo];
else
[self navigatateAsPerPush:userInfo allowInActiveState:NO];
else if ([[[userInfo objectForKey:@"aps"] objectForKey:kCategory] isEqualToString:KNotificatoin_IDENTIFIER_NOTIFICATION_REQUEST])
NSMutableDictionary *dictData = [NSMutableDictionary dictionaryWithDictionary:userInfo];
if ([identifier isEqualToString:KNotificatoin_IDENTIFER_ACTION_EDIT_REQUEST])
NSLog(@"You chose action 1.");
[dictData setObject:@16 forKey:kType];
if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive || self.isApplicationIsInActiveState)
[self saveDictionaryForPushActiveState:dictData];
else
[self navigatateAsPerPush:dictData allowInActiveState:NO];
else if ([identifier isEqualToString:KNotificatoin_IDENTIFER_ACTION_MORE_BIDS])
NSLog(@"You chose action 2.");
if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive || self.isApplicationIsInActiveState)
[self saveDictionaryForPushActiveState:dictData];
else
[self navigatateAsPerPush:dictData allowInActiveState:NO];
if (completionHandler)
completionHandler();
希望对你有帮助
【讨论】:
@Swarup 我没有那个。请参考苹果文档 我不明白你的示例代码中有多少动作(按钮)。你能告诉我还有名字吗?所以这对我很有帮助。谢谢 看名字createActionNotificationsSettingForApproveBID
就很清楚了,两个按钮approve和cancel,你自己试试那个code你会很容易理解的
@Swarup 欢迎,如果回答对您有帮助,您可以批准为已接受!
是的,我会在成功实施后这样做。【参考方案2】:
借助 iOS 12 SDK,您的应用可以利用 通知中的交互式控件
通知内容应用扩展现在支持自定义视图中的用户交互。如果您的应用通知的内容需要提示用户交互,请添加按钮和开关等控件。
启用用户交互:
打开通知内容扩展的 info.plist 文件。
将 UNNotificationExtensionUserInteractionEnabled 键添加到您的扩展属性。给它一个布尔值,设置为 YES。
这里是参考,想了解更多
https://developer.apple.com/documentation/usernotificationsui/customizing_the_appearance_of_notifications
https://developer.apple.com/documentation/usernotificationsui/customizing_the_appearance_of_notifications
https://developer.apple.com/documentation/usernotificationsui
【讨论】:
以上是关于如何在 iOS Objective-c 中实现交互式远程通知的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Objective-C 和 Swift 中实现“didSelectButtonInCellAtIndexPath:”?
如何在objective-c的pickerView中实现多次转换
如何在 iOS(Swift 或 Objective C)中实现这样的套接字调用?