当前位置: 首页 > 面试题库 >

在iOS的特定时间启动本地通知

花稳
2023-03-14
问题内容

我正在尝试创建一个计时器,该计时器在用户设置好时间后触发本地通知。我遇到的问题是我无法找出一种方法来设置本地通知在晚上7:00发出。研究此问题时发现的几乎所有方法都涉及从当前日期起在一定时间范围内关闭本地通知。我试图允许用户选择7:00
PM,然后在该时间关闭通知。从逻辑上讲,这可以通过设置最终时间(用户选择的值)-当前时间来实现,这将为您带来时差。但是,我不确定如何执行此操作。

非常感谢您对本主题的任何帮助。以下是我当前用于触发本地通知的代码

let center = UNUserNotificationCenter.current()

content.title = storedMessage
content.body = "Drag down to reset or disable alarm"
content.categoryIdentifier = "alarm"
content.userInfo = ["customData": "fizzbuzz"]
content.sound = UNNotificationSound.init(named: "1.mp3")
content.badge = 1

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: timeAmount, repeats: false)
let request = UNNotificationRequest(identifier: "requestAlarm", content: content, trigger: trigger)
    center.add(request)


center.delegate = self

问题答案:

在iOS 10中,Apple已弃用UILocalNotification,这意味着该是时候熟悉一个新的通知框架了。

设置这是一篇很长的文章,所以让我们通过导入新的通知框架来轻松开始:

// Swift
import UserNotifications

// Objective-C (with modules enabled)
@import UserNotifications;

您可以通过共享的UNUserNotificationCenter对象管理通知:

// Swift
let center = UNUserNotificationCenter.current()

// Objective-C
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

授权与旧的通知框架一样,您需要获得用户对您的应用将使用的通知类型的许可。在您的应用生命周期中尽早发出请求,例如在
application:didFinishLaunchingWithOptions:中。
您的应用首次请求授权时,系统会向用户显示警报,然后他们可以通过设置管理权限:

// Swift
let options: UNAuthorizationOptions = [.alert, .sound];

// Objective-C
UNAuthorizationOptions options = UNAuthorizationOptionAlert + UNAuthorizationOptionSound;

您可以使用共享的通知中心发出实际的授权请求:

// Swift
center.requestAuthorization(options: options) { (granted, error) in
    if !granted {
        print("Something went wrong")
    }
}

// Objective-C
[center requestAuthorizationWithOptions:options
completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted) {
NSLog(@"Something went wrong");
}
}];

框架使用一个布尔值(称为布尔值)来调用完成处理程序,该布尔值指示是否已授予访问权限,如果错误未发生,则该错误对象将为nil。

注意:用户可以随时更改您的应用的通知设置。您可以使用getNotificationSettings检查允许的设置。这将与UNNotificationSettings对象异步调用完成块,可用于检查授权状态或各个通知设置:

 // Swift
 center.getNotificationSettings { (settings) in
     if settings.authorizationStatus != .authorized {
         // Notifications not allowed
     }
 }

 // Objective-C
 [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
 if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
// Notifications not allowed
 }
 }];

创建通知请求UNNotificationRequest通知请求包含内容和触发条件:

通知内容

通知的内容是UNMutableNotificationContent的实例,并根据需要设置以下属性:

title:包含警报的主要原因的字符串。

字幕:包含警报字幕的字符串(如果需要)

正文:包含警报消息文本的字符串

徽章:显示在应用程序图标上的数字。

声音:警报发出时播放的声音。使用UNNotificationSound.default()或从文件创建自定义声音。launchImageName:如果启动您的应用程序以响应通知,则使用的启动图像的名称。

userInfo:传入通知附件的自定义信息字典:UNNotificationAttachment对象数组。用于包含音频,图像或视频内容。

请注意,在对警报字符串(如标题)进行本地化时,最好使用localizedUserNotificationString(forKey:arguments
:),这会延迟加载本地化,直到传递通知为止。

一个简单的例子:

 // Swift
 let content = UNMutableNotificationContent()
 content.title = "Don"t forget"
 content.body = "Buy some milk"
 content.sound = UNNotificationSound.default()

 // Objective-C
 UNMutableNotificationContent *content = [UNMutableNotificationContent new];
 content.title = @"Don't forget";
 content.body = @"Buy some milk";
 content.sound = [UNNotificationSound defaultSound];

通知触发

根据时间,日历或位置触发通知。触发器可以重复:

时间间隔:将通知安排在几秒钟后。例如要在五分钟内触发:

 // Swift
 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 300, repeats: false)

 // Objective-C
 UNTimeIntervalNotificationTrigger *trigger =     [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:300
                              repeats:NO];

