iOS6 - ソーシャル フレームワーク - SLComposeViewController は iOS5 の TWTweetComposeViewController にどのようにフォールバックしますか? 質問する

iOS6 - ソーシャル フレームワーク - SLComposeViewController は iOS5 の TWTweetComposeViewController にどのようにフォールバックしますか? 質問する

iOS6 で問題なく動作する Twitter 共有コードを持っていますが、アプリケーションを 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 でもネイティブ Twitter を使用できるように、iOS5 でうまくフォールバックするにはどうすればよいでしょうか (TWTweetComposeViewController が必要だと思います)?

編集: 結局、TWTweetComposeViewController にフォールバックするのが面倒なので、iOS6 ネイティブ ツイート -> インストールされた Twitter アプリ -> 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]];
        }
    }
}

ベストアンサー1

Twitter と Social フレームワークを弱いリンクにして、コード内でフレームワークが利用可能かどうかをチェックする必要があります。弱いリンクは次のように行います。

  • XCodeでプロジェクトをクリックし、ターゲット、ビルドフェーズ、ライブラリとバイナリのリンクを選択します。
  • このアプリをiOS 5.x以前で実行する場合は、Social.frameworkがOptionalに設定されていることを確認してください。
  • iOS 4.x以前でこれを実行する場合は、Twitter.frameworkがOptionalに設定されていることを確認してください。

私は、どのフレームワークが利用可能かを判断するためのシンプルなクラス関数を作成するのが好きです。それは次のようになります。

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

おすすめ記事