Подтвердить что ты не робот

IOS6 - Social Framework - как SLComposeViewController относится к TWTweetComposeViewController для iOS5?

У меня есть кусок кода обмена щебетать, который отлично подходит для 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?
    }
}

SO, как мне хорошо отступить в iOS5 (я полагаю, мне нужен TWTweetComposeViewController), чтобы я мог использовать собственный твиттер в iOS5 тоже?

EDIT: В конце я все еще ленив, чтобы вернуться к TWTweetComposeViewController, поэтому я решил просто отступить в этой последовательности: iOS6 native tweet → installed 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]];
        }
    }
}
4b9b3361

Ответ 1

Вам нужно слабо связать структуру Twitter и Social и проверить свой код, доступна ли инфраструктура. Слабая связь выполняется следующим образом:

  • Нажмите на свой проект в 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
}

Ответ 2

Не уверен, насколько дороги эти операции во время выполнения, но не вредит этому, так как при запуске приложения существует нулевая вероятность изменения статуса:


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