iOS中的本地通知,无需运行应用程序

问题描述:

我的应用程序需要在不同时间(不重复)每天有超过10个本地通知。根据iOS official docs,我只能安排64个通知。我已经尝试了this和其他网络上的其他文章,但没有找到可行的解决方案。iOS中的本地通知,无需运行应用程序

即使我的应用没有运行几天(或死亡),我是否可以在不同的时间安排本地通知?

+0

你可能需要使用服务器为您推送,而不是本地通知 – Paulw11

没有直接的方法做到这一点。

如果你想这样做(不适当的解决方案,只是一个补丁),然后只需要通过以下方式。

  • 唤醒应用程序在后台 - 这可以通过使用起始位置经理来完成,这将唤醒你的应用程序在后台时的位置得到更新,这时候你可以做任何你与本地通知或任何类似其他事情。

应用此方法之前 - 确保 - 这是太耗电的方式+不正确的方式。如果使用太多电池,您的应用可能会被苹果拒绝。

阅读以下资料(从其他的问题,从计算器复制):

应用程序可以通过一个显著的位置变化来唤醒,如果应用程序已表示要监视此类事件。

参见:[CLLocationManager文件] [1]

查找的方法称为startMonitoringSignificantLocationChanges。如果您的应用程序不在前台或根本没有运行时发生重大位置更改,则应用程序将在后台启动,允许应用程序执行仅后台操作(例如,不会运行视图代码)。

+0

背景获取可能比使用位置更好。对于位置,您需要获得用户权限,如果该应用程序实际上未使用位置信息,则该应用程序将被拒绝。 – Paulw11

+0

我也使用了后台抓取功能,但仍然没有成功 –

当你希望你的应用在后台工作时,即使它被杀死了,你也必须从你的项目能力中启用'背景模式',并在特定的时间通过它启动本地通知方法。

这里是一个小的代码片段,让您开始:

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背景模式。

Apple's Documentation

+0

这只会让你在应用程序终止前耗时3分钟 – Paulw11

+0

不可以。根据Apple文档,它取决于您想要在后台执行什么样的任务,要么播放音频,下载内容,要么运行有限长度的任务。这会在启用“背景模式”时在Info.plist中添加特殊权利。所以它有点标志着这些应用程序将使用这个独特的功能(即使他们被杀死),所以操作系统将更宽松的内存消耗,并不会暂停它:) –

+0

是的,你可以使用这些后台任务获得重新启动,但你只有几秒钟。使用'beginBackgroundTaskWithExpirationHandler'可以给你更多的时间,但最多只需要3分钟。如果你在调试器下测试,那么3分钟后你的应用程序不会被杀死('backgroundTimeRemaining'只会继续报告0),但如果你正常运行,没有连接到Xcode,那么应用程序将被杀死超过允许的背景时间。 – Paulw11