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

это работает для сторонних приложений? Я не могу исключить сторонние приложения.