我有一段推特分享代码,可以很好地在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原生tweet ->安装twitter app -> web url。这是我放在一起的函数,希望能对某些人有所帮助:
+(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]];
}
}
}发布于 2012-09-20 21:46:59
您需要将Twitter和社交框架进行弱链接,并在代码中检查是否有可用的框架。弱链接是这样做的:
上运行此应用程序,请确保将Twitter.framework设置为可选
我喜欢创建简单的类函数来确定哪些框架是可用的。它可能看起来像这样:
+(BOOL)isTwitterAvailable {
return NSClassFromString(@"TWTweetComposeViewController") != nil;
}
+(BOOL)isSocialAvailable {
return NSClassFromString(@"SLComposeViewController") != nil;
}您的"tweet“代码可能如下所示:
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
}发布于 2012-11-09 07:24:04
不确定这些运行时操作的成本有多高,但这样做没有什么坏处,因为在应用程序运行时,这种状态更改的可能性为零:
+ (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;
}https://stackoverflow.com/questions/12509327
复制相似问题