ios - SLComposeViewController se despide de forma diferente para Facebook y Twitter?
(3)
Tengo un código para compartir en redes sociales que se ve así:
SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:…];
[composer setInitialText:…];
[composer addURL:…];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
[someController dismissViewControllerAnimated:YES completion:^{
… // 1
}];
}];
[someController presentModalViewController:composer animated:YES];
El problema es que el código se comporta de manera diferente para Facebook y Twitter. Cuando el usuario confirma la pantalla de composición de Facebook, el compositor aparentemente se despide a sí mismo, porque el manejador de finalización marcado como 1 nunca se llama e incluso cuando dismissViewControllerAnimated:
llamada de dismissViewControllerAnimated:
todo funciona bien.
Por otro lado, cuando el usuario confirma la pantalla de composición de Twitter y no la descarto a mano, la pantalla de composición se desliza hacia fuera, pero la aplicación se queda bloqueada, como si un controlador todavía estuviera en primer plano. Cuando agrego la llamada dismissViewControllerAnimated:
el problema desaparece y el controlador de finalización (1) se llama correctamente.
¿También notaste este comportamiento? ¿Estoy haciendo algo mal? Este es el actual iOS 6, código de muestra en GitHub . He reportado el problema a Apple (Radar # 12642889), todavía no hay reacción.
Aparentemente, el problema se solucionó en iOS 7, probado en la versión 7.0 beta 11A4449d.
Estoy haciendo algo similar en mi aplicación, y la única diferencia con su código es que estoy enviando un dismissModalViewControllerAnimated:
control de controlador de dismissModalViewControllerAnimated:
a dismissModalViewControllerAnimated:
self
lugar de enviarlo al controlador de vista.
Tanto el compositor de facebook como el de twitter se alejan.
Este es mi código:
SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:text];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
...
[self dismissModalViewControllerAnimated:YES];
}];
[self presentModalViewController:composer animated:YES];
He confirmado tu problema con el comportamiento:
La versión de Twitter llama al controlador de finalización que configuró en el controlador de vista, y espera que llame a dismissViewController desde este controlador.
Sin embargo, la versión de Facebook llama a despideViewController antes de llamar a su controlador de finalización. Si luego llama usted mismo a despedirse a ControlController, no sucede nada y no recibe ninguna devolución de llamada de ningún bloque de finalización que pueda pasar a la desconexión del controlador de control.
Si omite la llamada a despideViewController, el uso de Twitter se bloquea, pero Facebook funciona.
Es un problema crear una solución si Apple va a corregir el comportamiento, ya que su solución se rompería. El principal problema es que el comportamiento no es el mismo entre las versiones de Weibo, Twitter y Facebook que comparten el mismo VC de redes sociales.
Así es como solucioné el problema:
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");}];
}