UIActivityViewController не работает в iOS 11
Я использую UIActivityViewController для совместного использования URL-адреса статьи, используя приведенный ниже код,
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop];
[self presentViewController:activityVC animated:YES completion:nil];
Приведенный выше код работает в iOS 9 и 10, но он не работает в iOS 11
Я отлаживал его, код выполняет отлично, после этого я получаю журнал ошибок в консоли, как показано ниже
[ShareSheet] ERROR: время ожидания для установления соединения с расширением службы просмотра ShareUI.
Есть ли люди, столкнувшиеся с этой проблемой? Есть ли способ обхода?
EDIT: после очистки и запуска проекта я попытался сделать то же самое, после того, как через 2 или 3 раза UIActivityViewController был открыт, снова я попытался в первый раз получить такую же ошибку выше, второй раз только UIActivityViewController открывается.
Ответы
Ответ 1
Весь код, который изменяет пользовательский интерфейс, должен быть запущен в основной очереди, что по дизайну. Итак, все, что вам нужно сделать, это следующее:
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop];
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:activityVC animated:YES completion:nil];
});
Немного больше объяснений: dispatch_async()
закроет блок, который вы передадите ему, чтобы запустить его в ближайшем будущем, когда будет безопасно обновлять пользовательский интерфейс. Если вы не делаете этого в главной очереди, могут возникнуть странные вещи (иногда пользовательский интерфейс просто не меняется, или старые изменения могут применяться после более новых, или такие вещи).
Методы, которые передаются из пользовательских действий в пользовательском интерфейсе (например, в IBAction
при нажатии кнопки), уже выполняются в главной очереди, поэтому dispatch_async()
там не требуется (конечно, если вы не вызывая их IBAction
вручную из другой очереди).
Обратите внимание, что alloc
/init
и setExcludedActivityTypes:
не обновляют пользовательский интерфейс, поэтому нет необходимости вызывать их в основной очереди.
Ответ 2
Для быстрого 4.0
let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [shareItem], applicationActivities:nil)
activityViewController.excludedActivityTypes = [.print, .copyToPasteboard, .assignToContact, .saveToCameraRoll, .airDrop]
DispatchQueue.main.async {
self.present(activityViewController, animated: true, completion: nil);
}
Ответ 3
Попробуйте следующее:
dispatch_async(dispatch_get_main_queue(), ^{
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop];
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:activityVC animated:YES completion:nil];
});
});
У меня была такая же проблема, но в Swift3 и она отлично работает.
Ответ 4
У меня была та же проблема, и я понял, что я не звоню в тему пользовательского интерфейса. Попробуйте запустить в потоке пользовательского интерфейса и посмотреть, исправить ли проблему
Ответ 5
это работает для сторонних приложений? Я не могу исключить сторонние приложения.