Ios 尝试在10秒后使用后台任务检索粘贴板值

Ios 尝试在10秒后使用后台任务检索粘贴板值,ios,swift,uipasteboard,Ios,Swift,Uipasteboard,上下文:我的代码的目标是将文本复制到粘贴板上,如果文本没有被新值覆盖,则在10秒后将其清除。如果复制的新值不等于上一个值,则不应擦除粘贴板上的值。即使您将应用程序设置为后台并移动到其他应用程序,也必须运行此要求 实现:为了完成这个任务,我使用UIBackgroundTaskIdentifier、Timer和UIPasteboard 结果:该解决方案运行良好 结果物理测试设备iPhone 8 plus:当我没有离开创建后台任务的应用程序时,此实现可以工作,但是当我将应用程序设置为后台并移动到另一个

上下文:我的代码的目标是将文本复制到粘贴板上,如果文本没有被新值覆盖,则在10秒后将其清除。如果复制的新值不等于上一个值,则不应擦除粘贴板上的值。即使您将应用程序设置为后台并移动到其他应用程序,也必须运行此要求

实现:为了完成这个任务,我使用UIBackgroundTaskIdentifier、Timer和UIPasteboard

结果:该解决方案运行良好

结果物理测试设备iPhone 8 plus:当我没有离开创建后台任务的应用程序时,此实现可以工作,但是当我将应用程序设置为后台并移动到另一个应用程序,并且没有复制任何新内容时,计时器会激活,但UIPasteboard.general.hastrings返回false,当我认为它应该返回true时,因为复制的原始字符串应该仍然存在。是因为我用的是iPhone8 plus,而不是iPhone11吗?我是否正确访问粘贴板?我想做的是可能的吗

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
。这是我不理解的行为