Могу ли я запретить UIPasteboard использовать Handoff для копирования текста с другого устройства?

У меня есть приложение для iOS, которое просматривает содержимое монтажной панели и пытается с ней что-то сделать (надеюсь) с умом. (Приложение требует iOS 9.3+, хотя на данный момент я думаю, что большинство людей используют iOS 11.x.)

Проблема в том, что мое устройство (iPhone X) всегда копирует данные с моего MacBook Pro. Например, я могу выбрать и скопировать текст на моем MacBook, поместив его в монтажный стол. Затем на моем iPhone я могу выбрать и скопировать текст, такой как адрес электронной почты, поместив его на монтажную панель. Но затем, когда я запускаю свое приложение и пытаюсь получить доступ к монтажной панели, это занимает несколько секунд, а затем использует текст из моего MacBook!

Это особенно раздражает, потому что это вызывает задержку при передаче данных по сети, что делает мой пользовательский интерфейс безразличным. Я бы предпочел просто иметь [UIPasteboard -hasStrings] метод возврата сразу.

Я знаю, что я могу использовать setItems:options: со значением опции UIPasteboardOptionLocalOnly при добавлении элементов, чтобы эти элементы оставались на устройстве и не передавались на MacBook. Но эта опция не препятствует автоматическому извлечению данных из MacBook.

Есть ли способ предотвратить hasStrings от автоматического извлечения данных с удаленного ноутбука, без полного отключения этой функции на устройстве (т. е. я не хочу заставлять пользователя отключать передачу обслуживания на системном уровне для всех приложений).

1 ответ

Используйте асинхронную функцию для извлечения данных и предотвращения блокировки пользовательского интерфейса. Что-то вроде этого:

func getStringFromClipboard(completion: @escaping (_ copiedString: String?) -> Void) {
    DispatchQueue.global(qos: .userInitiated).async {
        let pastboardString = UIPasteboard.general.string

        DispatchQueue.main.async {
            completion(pastboardString)
        }
    }
}

А потом:

override func viewWillAppear(_ animated: Bool) {
    super.viewWilAppear(animated)
    getStringFromClipboard { (copiedString) in
        guard let copiedString = copiedString else {
            return
        }
        // your code if clipboard contains string
    }
}
Другие вопросы по тегам