2012-09-20 13 views
20

Ho un pezzo di pezzo di codici di condivisione di Twitter che funziona bene per iOS6 ma ho bisogno l'applicazione di ripiegare bene per iOS5 troppo ...iOS6 - Social Framework: in che modo SLComposeViewController esegue il fallback su TWTweetComposeViewController per iOS5?

Ecco come si presenta:

- (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, come faccio a ricadere bene su iOS5 (presumo di aver bisogno di TWTweetComposeViewController) in modo da poter utilizzare anche il nativo Twitter in iOS5?

EDIT: Alla fine io sono ancora pigro per ripiego per TWTweetComposeViewController così ho deciso di ripiego semplicemente in questa sequenza: iOS6 Tweet nativo -> installato Twitter APP -> web url. Questa è la funzione che ho messo insieme, spero che aiuta qualcuno:

+(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]]; 
     } 
    } 
} 

risposta

21

devi anello debole dei quadri Twitter e sociali, e verificare nel codice se un quadro è disponibile. linking Debole è fatto in questo modo:

  • Clicca sul progetto in XCode, selezionare il target, Build Fasi, quindi Collegamento binario con le librerie
  • Assicurarsi Social.framework è impostato su Facoltativo se si desidera eseguire questo app su iOS 5.x o prima
  • assicurarsi Twitter.framework è impostato su Facoltativo se si desidera eseguire questo su iOS 4.x o prima

mi piace creare funzioni di classe semplice per determinare quale dei quadri sono disponibili. Quel qualcosa potrebbe assomigliare a questo:

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

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

Il codice "Tweet" potrebbe essere simile a questa:

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

grazie chris! la tua risposta mi ha confermato che ho bisogno di includere il framework di Twitter che non è disponibile nella mia ultima versione di Xcode ora .. ho bisogno di farlo ... grazie! – mkto

+0

@chris puoi utilizzare TWTweetComposeViewController in iOS6 o quali sono i vantaggi dell'utilizzo di SLComposeViewController in iOS6? –

+0

Non so se c'è un vantaggio, e sono disposto a scommettere 'SLComposeViewController' semplicemente racchiudendo' TWTweetComposeViewController'. Inoltre, potrei immaginare che Apple alla fine deprecherà 'TWTweetComposeViewController' in favore di' SLComposeViewController'. – chris

7

Non sono sicuro quanto costoso queste operazioni di runtime sono, ma nulla di male nel fare questo poiché non v'è nessuna possibilità di cambiare questo stato mentre l'app è in esecuzione:


+ (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

Perché il -1 ?? Fyi per eseguire il loop su entrambi i controlli 1000x su un iPhone 4S è qualcosa come 0.000816 secondi con il metodo che ho offerto e 0,011595 secondi con l'altro metodo. Non so se qualcuno lo chiama una tonnellata, ma perché continuare a risolvere la lezione più e più volte quando non cambierà mentre la tua app è in esecuzione? Sembra una cattiva forma per continuare a risolvere la stessa cosa più e più volte quando è così facile memorizzare il risultato una volta. – jpswain

Problemi correlati