我是后台任务的新手。我有一个小作品,我正在获取推文,如果我的应用程序处于后台模式,那么它也应该提取推文,但我不知道如何。
我在Appdelegate didFinishLaunchOption方法中使用简单的Timer。当我关闭应用程序时,它无法正常工作。我是新手,所以请任何建议。以下是我的代码:
B
文字到语音也在那里但是当我关闭应用程序时它会停止说话。如果我不使用应用程序,那么它也可以获取推文,文本到语音应该使用后台模式。这有多长时间了?
答案 0 :(得分:9)
你需要做三件事:
在您的Info.plist中为密钥Required background modes
添加以下条目以允许后台网络访问:
Required background modes:
App downloads content from the network
在你的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 ) )
}
同样在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
}
仍有一些陷阱,例如没有保证的最大获取间隔,并且后台执行在XCode / Simulator中的行为可能与实际设备上的行为大不相同。
你可以看一下这个非常类似的主题:
答案 1 :(得分:8)
后台任务意味着您需要使用后台线程。 iOS中的线程太多,但如果你只想做后台任务,你应该使用两个线程;它们的结构是主线程和后台线程:
DispatchQueue.global(qos: .background).async {
//background code
DispatchQueue.main.async {
//your main thread
}
}
因此,您首先使用后台模式初始化全局队列。此线程可用于后台任务,然后您必须使用主线程(仅在您需要时)在后台任务完成时执行某些操作。这可以是一种选择。另一个选项应该是appDelegate中的applicationDidEnterBackground
,您只能将代码放在该方法中。