2012-09-20 6 views
20

Tengo un pedazo de trozo de código compartido de Twitter que funciona bien para iOS6 pero necesito la aplicación volver a caer muy bien a IOS5 también ...iOS6 - Marco social: ¿cómo se sustituye SLComposeViewController a TWTweetComposeViewController para iOS5?

Se ve así:

- (void) shareOnTwitter 
{ 
    if([SLComposeViewController instanceMethodForSelector:@selector(isAvailableForServiceType)] != nil) 
    { 
     if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) 
     { 
      NSLog(@"twitter available"); 
      SLComposeViewController *composeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; 
      [composeViewController setInitialText:self.sharingText]; 
      [self.sharingController presentViewController:composeViewController animated:YES completion:nil]; 
     } 
     else 
     { 
      NSLog(@"twitter not available!"); 
     } 
    } 
    else 
    { 
     // SLComposeViewController not available, this is most likely <iOS6, what to do here? 
    } 
} 

SO, ¿Cómo puedo recurrir muy bien en iOS5 (supongo que necesito TWTweetComposeViewController) para poder usar el twitter nativo en iOS5 también?

EDIT: Al final, todavía soy flojo de recurrir a TWTweetComposeViewController, así que decidí simplemente recurrir a esta secuencia: Tweet nativo de iOS6 -> aplicación de Twitter instalada -> URL de la web. Esta es la función que arme, espero que ayude a alguien:

+(BOOL)isSocialFrameworkAvailable 
{ 
    // whether the iOS6 Social framework is available? 
    return NSClassFromString(@"SLComposeViewController") != nil; 
} 

- (void) shareOnTwitterWithText:(NSString*)text andURL:(NSString*)url andImageName:(NSString*)imageName 
{ 
    // prepare the message to be shared 
    NSString *combineMessage = [NSString stringWithFormat:@"%@ %@", text, url]; 
    NSString *escapedMessage = [combineMessage stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
    NSString *appURL = [NSString stringWithFormat:@"twitter://post?message=%@", escapedMessage]; 

    if([SocialManager isSocialFrameworkAvailable] && [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) 
    { 
     // user has setup the iOS6 twitter account 

     SLComposeViewController *composeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; 
     [composeViewController setInitialText:text]; 
     if([UIImage imageNamed:imageName]) 
     { 
      [composeViewController addImage:[UIImage imageNamed:imageName]]; 
     } 
     if(url) 
     { 
      [composeViewController addURL:[NSURL URLWithString:url]]; 
     } 
     [self.sharingController presentViewController:composeViewController animated:YES completion:nil]; 
    } 
    else 
    { 
     // else, we have to fallback to app or browser 
     if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:appURL]]) 
     { 
      // twitter app available! 
      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:appURL]]; 
     } 
     else 
     { 
      // worse come to worse, open twitter page in browser 
      NSString *web = [NSString stringWithFormat:@"https://twitter.com/intent/tweet?text=%@", escapedMessage]; 
      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:web]]; 
     } 
    } 
} 

Respuesta

21

Necesitas eslabón débil de los marcos de Twitter y Sociales, y comprobar en su código si un marco está disponible. Débil vinculación se realiza así:

  • Haga clic en su proyecto en Xcode, seleccione su destino, Construir fases, entonces Enlace binario con Bibliotecas
  • Asegúrese Social.framework se establece en opcional si se desea ejecutar este aplicación en iOS 5.x o anterior
  • Asegúrese Twitter.framework se establece en opcional si se desea ejecutar este en iOS 4.x o anterior

me gusta crear funciones de clase simples para determinar qué marcos están disponibles. Eso podría ser algo como esto:

+(BOOL)isTwitterAvailable { 
    return NSClassFromString(@"TWTweetComposeViewController") != nil; 
} 

+(BOOL)isSocialAvailable { 
    return NSClassFromString(@"SLComposeViewController") != nil; 
} 

Su código "tuit" podría ser algo como esto:

if ([SomeClass isSocialAvailable]) { 
    // code to tweet with SLComposeViewController 
} else if ([SomeClass isTwitterAvailable]) { 
    // code to tweet with TWTweetComposeViewController 
} else { 
    // Twitter not available, or open a url like https://twitter.com/intent/tweet?text=tweet%20text 
} 
+0

gracias chris! su respuesta me confirmó que necesito incluir el marco de Twitter que no está disponible en mi última versión de Xcode ahora ... necesito obtenerlo ... ¡gracias! – mkto

+0

@chris puede usar TWTweetComposeViewController en iOS6 o cuáles son los beneficios de usar SLComposeViewController en iOS6? –

+0

No sé si hay una ventaja, y estoy dispuesto a apostar que 'SLComposeViewController' solo se ajusta a' TWTweetComposeViewController'. Además, podría imaginar que Apple eventualmente depreciará 'TWTweetComposeViewController' en favor de' SLComposeViewController'. – chris

7

No está seguro de lo caro que estas operaciones de ejecución son, pero ningún daño en hacer esto ya que no hay Cero posibilidades de que este estado cambie mientras la aplicación se está ejecutando:


+ (BOOL)isTwitterAvailable 
{ 
    static BOOL available; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     available = NSClassFromString(@"TWTweetComposeViewController") != nil;   
    }); 
    return available; 
} 
+ (BOOL)isSocialAvailable 
{ 
    static BOOL available; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     available = NSClassFromString(@"SLComposeViewController") != nil;   
    }); 
    return available; 
} 
+4

¿Por qué el -1? Fyi para recorrer los dos controles 1000x en un iPhone 4S es algo así como 0.000816 segundos con el método que ofrecí, y 0.011595 segundos con el otro método. No sé si alguien llama esto una tonelada, pero ¿por qué seguir resolviendo la clase una y otra vez cuando no va a cambiar mientras se ejecuta su aplicación? Parece una mala forma seguir resolviendo lo mismo una y otra vez cuando es tan fácil almacenar el resultado una vez. – jpswain

Cuestiones relacionadas