2012-09-20 51 views
20

我有一塊一塊的Twitter共享代碼,對iOS6的正常工作,但我需要的應用程序很好地回落到iOS5的太...iOS6 - 社會框架 - SLComposeViewController如何回退到iOS5的TWTweetComposeViewController?

它看起來像這樣:

- (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,我如何在iOS5中很好地回退(我假設我需要TWTweetComposeViewController),以便我可以在iOS5中使用本地Twitter?

編輯: 最後,我仍然懶於回退到TWTweetComposeViewController,所以我決定簡單地回退:iOS6原生tweet - >已安裝的twitter應用程序 - > web網址。 這是我放在一起的功能,希望它可以幫助別人:

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

回答

21

您需要薄弱環節的Twitter和社會的框架,並在代碼檢查框架是否可用。弱鏈接是這樣完成的:

  • 點擊Xcode中的項目,選擇目標,構建階段,然後鏈接二進制與圖書館
  • 確保Social.framework設置爲可選,如果你想運行此在iOS 5.x或更早應用
  • 確保Twitter.framework設置爲可選,如果你想在iOS 4.x中運行這個或更早

我喜歡創造簡單的類的功能,以確定哪些框架可用。這可能是這個樣子:

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

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

你的「推特」的代碼可能是這個樣子:

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

謝謝克里斯!你的答案向我證實,我需要包含我現在最新的Xcode版本中沒有的Twitter框架..我需要得到它..謝謝! – mkto

+0

@chris你可以在iOS6中使用TWTweetComposeViewController嗎?或者在iOS6中使用SLComposeViewController有什麼好處? –

+0

我不知道是否有優勢,我敢打賭'SLComposeViewController'只是封裝了'TWTweetComposeViewController'。另外,我可以想象蘋果最終會棄用'TWTweetComposeViewController'而轉而使用'SLComposeViewController'。 – chris

7

不知道這些運行時操作多麼昂貴的,但在這樣做,因爲沒有什麼危害此應用程序正在運行時此狀態更改的機會爲零:


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

爲什麼-1? Fyi在iPhone 4S上循環兩次檢查1000x的方法與我提供的方法相似,爲0.000816秒,其他方法爲0.011595秒。我不知道是否有人會這麼稱呼,但爲什麼在你的應用程序運行時不會改變的時候,一直反覆解決課程?當一次存儲結果非常簡單時,一次又一次地繼續解決相同的問題似乎是一種糟糕的形式。 – jpswain