- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在这里工作了几个小时,据说我的一切都按预期运行,但它没有调用我的 userNotificationCenter:(UNUserNotificationCenter *)center
方法当通知在应用程序内关闭时,什么也没有发生。
willPresentNotification:(UNNotification *)通知
withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))
应用程序不在应用程序中时会按预期发出通知,但在应用程序中时则不会发出任何通知。
这是我的代码,如果您发现我做错了什么,请告诉我。
类NotificationDelegate.h:
#import <UIKit/UIKit.h>
#import <UserNotifications/UserNotifications.h>
@interface NotificationDelegate : UNUserNotificationCenter <UNUserNotificationCenterDelegate>
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler;
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)())completionHandler;
@end
NotificationDelegate.m:
#import "NotificationDelegate.h"
@implementation NotificationDelegate
//Called when a notification is delivered to a foreground app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
NSLog(@"User Info : %@",notification.request.content.userInfo);
[self sendMessage:[UIApplication sharedApplication] message:notification.request.content];
completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
}
- (void) sendMessage:(UIApplication *)application message:(UNNotificationContent *)content{
UIAlertController *ac = [UIAlertController alertControllerWithTitle:content.title
message:content.body
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"Go Away!" style:UIAlertActionStyleDefault handler:nil];
[ac addAction:action];
dispatch_async(dispatch_get_main_queue(), ^{
[application.keyWindow.rootViewController presentViewController:ac animated:YES completion:nil];
});
}
//Called to let your app know which action was selected by the user for a given notification.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void(^)())completionHandler{
NSLog(@"User Info : %@",response.notification.request.content.userInfo);
}
@end
AppDelegate.h:
#import <UIKit/UIKit.h>
#import "NotificationDelegate.h"
@import UserNotifications;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UNUserNotificationCenter *center;
@property (strong, nonatomic) NotificationDelegate *ncdel;
@property (strong, nonatomic) UIWindow *window;
@end
AppDelegate.m:
#import "AppDelegate.h"
@import UserNotifications;
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.center = [UNUserNotificationCenter currentNotificationCenter];
self.center.delegate = self.ncdel;
return YES;
}
ViewController.m:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.pvHelper = [[PickerViewHelperViewController alloc] init];
self.pickerView.dataSource = self.pvHelper;
self.pickerView.delegate = self.pvHelper;
self.pvHelper.answer = [NSNumber numberWithInteger:10];
}
- (void) requestPermission{
UNAuthorizationOptions options = UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge;
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:options
completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted) {
NSLog(@"Something went wrong");
}
}];
}
- (void) createNotification:(NSNumber *)time{
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = [NSString localizedUserNotificationStringForKey:@"Alarming, isn't it?" arguments:nil];
content.body = [NSString localizedUserNotificationStringForKey:@"Listen to me my love" arguments:nil];
content.sound = [UNNotificationSound defaultSound];
content.badge = [NSNumber numberWithInteger:99];
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:[time integerValue]
repeats:NO];
//Note: Calling addNotificationRequest with the same identifier string will replace the existing notification. If you want to schedule multiple requests use a different identifier each time.
NSString *identifier = @"Alarm Triggered";
UNNotificationRequest *req = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:req withCompletionHandler:^(NSError * _Nullable error) {
if(error != nil){
NSLog(@"Something went wrong: %@", error);
}
else{
NSLog(@"I have requested the Notification be made");
}
}];
}
- (IBAction)buttonTappedSetAlarm:(id)sender {
[self requestPermission];
[self createNotification: [[self pvHelper] answer]];
}
这无关紧要,但我的单 View 应用程序只有 10、20、30...60 秒、分钟、小时的选择器,我计算得出请求的时间。
就像我说的,请求在应用程序之外按预期工作,但是当应用程序位于前台时,什么也没有发生,这真的让我很困扰。
任何帮助将不胜感激。
最佳答案
我知道怎么做了。
我放弃了在另一个类中实现 UNUserNotificationCenterDelegate
的尝试,而是在我的 View Controller 中完成了它:
#import <UIKit/UIKit.h>
#import "PickerViewHelperViewController.h"
@import UserNotifications;
@interface ViewController : UIViewController <UNUserNotificationCenterDelegate>
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (strong, nonatomic) PickerViewHelperViewController *pvHelper;
// Two methods needed to implement from the UNUserNotificationCenterDelegate
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler;
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)())completionHandler;
@end
然后只需在我的 .m 文件中添加随附的代码即可显示本地通知。
- (void) sendMessage:(UIApplication *)application title:(NSString *)title message:(NSString *)message{
UIAlertController *ac = [UIAlertController alertControllerWithTitle:title
message:message
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"Go Away!" style:UIAlertActionStyleDefault handler:nil];
[ac addAction:action];
dispatch_async(dispatch_get_main_queue(), ^{
[application.keyWindow.rootViewController presentViewController:ac animated:YES completion:^{
application.applicationIconBadgeNumber = 0;
}];
});
}
//Called when a notification is delivered to a foreground app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
NSLog(@"User Info : %@",notification.request.content.userInfo);
[self sendMessage:[UIApplication sharedApplication] title:@"local notification within App" message:notification.request.content.body];
completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionBadge);
}
//Called when a notification is delivered to a background app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void(^)())completionHandler{
NSLog(@"User Info : %@",response.notification.request.content.userInfo);
[self sendMessage:[UIApplication sharedApplication]
title:@"I habe been opened from outside the App"
message:response.notification.request.content.body];
completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
}
上面的创建通知和请求权限方法在代码中保持不变。
这允许在应用程序中显示本地通知,并且如果通过通知打开应用程序,则可以显示通知。
关于ios - 显示基于 UNUserNotification iOS 的 UIAlertAction 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44169935/
我做了一个像这样的UNUserNotification: let content = UNMutableNotificationContent() content.title = "a
我在 iOS 10 中使用新的 UNUserNotification 框架。我可以看到如何添加操作按钮,但是当用户点击通知本身时我该如何响应?在我的例子中,它将是一张带有一些文字的图片。 默认行为是打
当我安排一个近期的日期(比如 1 小时后)时会显示通知,但当我安排明天或今晚晚些时候时,它们永远不会显示在我的真实数据上。关于为什么会发生这种情况的任何想法?我仔细检查了 trigger.nextTr
我试图让用户安排每天在特定时间打开应用程序的通知。到目前为止,我已经能够通过计算从现在到用户选择之间的时间来安排第一个通知,并在 X 秒内安排通知。但是,有没有一种方法可以将通知设置为每天重复?如果您
我正在如下设置多个 UNUsernotifications, - (void)viewDidLoad { [super viewDidLoad]; notifCount = 0;
我正在如下设置多个 UNUsernotifications, - (void)viewDidLoad { [super viewDidLoad]; notifCount = 0;
这是我的UNUserNotification代码 func scheduleNotification() { UNUserNotificationCenter.current
我想在应用程序进入后台后,每隔 60 秒发送一次通知。但是当你进入后台时,通知会立即发送,之后每60秒发送一次通知。我不想立即发送通知,我该怎么做? 这是我的代码, func application(
我正在迁移到 NUUserNotification,但我遇到了问题,因为我正在使用较新的框架学习通知,但我不知道较旧的框架。我希望这不是重复的,因为我阅读了很多有关如何迁移的帖子和教程,但没有找到让我
您好,我有一个音频播放器应用程序,其中有一个计时器部分。目标是使音频在特定日期和时间开始/停止。我已经使用 UNUserNotificationCenter 实现了此功能。当应用程序位于前台时,此功能
我已经设置了用户通知。他们交付得很好,但应用程序图标上的角标(Badge)始终是一个。这是我的代码: let center = UNUserNotificationCenter.current() l
我基于提醒应用程序和EKEvent构建了一个简单的待办事项应用程序。 我没有设置EKAlert的截止日期,而是构建了自己的UNUserNotification,这主要是因为我想拥有自定义操作事件。 该
我有一个包含用户“警报”的 iOS 应用程序 - 当应用程序不在前台时发送给用户。我正在使用 UNUserNotifications,在 iOS 10 和 iOS 11 测试中一切正常。 我还想覆盖仍
在代码中我尝试这样做: import UserNotifications if #available(iOS 10.0, *) { let center = UNUserNotific
我正在开发 Apple Watch 应用程序,它具有在每 2 或 3 或 5 分钟后向用户显示通知的功能。 我已经通过 iOS UNUserNotification 实现了这个功能,并且效果很好。 但
我想在标签中显示角标(Badge)编号的值。 到目前为止,我已将所有内容都放在我的 viewWillAppear 中。因此每次加载 Controller 时都会分配变量。这是代码: var deliv
所以我有一个交互式推送通知,但它突然停止工作,这是我的代码: func pushNotification(){ let content = UNMutableNotificationConte
我一直在构建余数应用程序,在特定时间设置余数,无论是否有重复模式。 我一直在努力解决一个问题。任何帮助都有助于解决问题。 这是我面临的场景 当在没有重复模式的情况下创建剩余部分并且我正在删除剩余部分时
我已经在这里工作了几个小时,据说我的一切都按预期运行,但它没有调用我的 userNotificationCenter:(UNUserNotificationCenter *)center willPr
我是一名优秀的程序员,十分优秀!