我构建了一个应用程序,我想进行每日检查,看看用户需要采取什么行动。所以我的第一个想法是支持后台模式,但后来我没有在功能选项卡中找到我的选项。
所以我决定选择background fetch
,在AppDelegate func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
中实现此方法并使用它运行。但我不确定这是否是正确的做法?
我的所有应用都可以离线工作,因此我想查看一些Realm数据,然后发送相应的消息。我该怎么做?我希望它在用户关闭应用程序时仍能正常工作。
答案 0 :(得分:0)
首先,当你需要你的应用程序在后台处理某些事情时(即使设备被锁定,在后台获取用户的位置),我相信这种方法有点复杂。
检查我对这个问题的回答:Will Realm still be able to save the data while user has locked iPhone?
我在那里提到了我用于生产级项目的示例项目(作为库)。
项目的能力?
本地通知
即使在后台获取用户位置
即使在后台发送用户数据到服务器
使用Core Data将数据存储到本地,甚至在后台再次存储。
附加说明,不确定您是否已经知道这一点(导致几乎所有iPhone用户都知道这一点),如果应用程序已打开并正在使用,则无法看到本地通知。
编辑(样本):
安排支持iOS 9的本地通知的功能
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)
}
}
}
}
答案 1 :(得分:0)
您还可以在此处查看有关后台任务的Apple文档:
远程通知似乎与你需要的东西特别相关,祝你好运!