【发布时间】:2016-08-04 13:34:06
【问题描述】:
我的应用程序每天需要在不同时间(不重复)有超过 10 个本地通知。根据iOS official docs,我只能安排 64 条通知。我尝试了this 和网络上其他几篇文章的解决方案,但没有找到可行的解决方案。
即使我的应用程序几天没有运行(或被终止),我有什么办法可以在不同时间安排本地通知?
【问题讨论】:
-
您可能需要使用服务器进行推送而不是本地通知
我的应用程序每天需要在不同时间(不重复)有超过 10 个本地通知。根据iOS official docs,我只能安排 64 条通知。我尝试了this 和网络上其他几篇文章的解决方案,但没有找到可行的解决方案。
即使我的应用程序几天没有运行(或被终止),我有什么办法可以在不同时间安排本地通知?
【问题讨论】:
没有直接的方法可以做到这一点。
如果你无论如何都想这样做(不是正确的解决方案,只是一个补丁),那么只需按照以下方式进行。
在应用此方法之前 - 请确保 - 这是过多的电池消耗方式 + 不正确的方式。如果您的应用耗电量过多,它可能会被 Apple 拒绝。
阅读以下详细信息(从stackoverflow的其他问题复制):
如果应用表明它想要监控此类事件,则应用可能会因位置发生重大变化而被唤醒。
请参阅:[CLLocationManager 文档][1]
查找名为startMonitoringSignificantLocationChanges 的方法。如果在您的应用程序不在前台或根本没有运行时发生重大位置更改,您的应用程序将在后台启动,允许应用程序执行仅后台操作(例如,不会运行任何视图代码)。
【讨论】:
如果您希望应用在后台运行,即使它被杀死,您必须从项目的功能中启用“后台模式”,并在特定时间触发本地通知方法。
这里有一段小代码 sn-p 可以帮助您入门:
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
override public func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.reinstateBackgroundTask), name: UIApplicationDidBecomeActiveNotification, object: nil)
}
//MARK: Background Task / Local Notifications / Checkin
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func reinstateBackgroundTask() {
if backgroundTask == UIBackgroundTaskInvalid {
registerBackgroundTask()
}
}
func registerBackgroundTask() {
backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler {
[unowned self] in
self.endBackgroundTask()
}
assert(backgroundTask != UIBackgroundTaskInvalid)
}
func endBackgroundTask() {
NSLog("Background task ended.")
UIApplication.sharedApplication().endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
func dosomething() {
registerBackgroundTask()
//Fire Local Notifications accordingly…
//Use NSTimer if you want it with specific time intervals
}
看看这个精彩的 Raywenderlich Tutorial 关于 iOS 中的背景模式。
【讨论】:
beginBackgroundTaskWithExpirationHandler 可以为您提供更多时间,但最多只有 3 分钟。如果您在调试器下测试,那么您的应用程序不会在 3 分钟后被终止(backgroundTimeRemaining 将继续报告 0)但如果您正常运行,未连接到 Xcode,那么应用程序将被终止如果它超过允许的后台时间。