Могу ли я запретить 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
}
}