Будет ли SLComposeViewController вызывать сбой, если SLServiceTypeFacebook используется в стране, которая не поддерживает facebook?

Я использую SLComposeViewController, чтобы представить очень простую подсказку «Поделиться в Facebook» на системном уровне. Я хочу, чтобы устройство обрабатывало вход в систему через настройки, если они не вошли в систему, поэтому я отключаю проверку +isAvailableForServiceType и просто иду вперед и представляю SLComposeViewController.

Я заметил, что если я попытаюсь использовать тип службы, которого нет на моем устройстве (например, SLServiceTypeTencentWeibo), это приведет к сбою моей программы. Произойдет ли это аналогичным образом в стране, где Facebook отсутствует на устройстве, подобно тому, как Tencent Weibo отсутствует на моем устройстве?

Авария, которую я получаю...

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target

Я представляю SLComposeViewController вот так...

SLComposeViewController *controller = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTencentWeibo];
[controller addURL:[NSURL URLWithString:@"http://www.example.com"]];
[controller addImage:sharedImage];
NSString *postString = [NSString stringWithFormat:@"A cool sharing string!"];
[controller setInitialText:postString];
[self presentViewController:controller animated:YES completion:nil];

person timgcarlson    schedule 12.06.2014    source источник


Ответы (1)


Я предполагаю, что это будет. Лучший способ обойти эту проблему — не проверять isAvailableForServiceType: и вместо этого проверять, является ли экземпляр контроллера nil. Таким образом, в большинстве случаев у вас по-прежнему есть возможность перейти в «Настройки», чтобы создать учетную запись, и избежать случайных сбоев, когда вы не можете этого сделать.

Вот мой код для Sina Weibo (текст в окне оповещения идентичен тексту, который обычно представляет Apple, только без возможности перейти в настройки):

SLComposeViewController *controller = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
[controller setInitialText:@"Some random text"];
[controller addImage:_randomImage];

if (!controller) {
    [[[UIAlertView alloc] initWithTitle:@"No Sina Weibo Accounts" message:@"There are no Shina Weibo accounts configured. You can add or create a Sina Weibo account in Settings." delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil] show];
    return;
}

[self presentViewController:controller animated:YES completion:nil];
person Gasper    schedule 21.09.2014
comment
Разве presentViewController не следует вызывать в предложении else? (Поэтому он вызывается только при наличии контроллера.) Похоже, вы представите контроллер nil? - person ToddB; 20.04.2015
comment
Если вы внимательно присмотритесь, то увидите, что в оператор if включен оператор return;, так что как только вы туда войдете, вы уже не пройдете мимо него. - person Gasper; 21.04.2015
comment
Спасибо, Гаспер, я знал, что пропустил это. - person ToddB; 21.04.2015