-4

重複の可能性:
iOS 6 専用のソーシャル フレームワークをインポートする方法は?

プリプロセッサ マクロで条件を確認する必要があります。

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

/*
 *  Usage
 */



if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0"))
{
#import <Social/SLServiceTypes.h>
#import <Social/SLRequest.h>
#import <Social/Social.h>
#import <Social/SocialDefines.h>
}
4

3 に答える 3

1

実行時にファイルをインポートすることはできません。importsコンパイル時に動作します。上記のマクロは実行時に値を計算するメソッドを使用しているため、達成しようとしていることが可能だとは思いません

于 2012-12-31T06:07:53.077 に答える
1

前述のとおり、#importはコンパイル時のディレクティブです。すべてのプリプロセッサ ディレクティブ (で始まるもの#) は、. したがって、ここでやろうとしているように見えることは、期待どおりには機能しません。

最新の SDK のみを使用してビルドしている限り、#importヘッダーを条件付きで作成する必要はありません。ビルド対象の iOS バージョンに関係なく、最新のヘッダーを使用できます。

コードを異なる SDK バージョンでビルドする必要がある場合 (たとえば、チームメイトのマシンで最新の Xcode を実行できない場合など)、条件付きインポートを行うときです。ただし、これはコンパイル時のことであるため、実行時のチェックではなく、SDK のバージョンに対するコンパイル時のチェックが必要です。次のようなものを使用します。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0
// building with iOS 6 SDK, safe to import Social framework
#endif

繰り返しになりますが、コードが古い SDK を使用してビルドされることが予想される場合にのみ、そのようなことを行う必要があります。

アプリを古い iOS バージョンで実行したいが、条件付きで新しい iOS 機能を使用したい場合は、ランタイム チェックが必要です。また、弱いリンクを利用することもできます。ただし、その場合でも、Apple はバージョン番号を確認しないことをお勧めします。必要な特定の機能を確認することをお勧めします。たとえば、Social フレームワークを使用する場合は、フレームワーク全体を弱リンク(つまり、オプションにする)してから、使用する前に必要なクラスの存在を確認します。

if ([SLComposeViewController class] {
    SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    // ...
}

バージョン番号のチェックを避けるのはなぜですか? ソーシャル フレームワーク API を使用する前に iOS のバージョンが 5.1 よりも大きいことを確認したとします。次に、Apple がセキュリティ ホールを修正するために別の 5.1.x アップデートをリリースしたとします。ここで、あなたのアプリはソーシャル フレームワークを備えたバージョン上にあると認識し、それを使用しようとしてクラッシュし、App Store で悪い評価を得ました。6.0 を調べてみたらどうなるでしょうか... そうすれば、Apple はオリジナルの iPad 所有者を排除することについて考えを変え、ソーシャルを含む iOS6 の機能の一部を少なくとも使えるようにする 5.x アップデートをリリースするかもしれません。これで、アプリはクラッシュしなくなりましたが、ユーザーが iOS の新機能を利用することもできなくなりました。これも 1 つ星のレビューです。

于 2012-12-31T06:48:07.107 に答える
0

構造は次のように非常に単純です。#IF ... #ENDIF

ここにいくつかの便利なリンクがあります: FirstSecondThird

于 2012-12-31T06:02:43.820 に答える