2012-09-20 3 views
20

mam kawałek kawałka twitter kody podziału, który działa dobrze dla iOS6 ale muszę aplikację spadać z powrotem ładnie iOS5 też ...iOS6 - Framework Społecznościowy - w jaki sposób SLComposeViewController zastępuje TWTweetComposeViewController dla iOS5?

Wygląda to tak:

- (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, jak ładnie się w systemie iOS5 ładować (zakładam, że potrzebuję TWTweetComposeViewController), abym mógł również używać rodzimego twittera w systemie iOS5?

EDIT: Na końcu nadal jestem leniwy Przenieś się TWTweetComposeViewController więc postanowiłem po prostu awaryjne w tej kolejności: iOS6 rodzimy tweet -> zainstalować aplikację twitter -> URL internetowej. Jest to funkcja ułożyła, nadzieję, że pomoże ktoś:

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

Odpowiedz

21

Trzeba słabe ogniwo ram Twitter i społecznego, a także sprawdzić, czy w kodzie ramy jest dostępny. Słaby łączenie odbywa się to tak:

  • Kliknij projektu w Xcode, wybierz swój cel, Budowanie fazy, następnie połączyć binarnych z Biblioteki
  • Upewnij Social.framework ustawiony jest opcjonalne, jeśli chcesz uruchomić ten Aplikacja na iOS 5.x lub wcześniej
  • Upewnij Twitter.framework ustawiony jest opcjonalne, jeśli chcesz uruchomić to na iOS 4.x lub wcześniej

Lubię tworzyć proste funkcje klasy do określenia, które ram są dostępne. Że coś może wyglądać następująco:

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

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

Twój „ćwierkanie” kod mógłby wyglądać tak:

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

dzięki chris! Twoja odpowiedź potwierdziła mi, że muszę włączyć framework Twitter, który nie jest dostępny w mojej najnowszej wersji Xcode teraz .. muszę go zdobyć..dzięki! – mkto

+0

@chris możesz używać TWTweetComposeViewController w iOS6 lub jakie są zalety korzystania z SLComposeViewController w iOS6? –

+0

Nie wiem, czy istnieje przewaga, i jestem gotów postawić 'SLComposeViewController' po prostu opakowuje' TWTweetComposeViewController'. Mogę sobie także wyobrazić, że Apple ostatecznie wycofa 'TWTweetComposeViewController' na rzecz' SLComposeViewController'. – chris

7

Nie wiesz, jak kosztowne operacje te uruchomieniowe są, ale nie zaszkodzi w ten sposób, ponieważ nie jest zero szans na zmianę tego statusu podczas działania aplikacji:


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

Dlaczego -1? Fyi do zapętlenia obu testów 1000x na iPhonie 4S ma wartość 0.000816 s przy użyciu oferowanej przeze mnie metody i 0.011595 s dla innej metody. Nie wiem, czy ktokolwiek nazywa to toną, ale dlaczego ciągle rozwiązywać tę klasę, kiedy to się nie zmieni, gdy aplikacja jest uruchomiona? Wygląda na to, że trudno jest zachować to samo w kółko, gdy tak łatwo jest zapisać wynik raz. – jpswain

Powiązane problemy