iOS6 - 社交框架 - SLComposeViewController如何回退到iOS5的TWTweetComposeViewController?

时间:2012-09-20 09:01:32

标签: objective-c twitter

我有一段推特共享代码,适用于iOS6但我需要应用程序才能很好地适应iOS5 ......

看起来像这样:

- (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?
    }
}

那么,我如何在iOS5中很好地回退(我假设我需要TWTweetComposeViewController)以便我也可以在iOS5中使用本机twitter?

编辑: 最后我仍然懒得回退到TWTweetComposeViewController,所以我决定简单回归这个序列:iOS6原生推文 - &gt;安装了twitter app - &gt;网址。 这是我放在一起的功能,希望它有助于某人:

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

1 个答案:

答案 0 :(得分: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;
}