Подтвердить что ты не робот

SLComposeViewController отклоняет по-разному для Facebook и Twitter?

У меня есть код совместного доступа, который выглядит следующим образом:

SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:…];
[composer setInitialText:…];
[composer addURL:…];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
    [someController dismissViewControllerAnimated:YES completion:^{
        … // 1
    }];
}];
[someController presentModalViewController:composer animated:YES];

Проблема в том, что код ведет себя по-разному для Facebook и Twitter. Когда пользователь подтверждает экран компоновки Facebook, композитор, по-видимому, отклоняет себя, потому что обработчик завершения, обозначенный как 1, никогда не вызывается, и даже когда я удаляю вызов dismissViewControllerAnimated:, все работает нормально.

С другой стороны, когда пользователь подтверждает экран компоновки Twitter, и я не увольняю его вручную, экран компоновки открывается, но приложение остается застрявшим, как будто какой-то контроллер все еще находится на переднем плане. Когда я добавляю вызов dismissViewControllerAnimated:, проблема исчезает, и обработчик завершения (1) вызывается правильно.

Вы также заметили это поведение? Я делаю что-то неправильно? Это текущий код iOS 6, на GitHub. Я сообщил об этой проблеме Apple (Radar # 12642889), пока не было никакой реакции.

4b9b3361

Ответ 1

Проблема, по-видимому, была исправлена ​​в iOS 7, протестирована на 7.0 beta build 11A4449d.

Ответ 2

Я делаю что-то подобное в своем приложении, и единственное отличие от вашего кода заключается в том, что я отправляю dismissModalViewControllerAnimated: в self вместо отправки его в контроллер просмотра.
Как facebook, так и twitter композитор отходит.

Это мой код:

SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:text];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
    ...
    [self dismissModalViewControllerAnimated:YES];
}];
[self presentModalViewController:composer animated:YES];

Ответ 3

Я подтвердил вашу проблему с поведением:

В версии Twitter вызывается обработчик завершения, который вы установили на контроллере представления, и ожидает, что вы вызовите функцию rejectViewController из этого обработчика.

Однако версия Facebook вызывает функцию rejectViewController перед вызовом обработчика завершения. Если вы затем вызываете функцию rejectViewController самостоятельно, ничего не происходит, и вы не получаете никакого обратного вызова из любого блока завершения, который вы могли бы передать функции rejectViewController.

Если вы оставите вызов rejectViewController, тогда разделение Twitter будет зависеть, но работает Facebook.

Проблема заключается в том, чтобы создать решение, если Apple собирается исправлять поведение, так как ваше решение будет нарушено. Основная проблема заключается в том, что поведение не совпадает между поведением Weibo, Twitter и Facebook, использующим тот же VC общественного обмена.

Вот как я исправил проблему:

SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:serviceType];
if(vc==nil)
{
    [self.delegate imageSaveDidSucceed:NO];
}
else
{
    [vc addImage:self.image];
    vc.completionHandler = ^(SLComposeViewControllerResult result) {
        DEBUG_LOG(@"social sharing completed");
        if(self.presentedViewController)
        {
            DEBUG_LOG(@"presented vc is not nil");
            [self dismissViewControllerAnimated:YES completion:^{
                DEBUG_LOG(@"dismissed vc and calling imageSaveDidSucceed");
                [self.delegate imageSaveDidSucceed:YES];
            }];
        }
        else
        {
            DEBUG_LOG(@"presented vc is nil");
            [self.delegate imageSaveDidSucceed:YES];
        }
    };
    [self presentViewController:vc animated:YES completion: ^{DEBUG_LOG(@"vc was presented");}];
}