Ios 尝试在10秒后使用后台任务检索粘贴板值
上下文:我的代码的目标是将文本复制到粘贴板上,如果文本没有被新值覆盖,则在10秒后将其清除。如果复制的新值不等于上一个值,则不应擦除粘贴板上的值。即使您将应用程序设置为后台并移动到其他应用程序,也必须运行此要求 实现:为了完成这个任务,我使用UIBackgroundTaskIdentifier、Timer和UIPasteboard 结果:该解决方案运行良好 结果物理测试设备iPhone 8 plus:当我没有离开创建后台任务的应用程序时,此实现可以工作,但是当我将应用程序设置为后台并移动到另一个应用程序,并且没有复制任何新内容时,计时器会激活,但UIPasteboard.general.hastrings返回false,当我认为它应该返回true时,因为复制的原始字符串应该仍然存在。是因为我用的是iPhone8 plus,而不是iPhone11吗?我是否正确访问粘贴板?我想做的是可能的吗Ios 尝试在10秒后使用后台任务检索粘贴板值,ios,swift,uipasteboard,Ios,Swift,Uipasteboard,上下文:我的代码的目标是将文本复制到粘贴板上,如果文本没有被新值覆盖,则在10秒后将其清除。如果复制的新值不等于上一个值,则不应擦除粘贴板上的值。即使您将应用程序设置为后台并移动到其他应用程序,也必须运行此要求 实现:为了完成这个任务,我使用UIBackgroundTaskIdentifier、Timer和UIPasteboard 结果:该解决方案运行良好 结果物理测试设备iPhone 8 plus:当我没有离开创建后台任务的应用程序时,此实现可以工作,但是当我将应用程序设置为后台并移动到另一个
import UIKit
class TimerViewController: UIViewController {
private var backgroundTaskTimer: Timer?
private var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier.invalid
@IBOutlet weak var copiedLabel: UILabel!
func didCopyText(_ text: String) {
UIPasteboard.general.string = text
}
func clearTextAfterDelay(_ originalCopiedText: String) {
backgroundTask = UIApplication.shared.beginBackgroundTask { [unowned self] in
//end background task
UIApplication.shared.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskIdentifier.invalid
}
backgroundTaskTimer?.invalidate()
backgroundTaskTimer = Timer.scheduledTimer(withTimeInterval: 10, repeats: false) { [unowned self] _ in
if UIPasteboard.general.hasStrings {
let currentTextOnClipBoard = UIPasteboard.general.string
if currentTextOnClipBoard == originalCopiedText {
UIPasteboard.general.string = ""
}
}
//end background task
UIApplication.shared.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskIdentifier.invalid
}
}
@IBAction func copiedTapped(_ sender: Any) {
copiedLabel.isHidden = false
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.copiedLabel.isHidden = true
}
let text = "HelloWorld"
didCopyText(text)
clearTextAfterDelay(text)
}
}
在与苹果的技术支持人员交谈后,他们给了我以下解释: “出于安全原因,我们故意阻止后台运行的应用程序访问系统粘贴板,因此在您的情况下,UIPasteboard.general.hastrings会返回false” 相反,他们建议使用带有过期日期的setItems方法
import CoreServices
UIPasteboard.general.setItems([[kUTTypeUTF8PlainText as String: text]], options: [.expirationDate : Date(timeIntervalSinceNow: 10)])
首先检查
UIPasteboard.general.hastrings
。。。如果true
则获取字符串并进行比较。UIPasteboard.general.hastrings
在后台返回false
,在我不离开应用程序时返回true
。这是我不理解的行为