SLComposeViewController для Twitter теперь аварийно завершает работу в iOS 8.3

В моем приложении есть опция общего доступа Tweetsheet. Только что обновился до iOS8.3, и теперь SLComposeViewController выдает ошибку, когда я пытаюсь представить Tweetsheet:

«Приложение завершает работу из-за необработанного исключения« NSInvalidArgumentException », причина:« Приложение пыталось представить нулевой контроллер модального представления на цели»

SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[tweetSheet setInitialText:@"testing!"];
[self presentViewController:tweetSheet animated:YES completion:nil];

Я заранее проверяю, доступен ли Twitter. У кого-нибудь еще есть эта проблема сейчас?


person user3587825    schedule 13.04.2015    source источник
comment
Не могли бы вы уже решить свою проблему?   -  person Alex Cio    schedule 17.04.2015
comment
Это проблема iOS 8.3. Отчет об ошибке отправлен.   -  person Daniel Storm    schedule 27.04.2015
comment
@user3587825 user3587825 вы нашли какое-нибудь решение?   -  person Anurag Sharma    schedule 16.06.2017


Ответы (2)


У меня такая же проблема при использовании SLServiceTypeTwitter на iPhone под управлением iOS 8.3: хотя

[SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] 

возвращает YES, последующий вызов

[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]

возвращает nil. Однако он возвращает контроллер представления, если я запускаю приложение на iPad или в симуляторе iPhone, или если я изменяю тип службы на SLServiceTypeFacebook.

Теперь я использую этот обходной путь: чтобы проверить доступность Twitter, я использую

+(BOOL)twitterAvailable {
    return([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] &&
           [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter] != nil);
}

Далее я добавляю дополнительную проверку перед представлением SLComposeViewController:

if(composeViewController != nil) {
   [viewController presentViewController:composeViewController animated:YES completion:nil];
}

Это должно стать будущим доказательством исправления ошибок в iOS 8.4.

person Theo    schedule 29.04.2015

Перед использованием одного из сервисов всегда следует проверять, доступен ли объект:

if( [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] ){

Это действительно важно, поэтому

  1. ваше приложение не падает и
  2. вы можете сказать пользователю, что услуга недоступна.

Вы должны сделать то же самое для других сервисов, которые можно использовать из iOS, например, для SMS или Mail:

if(![MFMessageComposeViewController canSendText]) {

ИЛИ

if( ![MFMailComposeViewController canSendMail] ){

Если вы хотите быть уверены, что конкретное приложение доступно на телефоне, вы также можете попробовать использовать canOpenURL::

- (BOOL)isAppAvailable:(NSString *)appURL{
   return [[UIApplication sharedApplication]  
                canOpenURL:[NSURL URLWithString:appURL]];
}

Я думаю, что вызов isAvailableForServiceType:SLServiceTypeTwitter выполняет что-то подобное.

person Alex Cio    schedule 14.04.2015
comment
Эй, да, я проверил. Он все еще падает. У меня есть ощущение, что это ошибка, потому что работает точно такой же метод с использованием SLServiceTypeFacebook, и я связал учетные записи с обеими службами. Он работал отлично, пока я не обновился до 8.3. - person user3587825; 14.04.2015
comment
Вы должны включить проверку, которую я опубликовал, прежде чем вызывать функции общего доступа. В моем случае я попробовал свои приложения, где я реализовал это именно так, и все работает нормально. Не знаю, в чем именно проблема. Если вы хотите быть уверены, что ничего подобного не происходит, включите проверку доступности определенного приложения на телефоне, вызвав appURL. - person Alex Cio; 17.04.2015