2016-08-01 125 views
9

我在文档目录中有一个填充了字符串数据的JSON文件。在应用程序的用户界面中有一个UIButton。在按钮按下时,一个新的字符串附加到JSON文件中。如何在iOS应用程序处于前台时在后台运行操作

现在我正在寻找任何帮助我使用swift将这些字符串(从JSON文件)发送到服务器的iOS服务。这个服务应该完全独立于我的代码。 重点是当我按UIButton时,第一步是将字符串保存到JSON文件,然后服务应该把这个字符串并发送到服务器,如果Internet可用。

当一个字符串发送成功时,它应该从JSON文件中删除。 如果有任何字符串保存到JSON文件中,则该服务应在每30秒后跟踪一次,然后将其发送到服务器。

我谷歌搜索到并找到background fetch但它自动触发performFetchWithCompletionHandler函数,我不知道什么时候iOS触发它。我想在每30秒后触发这种自我服务。

+0

您是否为您的要求找到了一些解决方案?谢谢! – jcasadellaoller

+1

如何/为什么它会独立于您的应用程序? – Wain

+2

如果您正在寻找守护进程/服务,那么您运气不佳,iOS不支持无限期运行的自定义应用程序。 – Cristik

回答

10

查看苹果iOS应用程序编程指南中的Background Execution部分。

UIApplication提供了一个界面来开始和结束后台任务UIBackgroundTaskIdentifier

在你AppDelegate的顶层,创建一个类级别的任务标识符:

var backgroundTask = UIBackgroundTaskInvalid 

现在,创建要完成操作你的任务,并实现您的任务没有错误的情况下完成之前它已过期:

backgroundTask = application.beginBackgroundTaskWithName("MyBackgroundTask") { 
    // This expirationHandler is called when your task expired 
    // Cleanup the task here, remove objects from memory, etc 

    application.endBackgroundTask(self.backgroundTask) 
    self.backgroundTask = UIBackgroundTaskInvalid 
} 

// Implement the operation of your task as background task 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
    // Begin your upload and clean up JSON 
    // NSURLSession, AlamoFire, etc 

    // On completion, end your task 
    application.endBackgroundTask(self.backgroundTask) 
    self.backgroundTask = UIBackgroundTaskInvalid 
} 
+1

请注意,如果应用在工作完成之前不会后退,则会在前台执行。 – Cristik

+0

伟大的一点@Cristik。我认为这是由于苹果的限制,OP所要求的解决方案。 – JAL

+0

感谢朋友,我已经通过您提供的相同方法解决了我的问题。 – user3314286

0

请参阅NSURLSessionUploadTask可能它会帮助你。

2

我所做的只是使用了上面JAL讨论的方法。

这些都是我用

func reinstateBackgroundTask() { 
     if updateTimer != nil && (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 
    } 

其中updateTimer类型为NSTIMER类 上述功能在自己创建的类名为“syncService” 这个类有一个初始化器是

的三种方法
init(){ 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.reinstateBackgroundTask), name: UIApplicationDidBecomeActiveNotification, object: nil) 

     updateTimer = NSTimer.scheduledTimerWithTimeInterval(30.0, target: self, selector: #selector(self.syncAudit), userInfo: nil, repeats: true) 
     registerBackgroundTask() 

} 

然后我只是打电话给这个班,整个问题就解决了。

0
DispatchQueue.global(qos: .background).async { // sends registration to background queue 

} 
相关问题