iOS 发送本地通知
iOS sending a local notification
我构建了一个应用程序,我想 运行 每天检查一次,看看用户需要执行哪些操作。所以我的第一个想法是支持后台模式,但后来我并没有真正在功能选项卡中找到我的选项。
所以我决定使用 background fetch
,在 AppDelegate func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
和 运行 中实现这个方法。但我不确定这样做是否正确?
我的所有应用程序都可以离线运行,所以我想检查一些 Realm 数据,然后发送适当的消息。我该怎么做?我希望它在用户关闭应用程序时仍然有效。
首先,当您需要您的应用程序在后台处理某些内容时(即即使设备已锁定,也可以在后台获取用户的位置),我认为这种方法有点复杂。
查看我对这个问题的回答:Will Realm still be able to save the data while user has locked iPhone?
我在那里提到了我用于生产级项目的示例项目(作为库)。
项目的能力?
本地通知
甚至在后台获取用户位置
甚至在后台向服务器发送用户数据
使用 Core Data 将数据存储到本地,甚至在后台再次存储。
补充说明,不确定你是否已经知道这一点(因为几乎所有 iPhone 用户都知道这一点),如果应用程序打开并正在使用,则不会看到本地通知。
编辑(示例):
调度本地通知功能支持iOS9
private func setUpLocalNotification(hour: Int, minute: Int) {
// have to use NSCalendar for the components
let calendar = NSCalendar(identifier: .gregorian)!;
var dateFire = Date()
var fireComponents = calendar.components(
[NSCalendar.Unit.day,
NSCalendar.Unit.month,
NSCalendar.Unit.year,
NSCalendar.Unit.hour,
NSCalendar.Unit.minute],
from:dateFire)
// if today's date is passed, use tomorrow
if (fireComponents.hour! > hour || (fireComponents.hour == hour && fireComponents.minute! >= minute) ) {
dateFire = dateFire.addingTimeInterval(86400) // Use tomorrow's date
fireComponents = calendar.components(
[NSCalendar.Unit.day,
NSCalendar.Unit.month,
NSCalendar.Unit.year,
NSCalendar.Unit.hour,
NSCalendar.Unit.minute],
from:dateFire);
}
// set up the time
fireComponents.hour = hour
fireComponents.minute = minute
// schedule local notification
dateFire = calendar.date(from: fireComponents)!
let localNotification = UILocalNotification()
localNotification.fireDate = dateFire
localNotification.alertBody = notificationMessage
localNotification.repeatInterval = .weekOfYear
localNotification.soundName = UILocalNotificationDefaultSoundName
localNotification.category = category.rawValue
UIApplication.shared.scheduleLocalNotification(localNotification)
}
正在取消安排本地通知示例
这其实很简单。
// Loop through the schedule local notifications and cancel out if there's a weekend
if let scheduledLocalNotifications = UIApplication.shared.scheduledLocalNotifications {
for localNotification in scheduledLocalNotifications {
if let fireDate = localNotification.fireDate {
if fireDate.isWeekend() { UIApplication.shared.cancelLocalNotification(localNotification)
}
}
}
}
您还可以在此处查看有关后台任务的 Apple 文档:
远程通知似乎与您的需要特别相关,祝您好运!
我构建了一个应用程序,我想 运行 每天检查一次,看看用户需要执行哪些操作。所以我的第一个想法是支持后台模式,但后来我并没有真正在功能选项卡中找到我的选项。
所以我决定使用 background fetch
,在 AppDelegate func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
和 运行 中实现这个方法。但我不确定这样做是否正确?
我的所有应用程序都可以离线运行,所以我想检查一些 Realm 数据,然后发送适当的消息。我该怎么做?我希望它在用户关闭应用程序时仍然有效。
首先,当您需要您的应用程序在后台处理某些内容时(即即使设备已锁定,也可以在后台获取用户的位置),我认为这种方法有点复杂。
查看我对这个问题的回答:Will Realm still be able to save the data while user has locked iPhone?
我在那里提到了我用于生产级项目的示例项目(作为库)。
项目的能力?
本地通知
甚至在后台获取用户位置
甚至在后台向服务器发送用户数据
使用 Core Data 将数据存储到本地,甚至在后台再次存储。
补充说明,不确定你是否已经知道这一点(因为几乎所有 iPhone 用户都知道这一点),如果应用程序打开并正在使用,则不会看到本地通知。
编辑(示例):
调度本地通知功能支持iOS9
private func setUpLocalNotification(hour: Int, minute: Int) {
// have to use NSCalendar for the components
let calendar = NSCalendar(identifier: .gregorian)!;
var dateFire = Date()
var fireComponents = calendar.components(
[NSCalendar.Unit.day,
NSCalendar.Unit.month,
NSCalendar.Unit.year,
NSCalendar.Unit.hour,
NSCalendar.Unit.minute],
from:dateFire)
// if today's date is passed, use tomorrow
if (fireComponents.hour! > hour || (fireComponents.hour == hour && fireComponents.minute! >= minute) ) {
dateFire = dateFire.addingTimeInterval(86400) // Use tomorrow's date
fireComponents = calendar.components(
[NSCalendar.Unit.day,
NSCalendar.Unit.month,
NSCalendar.Unit.year,
NSCalendar.Unit.hour,
NSCalendar.Unit.minute],
from:dateFire);
}
// set up the time
fireComponents.hour = hour
fireComponents.minute = minute
// schedule local notification
dateFire = calendar.date(from: fireComponents)!
let localNotification = UILocalNotification()
localNotification.fireDate = dateFire
localNotification.alertBody = notificationMessage
localNotification.repeatInterval = .weekOfYear
localNotification.soundName = UILocalNotificationDefaultSoundName
localNotification.category = category.rawValue
UIApplication.shared.scheduleLocalNotification(localNotification)
}
正在取消安排本地通知示例
这其实很简单。
// Loop through the schedule local notifications and cancel out if there's a weekend
if let scheduledLocalNotifications = UIApplication.shared.scheduledLocalNotifications {
for localNotification in scheduledLocalNotifications {
if let fireDate = localNotification.fireDate {
if fireDate.isWeekend() { UIApplication.shared.cancelLocalNotification(localNotification)
}
}
}
}
您还可以在此处查看有关后台任务的 Apple 文档:
远程通知似乎与您的需要特别相关,祝您好运!