如何使用Swift 3使用后台任务?

时间:2017-07-19 13:41:11

标签: ios swift background background-process tweets

我是后台任务的新手。我有一个小作品,我正在获取推文,如果我的应用程序处于后台模式,那么它也应该提取推文,但我不知道如何。

我在Appdelegate didFinishLaunchOption方法中使用简单的Timer。当我关闭应用程序时,它无法正常工作。我是新手,所以请任何建议。以下是我的代码:

B

文字到语音也在那里但是当我关闭应用程序时它会停止说话。如果我不使用应用程序,那么它也可以获取推文,文本到语音应该使用后台模式。这有多长时间了?

2 个答案:

答案 0 :(得分:9)

你需要做三件事:

  1. 在您的Info.plist中为密钥Required background modes添加以下条目以允许后台网络访问:

    Required background modes: App downloads content from the network

  2. 在你的AppDelegate中添加你的applicationDidEnterBackground():

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Fetch no sooner than every (60) seconds which is thrillingly short actually. 
        // Defaults to Infinite if not set. 
        UIApplication.shared.setMinimumBackgroundFetchInterval( 60 ) )
    }
    
  3. 同样在AppDelegate工具

    func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
      var fetchResult: UIBackgroundFetchResult!
    
    
      if doingYourStuffActuallyCreatesNetworkTraffic() {
        fetchResult = UIBackgroundFetchResult.newData
      } else if thereWasAnError() { 
        fetchResult = UIBackgroundFetchResult.failed
      } else {
        fetchResult = UIBackgroundFetchResult.noData
      }           
      completionHandler( fetchResult )
    
      return    
    }
    
  4. 仍有一些陷阱,例如没有保证的最大获取间隔,并且后台执行在XCode / Simulator中的行为可能与实际设备上的行为大不相同。

    你可以看一下这个非常类似的主题:

    performFetchWithCompletionHandler never gets fired

    当然 https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

答案 1 :(得分:8)

后台任务意味着您需要使用后台线程。 iOS中的线程太多,但如果你只想做后台任务,你应该使用两个线程;它们的结构是主线程和后台线程:

DispatchQueue.global(qos: .background).async {
    //background code
    DispatchQueue.main.async {
        //your main thread
    }    
}

因此,您首先使用后台模式初始化全局队列。此线程可用于后台任务,然后您必须使用主线程(仅在您需要时)在后台任务完成时执行某些操作。这可以是一种选择。另一个选项应该是appDelegate中的applicationDidEnterBackground,您只能将代码放在该方法中。