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] ОШИБКА: истекло время ожидания для установления подключения к сервисному расширению представления ShareUI.

Есть ли люди, столкнувшиеся с этой проблемой? Есть ли обходной путь?

РЕДАКТИРОВАТЬ: после очистки и запуска проекта я попытался сделать то же самое, после того как 2 или 3 раза был открыт UIActivityViewController, снова я попытался, в первый раз я получаю ту же ошибку, что и выше, второй раз открывается только UIActivityViewController .


person R. Mohan    schedule 25.09.2017    source источник
comment
очистить и запустить один раз, вы уверены, что столкнулись с проблемой timed out waiting to establish a connection to the ShareUI view service extension. этого после использования UIActivityViewController   -  person Anbu.Karthik    schedule 25.09.2017
comment
можешь показать shareItemArray   -  person Anbu.Karthik    schedule 25.09.2017
comment
очистил и запустил его, братан, я получил ту же ошибку тайм-аута 2 или 3 раза, после этого теперь открывается uiactivityviewcontroller.   -  person R. Mohan    schedule 25.09.2017
comment
В этом shareItemArray у меня есть только NSUrl ниже ">60secondsnow.com/ta/tamil-nadu/   -  person R. Mohan    schedule 25.09.2017
comment
я думаю проблема в другом   -  person Anbu.Karthik    schedule 25.09.2017
comment
я попробовал github.com/versluis/Activity-Demo этот проект тоже в iOS 11, в этом проект также я получил ту же проблему. После этого только я разместил этот вопрос.   -  person R. Mohan    schedule 25.09.2017
comment
хорошо, я проверю это   -  person Anbu.Karthik    schedule 25.09.2017
comment
Кто-нибудь может пояснить, почему ошибка регистрируется, но пользовательский интерфейс просто не отвечает? Предполагая, что вы хотите сохранить его в основном потоке, чего-то не хватает, что могло бы уловить ошибку?   -  person benc    schedule 16.07.2018
comment
@benc просто добавьте код в основной поток в соответствии с ответом, он будет работать.   -  person R. Mohan    schedule 16.07.2018


Ответы (4)


Весь код, изменяющий пользовательский интерфейс, должен выполняться в основной очереди, так задумано. Итак, все, что вам нужно сделать, это:

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: не обновляют пользовательский интерфейс, поэтому нет необходимости вызывать их в основной очереди.

person Alejandro Iván    schedule 19.10.2017
comment
Привет, @Alejandro Iván У меня происходит сбой при открытии общего представления и появлении этой ошибки в журнале: ‹UIActivityViewController: 0x7fb80406ce00› истекло время ожидания для установления соединения с расширением службы представления ShareUI. Не могли бы вы помочь здесь? - person Samkit Shah; 01.12.2017
comment
@SamkitShah Понятия не имею, я предполагаю, что некоторые службы системного уровня не работают. Попробуйте перезагрузить устройство (Power+Home на iPhone 6s или младше, Power+VolumeDown на iPhone 7 или новее, отпустите кнопки, когда увидите логотип запуска Apple). - person Alejandro Iván; 05.12.2017

Для свифт 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);
}
person vp2698    schedule 06.01.2018

Попробуй это:

    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 все работает нормально.

person Xande Rasta Moura    schedule 19.10.2017
comment
Двойная основная очередь? Зачем? Только presentViewController:animated:completion: требуется для вызова в основной очереди. - person Alejandro Iván; 19.10.2017
comment
О да, мужик, ты прав. В моем случае у меня есть анимация HUD, и для нормальной работы мне нужна двойная очередь. У вас есть другое решение? - person Xande Rasta Moura; 19.10.2017

У меня была та же проблема, и я понял, что не звонил в поток пользовательского интерфейса. Попробуйте запустить в потоке пользовательского интерфейса и посмотрите, решит ли проблема

person Raphael Augusto da Silva    schedule 18.10.2017