8

現在、iOS アプリを販売しており、同じコード ベースを使用して XCode 5 DP で iOS 7 バージョンを開発しています。

既存の iOS 5/6 のお客様向けに今すぐアップデートをリリースする必要がありますが、もちろん、プロジェクトを XCode 4 に再ロードすると、Base SDK が 7 ではなく iOS6 になるため、存在しないプロパティについてエラーが表示されます。

// Only run this bit on iOS 7
if ([self respondsToSelector:@selector(setFooForExtendedLayout:)])
{
    self.fooForExtendedLayout = UIFooEdgeLeft | UIFooEdgeRight;
}

float bottomOffset = 0;
// Only run this bit on iOS 7, else leave bottomOffset as 0
if ([self.hostController respondsToSelector:@selector(bottomLayoutFoo)])
    bottomOffset = self.hostController.bottomLayoutFoo.length;

(NDA 違反を避けるために難読化されています)

XCode エラー:

タイプ「UIViewController *」のオブジェクトにプロパティ「fooForExtendedLayout」が見つかりません

宣言されていない識別子「UIFooEdgeLeft」の使用

宣言されていない識別子「UIFooEdgeRight」の使用

タイプ「UIViewController *」のオブジェクトにプロパティ「bottomLayoutFoo」が見つかりません

この新しいコードをコメントアウトするのは面倒です。古いベース SDK と新しいベース SDK の両方と互換性があるように書き直す正しい方法は何ですか? また、今 (XCode 4 を介して iOS 6 SDK に対してビルドされた) それを提出すると、App Store で拒否されるリスクがありますか?

4

5 に答える 5

7

iOS 6 と 7 の両方の SDK でコンパイルできるコードを作成するには、次の方法をお勧めします。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
        self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight;
#endif
于 2013-10-31T10:51:04.610 に答える
1
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
#endif
于 2013-09-23T12:23:51.003 に答える
-2

編集: Xcode 5 がリリースされたため、この回答 (および質問) はもはや関係ありません! 反対票を投じるときはこれを考慮してください;)

SCM ツールを使用して 2 つの異なるコード ブランチを取得する理由は、Xcode Developer Preview バージョンと、同一のXcode プロジェクトと同じコードおよびリソース ベースを持つ Xcode Release バージョンを切り替えるときに発生する可能性がある微妙な問題によるものです。プロジェクト ファイルとストーリーボードまたは xib は内部で変更される可能性があり、破損する可能性があります。コードで解決策を見つける方法がないからではありませんとはいえ、同一のXcode プロジェクトで異なるXcode バージョンを使用することはお勧めしません。頭痛の原因になるかも!


正しい方法は、git などのソース コード管理ツールを使用することです。リリース バージョンを維持する「iOS 6」ブランチが必要であり、Xcode と iOS のプレリリース バージョンを使用する 1 つ以上の開発ブランチが必要です。

于 2013-08-19T08:21:21.220 に答える