日历:在特定的日期和时间触发。触发器是使用日期组件对象创建的,该对象使某些重复间隔变得更容易。要将日期转换为其日期成分,请使用当前日历。例如:

 // Swift
 let date = Date(timeIntervalSinceNow: 3600)
 let triggerDate = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)

 // Objective-C
 NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3600];
 NSDateComponents *triggerDate = [[NSCalendar currentCalendar]   
          components:NSCalendarUnitYear +
          NSCalendarUnitMonth + NSCalendarUnitDay +
          NSCalendarUnitHour + NSCalendarUnitMinute +
          NSCalendarUnitSecond fromDate:date];

要从日期组件创建触发器:

 // Swift
 let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false)

 // Objective-C
 UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:triggerDate
                                     repeats:NO];

若要创建以一定间隔重复的触发器,请使用正确的日期组件集。例如,要使通知每天重复一次,我们只需要小时,分钟和秒:

 let triggerDaily = Calendar.current.dateComponents([hour, .minute, .second], from: date)
 let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)

为了使它每周一次重复,我们还需要一个工作日:

 let triggerWeekly = Calendar.current.dateComponents([.weekday, .hour, .minute, .second], from: date)
 let trigger = UNCalendarNotificationTrigger(dateMatching: triggerWeekly, repeats: true)

排程

在内容和触发器都准备就绪的情况下,我们创建一个新的通知请求并将其添加到通知中心。每个通知请求都需要一个字符串标识符以供将来参考:

 // Swift
 let identifier = "UYLLocalNotification"
 let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

 center.add(request, withCompletionHandler: { (error) in
     if let error = error {
         // Something went wrong
     }
 })

 // Objective-C
 NSString *identifier = @"UYLLocalNotification";
 UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier
                              content:content trigger:trigger]

 [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"Something went wrong: %@",error);
  }
  }];


 类似资料:
  • 问题内容: 我正在创建我的第一个应用程序,该应用程序允许用户自己设置警报,然后该应用程序将在设置的时间向用户发送本地通知。我现在遇到的问题是能够在一周的特定日期(例如,仅每个星期一和星期二)触发本地通知。到目前为止,我遇到的所有教程/问题(如本教程)都只是关于每天/每周安排通知。我想要达到的理想结果有点像iPhone的内置警报系统,您可以将警报设置为仅在一周的某些天触发。 如果我不能只设置字段,有

  • 问题内容: 我知道这个问题以前曾被问过,但我已不知所措。 我有一个警报管理器来设置通知: …然后我得到了通知本身即服务: } ....我加入了吐司,以确保我确实要使用此方法。敬酒,但通知没有。我在这里做错了什么?我需要更改清单文件中的内容吗? 问题答案: 没有图标(或标题是?)的通知将不起作用。 我确信我遇到了同样的问题,因为如果您忽略了通知的内容之一,则通知将不会显示。

  • 我得到了这个错误,当我试图使用比特桶构建状态通知插件(https://wiki.jenkins.io/display/JENKINS/Bitbucket云构建状态通知插件)在Jenkins CI.我遵循了这个教程:https://www.youtube.com/watch?v=uu5XcU4EPzQ但我不知道问题出在哪里。

  • 问题内容: 我是iOS开发的新手,但是已经创建了该应用程序,并且我试图在设定的时间创建每日通知。当前,通知针对给定的日期/时间执行一次。我不确定如何使用repeatInterval方法每天进行调度。每天重复通知的最佳方法是什么?任何帮助将不胜感激(是)。 问题答案: 您必须提供NSCalendarUnit值(例如“ HourCalendarUnit”或“ DayCalendarUnit”)以重复通

  • 我正在使用Cordova开发一个跨平台的移动应用程序,主要集中在开发阶段的iOS上。 对于我的开发过程,如果我可以直接从命令行启动Cordova应用程序并将其加载到指定的模拟器中,那将是一个理想的选择。我可以通过从项目根目录运行以下命令来完成此操作: 这工作正常,并导致一个iOS模拟器运行我的应用程序在模拟iPhone 4 Retina与iOS7.0.3 除了这个模拟设备,我还想在(例如)iPad

  • 问题内容: 我有这段代码,它每天早上7点运行一个通知,它获取当前日期,然后在到达设定的时间时运行该通知,我的问题是,如果时间已经超过了设定的运行时间,那么它将每天在用户当前时间不是我早上7点的时间,这是我的代码 如您所见,它每天早上7点运行。我不知道,即使时间是早上7点以后,通知在第二天仍将继续运行,将不胜感激 问题答案: 更新了@ Paulw11对Swift 3.0的回答,并包装在一个函数中: