iphone - Problemas para iOS4.3 e iOS5.0
objective-c xcode (4)
Me estoy enfrentando a problemas al tratar de incorporar algunas bibliotecas específicas de iOS5 en una aplicación dirigida tanto a iOS5 como a iOS4.3. He seguido los siguientes pasos:
enlazó débilmente el marco de Twitter configurándolo como opcional en ''Enlace binario con bibliotecas''
lo agregó como un marco para el SDK de iOS5.0 en otros indicadores de enlazador con `-framework Twitter.framework ''
condicionalmente vinculó el marco en el encabezado de clase:
#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0 #import <Twitter/Twitter.h> #import <Accounts/Accounts.h> #endif
Luego, en el método en sí, estoy verificando si el usuario está configurado para Twitter:
if ([TWTweetComposeViewController class]) { self.canTweet = [TWTweetComposeViewController canSendTweet]; }
Esto funciona maravillosamente en los simuladores 5.0 y 4.3. Sin embargo, tengo problemas para ejecutarlo o archivar para dispositivos reales.
Cuando tengo un 3GS ejecutando 5.0, o un 4 corriendo 5.0 conectado, ambos aparecen dos veces en el menú desplegable del Esquema. Al seleccionar el superior y al intentar compilar o ejecutar el proyecto Use of unidentified identifier ''TWTweetComposeViewController''
un error con el Use of unidentified identifier ''TWTweetComposeViewController''
.
Al utilizar la entrada del segundo dispositivo, la compilación falla con un error ld: framework not found Twitter.framework
.
Estoy seguro de que hay algo que me falta aquí, pero estoy perplejo. ¿Alguien puede aconsejar?
El código para presentar el controlador de twitter
Antes de esto, tiene que agregar los marcos como opcional y hacer la importación en el archivo h si iOS es mínimo iOS 5
Class TWTweetComposeViewControllerClass = NSClassFromString(@"TWTweetComposeViewController");
if (TWTweetComposeViewControllerClass != nil) {
if([TWTweetComposeViewControllerClass respondsToSelector:@selector(canSendTweet)]) {
UIViewController *twitterViewController = [[TWTweetComposeViewControllerClass alloc] init];
[twitterViewController performSelector:@selector(setInitialText:)
withObject:NSLocalizedString(@"TwitterMessage", @"")];
[twitterViewController performSelector:@selector(addURL:)
withObject:url];
[twitterViewController performSelector:@selector(addImage:)
withObject:[UIImage imageNamed:@"yourImage.png"]];
[self.navigationController presentModalViewController:twitterViewController animated:YES];
[twitterViewController release];
}
}
Profundizando en el error arrojado por el compilador sugirió que estaba ignorando el indicador de enlace débil. Aunque no tengo ni idea de cómo ni por qué, se solucionó mediante la reinstalación de XCode.
Si está utilizando un enlace de una semana, debe verificar la primera disponibilidad de API utilizando NSClassFromString, respondsToSelector, instancesRespondToSelector, etc. Por lo tanto, cambie su condición if. Primero intente obtener su objeto de clase usando la función de tiempo de ejecución especificada arriba.
aquí hay un enlace que explica en detalle cómo hacer eso. enlazar
si enlaza a 4.2 o posterior e implementa a 3.1 o posterior, puede usar las nuevas características de vinculación débil para hacer que esta verificación sea simple.
tienes que agregar marcos de Twitter como opcional y luego
Class TWTweetComposeViewControllerClass = NSClassFromString(@"TWTweetComposeViewController");
if (TWTweetComposeViewControllerClass != nil)
{
if([TWTweetComposeViewControllerClass respondsToSelector:@selector(canSendTweet)])
{
UIViewController *twitterViewController = [[TWTweetComposeViewControllerClass alloc] init];
[twitterViewController performSelector:@selector(setInitialText:)
withObject:NSLocalizedString(@"TwitterMessage", @"")];
[twitterViewController performSelector:@selector(addURL:)
withObject:url];
[twitterViewController performSelector:@selector(addImage:)
withObject:[UIImage imageNamed:@"yourImage.png"]];
[self.navigationController presentModalViewController:twitterViewController animated:YES];
[twitterViewController release];
}
}