【问题标题】:Local Notifications in iOS without running the appiOS 中的本地通知,无需运行应用程序
【发布时间】:2016-08-04 13:34:06
【问题描述】:

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

即使我的应用程序几天没有运行(或被终止),我有什么办法可以在不同时间安排本地通知?

【问题讨论】:

  • 您可能需要使用服务器进行推送而不是本地通知

标签: ios swift


【解决方案1】:

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

如果你无论如何都想这样做(不是正确的解决方案,只是一个补丁),那么只需按照以下方式进行。

  • 在后台唤醒应用程序 - 这可以通过使用启动位置管理器来完成,当位置更新时,它将在后台唤醒您的应用程序,此时您可以通过本地通知或任何其他事情做任何您喜欢的事情。

在应用此方法之前 - 请确保 - 这是过多的电池消耗方式 + 不正确的方式。如果您的应用耗电量过多,它可能会被 Apple 拒绝。

阅读以下详细信息(从stackoverflow的其他问题复制):

如果应用表明它想要监控此类事件,则应用可能会因位置发生重大变化而被唤醒。

请参阅:[CLLocationManager 文档][1]

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

【讨论】:

  • 后台获取可能比使用位置更好。对于位置,您需要获得用户许可,如果该应用实际上不使用位置,则会被拒绝。
  • 我也使用过后台抓取,但还是没有成功
【解决方案2】:

如果您希望应用在后台运行,即使它被杀死,您必须从项目的功能中启用“后台模式”,并在特定时间触发本地通知方法。

这里有一段小代码 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 中的背景模式。

Apple's Documentation

【讨论】:

  • 这只会给你 3 分钟后应用程序将被终止
  • 不。根据 Apple 文档,这取决于您想要在后台执行哪种任务,您想要播放音频、下载内容还是运行有限长度的任务。当您启用“后台模式”时,这会在您的 Info.plist 中添加特殊权利。所以它有点标志着这些应用程序将使用这个专有功能(即使它们被杀死),所以操作系统将对其内存消耗更加宽容并且不会暂停它:)
  • 是的,您可以使用这些后台任务重新启动,但您只有几秒钟的时间。使用beginBackgroundTaskWithExpirationHandler 可以为您提供更多时间,但最多只有 3 分钟。如果您在调试器下测试,那么您的应用程序不会在 3 分钟后被终止(backgroundTimeRemaining 将继续报告 0)但如果您正常运行,未连接到 Xcode,那么应用程序将被终止如果它超过允许的后台时间。
  • 请参阅文档developer.apple.com/library/ios/documentation/UIKit/Reference/…:另请注意“您不应使用此方法只是为了让您的应用在移至后台后继续运行”
  • 我的问题是,即使用户在使用一次后没有打开应用程序,我也想安排通知,我认为后台任务不会解决我的问题。我已经使用后台获取但仍然没有成功。我可以使用后台定位服务,但它会消耗电池并且也是一种不好的做法,如果我错了,请纠正我,因为我在 2 个月前才开始 iOS 开发
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多