本地通知在模拟器中工作,但在我的实际设备上测试时不起作用

Local Notifications are working in the simulator, but doesn't work when i test it on my actual device

我有一个计时器,它调用本地通知计时器的功能是设置秒数,它应该 运行 直到被按钮停止。

一切都在我的 viewcontroller.m 文件中。

这是我的代码:

-(void)Timer{
//num is a slider value
num1 = num*60.0;
self.ShowerTimer = [NSTimer scheduledTimerWithTimeInterval:num1
                                 target:self
                               selector:@selector(notification)
                               userInfo:nil
                                repeats:YES];


}

我应该关闭的通知。

-(void)notification{

//NSDate *alarmTime = [[NSDate date] dateByAddingTimeInterval:num];
UIApplication *app = [UIApplication sharedApplication];

UILocalNotification *notifyAlarm = [[UILocalNotification alloc] init];

// get current date/time
NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *currentTime = [dateFormatter stringFromDate:today];
//NSLog(@"User's current time in their preference format:%@",currentTime);

notifyAlarm.fireDate = [NSDate dateWithTimeIntervalSinceNow:0];
notifyAlarm.timeZone = [NSTimeZone defaultTimeZone];
notifyAlarm.repeatInterval = 0;
notifyAlarm.soundName = @"";
notifyAlarm.alertBody = [NSString stringWithFormat:@"Notified at %@",currentTime];
[app scheduleLocalNotification:notifyAlarm];
}

我的第一个建议 是在主循环中设置定时器。

没有属性:

dispatch_async(dispatch_get_main_queue(), ^{
   // Enclose your timer code here
   [NSTimer scheduledTimerWithTimeInterval:num1 target:self selector:@selector(notification) userInfo:nil repeats:YES];
});

如果你想保留你的 属性:

__weak MyViewController *aBlockSelf = self;

dispatch_async(dispatch_get_main_queue(), ^{
   // Enclose your timer code here
   aBlockSelf.showTimer = [NSTimer scheduledTimerWithTimeInterval:num1 target:self selector:@selector(notification) userInfo:nil repeats:YES];
});

其次, 你不需要像这里一样保留你的计时器的引用 --> self.ShowerTimer。这是因为 运行 Loop 保持对重复计时器的强引用。

第三, 您的变量命名约定已关闭。 ShowerTimer 应该命名为 showerTimer。虽然这与你的问题无关。

最后,您的代码看起来不错,如果通知在模拟器上运行,请检查您设备上的请勿打扰 设置。应该关闭本地通知才能显示。