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), пока никакой реакции.


person zoul    schedule 06.11.2012    source источник
comment
Я тоже наблюдаю такое же поведение. На данный момент я отключаю контроллер представления вручную для Twitter и позволяю системе сделать это для Facebook.   -  person lucius    schedule 26.11.2012
comment
Я тоже это заметил, вы когда-нибудь слышали ответ?   -  person Ser Pounce    schedule 15.12.2012
comment
Я отправил отчет об ошибке в Apple и включил ссылку на пример проекта на GitHub. Apple связалась со мной только сейчас, спустя каких-то пять недель, чтобы запросить образец проекта (вздох). Я скачаю образец проекта с GitHub, добавлю его в задачу и буду ждать. Я выложу подробности здесь, если что-то изменится.   -  person zoul    schedule 15.12.2012
comment
Симптомы, с которыми я столкнулся, заключались в том, что после завершения твиттера клавиатура не закрывалась. Добавление условного отклонения ViewController, как упоминал @lucius, исправило это.   -  person Saltymule    schedule 31.05.2013
comment
@zoul, ты что-нибудь слышал от Apple?   -  person Jake Lin    schedule 13.06.2013
comment
@JakeLin, ни слова.   -  person zoul    schedule 13.06.2013
comment
проблема все еще существует в ios9.1   -  person brush51    schedule 10.12.2015


Ответы (3)


Я делаю что-то подобное в своем приложении, и единственная разница с вашим кодом заключается в том, что я отправляю dismissModalViewControllerAnimated: в self, а не в контроллер представления.
И facebook, и twitter composer ускользают.

Это мой код:

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

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

person zoul    schedule 26.08.2013
comment
Это? У меня такая же проблема в iOS 6 Прямо сейчас в Xcode 5.0.2. Я должен вручную отключить контроллер просмотра Twitter после того, как пользователь отменил/опубликовал. - person anthoprotic; 17.12.2013
comment
Должно быть. Обратите внимание, что я сказал iOS 7, ошибка не зависит от версии Xcode. Если вы используете текущий Xcode с более старой версией iOS, вы все равно можете столкнуться с ней. - person zoul; 17.12.2013
comment
проблема все еще существует в ios9.1+ - person brush51; 10.12.2015

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

Версия для 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");}];
}
person Robotbugs    schedule 01.07.2013