首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS6 -社交框架- SLComposeViewController如何退回到iOS5的TWTweetComposeViewController?

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

Stack Overflow用户
提问于 2012-09-20 17:01:32
回答 2查看 13K关注 0票数 20

我有一段推特分享代码,可以很好地在iOS6上工作,但我需要应用程序也能很好地回退到iOS5……

它看起来是这样的:

代码语言:javascript
复制
- (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原生tweet ->安装twitter app -> web url。这是我放在一起的函数,希望能对某些人有所帮助:

代码语言:javascript
复制
+(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]];
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-20 21:46:59

您需要将Twitter和社交框架进行弱链接,并在代码中检查是否有可用的框架。弱链接是这样做的:

  • 在XCode中单击项目,选择目标、构建阶段,然后将二进制文件与库链接
  • 如果要在iOS 5.x或更早版本的
  • 上运行此应用程序,请确保将Social.framework设置为可选如果要在iOS 4.x或更早版本的

上运行此应用程序,请确保将Twitter.framework设置为可选

我喜欢创建简单的类函数来确定哪些框架是可用的。它可能看起来像这样:

代码语言:javascript
复制
+(BOOL)isTwitterAvailable {
   return NSClassFromString(@"TWTweetComposeViewController") != nil;
}

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

您的"tweet“代码可能如下所示:

代码语言:javascript
复制
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
}
票数 21
EN

Stack Overflow用户

发布于 2012-11-09 07:24:04

不确定这些运行时操作的成本有多高,但这样做没有什么坏处,因为在应用程序运行时,这种状态更改的可能性为零:

代码语言:javascript
复制
+ (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;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12509327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档