4

iOS 5 用の Twitter フレームワークを使用したいのですが、古い OS でアプリを実行できるようにしたいです。

Xcode 4.2 のターゲット設定に弱参照フレームワーク (つまり、「オプション」フラグを設定) を追加しました。ベース SDK は iOS 5、iOS 展開ターゲットは iOS 3.2 です。

次に、Twitter フレームワークを使用してみます。

#import <Twitter/Twitter.h>
...
    Class twClass = NSClassFromString(@"TWTweetComposeViewController");
    if (!twClass) // Framework not available, older iOS
    {
        [self shareWithTwitterPriorIOS5];
        return;
    }

    if ([TWTweetComposeViewController canSendTweet]) // Check if twitter is setup and reachable
    {
        TWTweetComposeViewController* twc = [[TWTweetComposeViewController alloc] init];
//        [twc addURL:[NSURL URLWithString:@"http://mail.ru"]];
//        [twc addImage:[UIImage imageNamed:@"Some image.png"]]
        [twc setInitialText:textToShare];
        [viewController presentViewController:twc animated:YES completion:^{
            // Optional
        }];
        [twc release];
        // Assume twc is ARC released or call [twc release];
    }
    else
    {

    // Twitter account not configured, inform the user
}

iOS 5 シミュレーターで問題なく動作します。古いバージョンの OS でシミュレーターまたは実機を使用しようとすると、すぐに "Twitter/Twitter.h" ファイルが見つかりません (コンパイル時) というエラーが表示されます。「#import」ディレクティブを削除すると、TWTweetComposeViewController クラスが見つからないというエラーがいくつか発生します。

Twitter 関連のすべてのコードにコメントを付けると、次のリンカー エラーが表示されます: "ld: フレームワークが Twitter に見つかりません"。Ld コマンドでエラーが発生しました:

Ld /Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Products/Debug-iphoneos/Dictionary.app/Dictionary normal armv6
    cd /Developer/WorkShop/XDictionary/trunk
    setenv IPHONEOS_DEPLOYMENT_TARGET 3.2
    setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.2.sdk -L/Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Products/Debug-iphoneos "-L/Developer/WorkShop/XDictionary/trunk/Dictionary/Twitter+OAuth/Libraries & Headers" -F/Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Products/Debug-iphoneos -filelist /Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Intermediates/Dictionary.build/Debug-iphoneos/Dictionary.build/Objects-normal/armv6/Dictionary.LinkFileList -dead_strip -miphoneos-version-min=3.2 -lxml2 -framework AVFoundation -framework UIKit -framework Foundation -framework CoreGraphics -lOAuth -weak_framework Twitter -o /Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Products/Debug-iphoneos/Dictionary.app/Dictionary

ここで何が問題なのですか?

4

4 に答える 4

5

5時間後、すべてのターゲットとプロジェクトの設定などを変更するなど、ばかげたドキュメントリーダーがたくさんあります。少なくとも解決策にたどり着きました。あなたがそれを知っているとき、それは非常に簡単であることがわかります。おそらく、私の答えは誰かの命を救うでしょう。

ここに画像の説明を入力

ご覧のとおり、実際のデバイスの宛先 (「mkeskinov の iPod」) は 2 倍になりました。私はこの事実に決して注意を払いません。何かの間違いで2倍になったように見えますが、そうではありません。"Product\Edit Schemes" を選択して宛先リスト (ウィンドウの上部) を開くと、違いがはっきりとわかります。

ここに画像の説明を入力

実際のデバイス用にアプリを正常にコンパイルするために必要なこと - 2 番目のオプションを選択するだけです。これは iOS 5 用にコンパイルされ、OS 4 を搭載した実際のデバイスで実行されます。最初のオプションは、iOS 4 用にコンパイルされることを意味します。または強い) - コンパイル時エラーが発生します。

于 2011-12-21T15:20:29.510 に答える
4

あなたのコードはおそらく問題ありません。

iOS5 SDK に対してアプリをビルドする必要があります。生成するバイナリは、古い iOS バージョンで実行されます (指定したように、ターゲット SDK が古いバージョンである場合)。

あなたのコードは iOS5 の機能を正しくチェックし、正しいことを行っています。また、Twitter フレームワークへの弱いリンクも正しく行っています。これらの手法により、(最新の SDK に対してビルドされた) アプリを古い iOS バージョンでクラッシュすることなく実行できます。

于 2011-12-20T21:36:49.913 に答える
1

これをヘッダー ファイル .h に追加します。

#import <Twitter/TWTweetComposeViewController.h>

アプリに使用したものは次のとおりです。

if ([TWTweetComposeViewController class])
{
   //can tweet
} else
{
   //can't tweet
} 
于 2011-12-20T20:23:13.417 に答える
0

importを使用する代わりに、NSClassFromString()から取得したClassオブジェクトを使用してTWTweetComposeViewControllerクラスを参照する必要があります。たとえば、[TWTweetComposeViewControllercanSendTweet]の代わりに[twClasscanSendTweet]を使用します。

于 2011-12-20T20:12:47.880 に答える