2012-09-20 16 views
20

मैं चहचहाना साझा करने कोड का टुकड़ा है कि iOS6 के लिए ठीक काम करता है का एक टुकड़ा है, लेकिन मैं iOS5 भी करने के लिए अच्छी तरह से पीछे हटना आवेदन की आवश्यकता है ...आईओएस 6 - सोशल फ्रेमवर्क - आईओएस 5 के लिए TWCweetComposeViewController को SLComposeViewController फ़ॉलबैक कैसे करता है?

यह इस तरह दिखता है:

- (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? 
    } 
} 
अतः

, मैं आईओएस 5 में अच्छी तरह से कैसे गिर सकता हूं (मुझे लगता है कि मुझे TWTweetComposeViewController की आवश्यकता है) ताकि मैं आईओएस 5 में देशी ट्विटर का भी उपयोग कर सकूं?

संपादित करें: अंत में मैं अभी भी TWTweetComposeViewController पर फ़ॉलबैक करने के लिए आलसी हूं इसलिए मैंने इस अनुक्रम में बस फॉलबैक करने का निर्णय लिया: आईओएस 6 मूल ट्वीट -> स्थापित ट्विटर ऐप -> वेब यूआरएल। इस समारोह मैं एक साथ रखा है, आशा है कि यह मदद करता है किसी को:

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

आप ट्विटर और सामाजिक व्यवस्थाएं कमजोर कड़ी करने की जरूरत है, और अपने कोड में जाँच करें कि क्या एक रूपरेखा उपलब्ध है। कमजोर जोड़ने इस तरह से किया जाता है:

  • XCode में अपनी परियोजना पर क्लिक करें, अपने लक्ष्य, पुस्तकालय के साथ है, तो लिंक बाइनरी चयन
  • सुनिश्चित करें Social.framework वैकल्पिक करने के लिए सेट कर दिया जाता चरण का निर्माण करता है, तो आप इस चलाना चाहते हैं या पहले
  • यकीन Twitter.framework बनाओ आईओएस 5.x पर एप्लिकेशन वैकल्पिक करने के लिए सेट है, तो आप आईओएस 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

धन्यवाद क्रिस! आपके उत्तर ने मुझे पुष्टि की कि मुझे ट्विटर फ्रेमवर्क शामिल करना होगा जो अब मेरे नवीनतम एक्सकोड संस्करण में उपलब्ध नहीं है .. मुझे इसे प्राप्त करने की ज़रूरत है .. धन्यवाद! – mkto

+0

@chris क्या आप आईओएस 6 में TWTweetComposeViewController का उपयोग कर सकते हैं या IOS6 में SLComposeViewController का उपयोग करने से क्या लाभ हैं? –

+0

मुझे नहीं पता कि कोई फायदा है या नहीं, और मैं 'SLComposeViewController 'शर्त लगाने के लिए तैयार हूं, बस' TWTweetComposeViewController' को लपेटता हूं। साथ ही, मैं कल्पना कर सकता हूं कि ऐप्पल 'SLComposeViewController' के पक्ष में' TWTweetComposeViewController' को अंततः हटा देगा। – 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 ?? आईफोन 4 एस पर दोनों चेक 1000x पर लूप करने के लिए Fyi कुछ विधि के साथ 0.011595 सेकंड की पेशकश की गई विधि के साथ 0.000816 सेकंड की तरह कुछ है। मुझे नहीं पता कि कोई भी इसे एक टन कह रहा है, लेकिन जब आपका ऐप चल रहा है तो यह बदलने के लिए क्लास को हल क्यों नहीं किया जा रहा है? यह एक ही चीज़ को हल करने के लिए बुरे रूप की तरह लगता है जब एक बार परिणाम को स्टोर करना इतना आसान होता है। – jpswain

संबंधित मुद्दे