我想知道是否可以在iOS中启动后台进程。在我的后台进程中,每隔30分钟应该调用一个函数,以便在我的数据库中检查是否有新消息等,以便发送通知。我不想实现推送通知。 我不知道在哪里实现此功能,以及是否存在覆盖功能,例如在AppDelegate中。
感谢您的帮助, 汉纳斯
答案 0 :(得分:4)
你想要的是"背景提取"并从iOS 7开始提供:
答案 1 :(得分:3)
是的,可以在iOS中启动后台进程。也可以每30分钟启动一次此过程。你需要设置两件事!您需要每30分钟向您的服务器发送一次无声推送(例如,在Parse中使用Cloud Code作业(警告!由于Parse将于2017年1月关闭,因此在此平台上并不聪明)
此静默推送会启动NSURLBackgroundSession,从服务器提取所需数据并对其进行处理。
Your need to activate this in the project settings
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()
}
}
下载任务成功完成后
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL)
{
}
将调用,您可以处理数据
let path = location.path
let data = NSFileManager.defaultManager().contentsAtPath(path!)
您也可以使用NSURLSessionDataTask
执行此操作答案 2 :(得分:0)
我建议你看一下Apple's documentation on Background Execution。它说明了在后台运行代码的所有可能方法。每种方法都有它的局限性,优点和缺点,还有Apple mentions:
在iOS中,只允许特定的应用类型在后台运行
如果您的iOS应用程序无法通过某些设备通过蓝牙(BTLE或MFi认证设备)进行通信(您可以将该蓝牙设备配置为每隔30分钟向iOS设备发送一些事件并在发生这种情况时执行您的代码),那么每30分钟运行一些代码的最可靠方法是使用静默推送通知 可以配置静默推送通知,以便它们不会向用户显示,但允许您的代码运行。推送通知的限制是用户需要有效的互联网连接才能接收它们,并且用户需要授予您的应用程序使用推送通知的权限(您可以在应用首次运行时请求此通知)。 我注意到你的问题提到我不想使用推送通知,但不幸的是你在这里没有选择。
答案 3 :(得分:0)
背景
在您的viewDidLoad()方法中
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
在您的ViewController中添加此方法
@objc func appMovedToBackground() {
print("App moved to background!")
}
对于Forground
override func viewDidLoad() {
super.viewDidLoad()
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToForground), name: UIApplication.willEnterForegroundNotification, object: nil)
}
@objc func appMovedToForground() {
print("App moved to forground!")
}