应用程序处于后台时的iOS通知

我想知道是否可以在iOS中启动后台进程。 在我的后台进程每隔30分钟就应该调用一个函数,以便在我的数据库中检查是否有新消息等,以便发送通知。 我不想实现推送通知。 我不知道在哪里实现此function,以及是否存在覆盖function,例如在AppDelegate中。

谢谢你的帮助,汉娜

您想要的是“背景提取”,从iOS 7开始提供:

https://www.objc.io/issues/5-ios7/multitasking/

是的,可以在iOS中启动后台进程。 也可以每30分钟启动一次此过程。 你需要设置两件事! 您需要每隔30分钟向您的服务器发送一次静默推送。(例如,在Parse中使用Cloud Code作业(警告!由于Parse将于2017年1月关闭,因此在此平台上并不聪明)

此静默推送启动NSURLBackgroundSession,从服务器提取所需数据并对其进行处理。

您需要在项目设置中激活它

1.)在AppDelgate中添加此项以接收推送

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { application.registerForRemoteNotifications() } 

当您从服务器或其他东西推送时,将调用以下委托方法:(因此在appDelegate中也添加此项)

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { NSLog("Silent Push recevied") let vc = ViewController() vc.pullData() // call your pullData method... } 

现在调用的方法需要从数据库中提取数据。 在这种情况下,您可以使用NSURLSession下载所需的任何内容。

2.)转到处理数据的ViewController并添加:NSURLSessionDownloadDelegate委托以及所需的委托方法

 class vc : ViewController, NSURLSessionDownloadDelegate{ func viewDidLoad() { super.viewDidLoad() } func pullData() { let url = NSURL(string: "http://example.com")! let urlRequest = NSURLRequest(URL: url, cachePolicy: .UseProtocolCachePolicy, timeoutInterval: 5) let backgroundSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("backgroundSessionIDX") backgroundSession = NSURLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) let task = backgroundSession.downloadTaskWithRequest(urlRequest) task.resume() } } 

当downloadTask成功完成时

 func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) { } 

将被调用,您可以处理数据

 let path = location.path let data = NSFileManager.defaultManager().contentsAtPath(path!) 

您也可以使用NSURLSessionDataTask执行此操作

我建议您查看Apple有关后台执行的文档 。 它说明了在后台运行代码的所有可能方法。 每种方法都有它的局限性,优点和缺点, Apple还提到 :

在iOS中,只允许在后台运行特定的应用类型

如果您的iOS应用程序无法通过蓝牙(BTLE或MFi认证设备)与某些设备进行通信(您可以将该蓝牙设备配置为每隔30分钟向iOS设备发送一些事件并在发生这种情况时执行您的代码),那么最多每30分钟运行一些代码的可靠方法是使用静默推送通知。
可以配置静默推送通知,以便它们不会向用户显示,但允许您的代码运行。 推送通知的限制是用户需要有效的Internet连接才能接收它们,并且用户需要授予您的应用程序使用推送通知的权限(您可以在应用程序首次运行时请求此操作)。
我注意到你的问题提到我不想使用推送通知 ,但不幸的是你在这里没有选择。