1

親愛なるstackoverflowers!

現在、App Store に提出する iPhone アプリを準備しています。これはより大きなクロスプラットフォーム C++ プロジェクトであり、そのためには Xcode を IDE として捨て、より「クロスプラットフォーム タイプ」のビルド システムに移行する必要がありました。今のところ、これは単純な Makefile です。XCode ビルド チェーンを使用するだけで、XCode 自体は使用せずに、開発プロセス中にすべてが正常に機能しました。しかし、ここで、どうすればいいのかよくわからない最後のハードルがあります。

Apple の Application Loader が私の .ipa ファイルについて吐き出した、他の多くのパッケージング関連のエラーの後、この最後のエラーがあります。

"The bundle is invalid. Apple is not currently accepting applications built with this version of the SDK or Xcode."

このエラーが発生したのは明らかに私だけではありませんが、この問題を解決する方法を説明している他のほとんどの記事は、Xcode 設定を介して解決するか、明らかに時代遅れです (2011 以前)。

アプリに関する事実:

2 日前、アプリはまだ iOS 5.0 SDK に対してリンクされていました。エラーが発生したため、アプリを最新の新しい SDK 6.1 にリンクするのに時間を費やしました。それで、それは道を外れていますが、まだエラーです(ただし、アプリローダーの背後にあるサーバーが実行可能ファイルを「解析」して、SDKのどのバージョンにリンクしているかを確認しようとするとは思いませんでした...またはそれを行います、そしてそこにiOS 5.0 へのいくつかの残存リンクはありますか?)

次は、Info.plist です。さて、ここにあります:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleDisplayName</key>
  <string>Drone game</string>
  <key>CFBundleExecutable</key>
  <string>game</string>
  <key>CFBundleIconFiles</key>
  <array>
    <string>icon.png</string>
    <string>icon@2x.png</string>
    <string>icon-iPad.png</string>
  </array>
  <key>CFBundleIdentifier</key>
  <string>[The bundle identifier]</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleIconFile</key>
  <string>icon.png</string>
  <key>CFBundleName</key>
  <string>Drone game</string>
  <key>CFBundlePackageType</key>
  <string>APPL</string>
  <key>CFBundleShortVersionString</key>
  <string>1.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>1.0</string>
  <key>LSRequiresIPhoneOS</key>
  <true/>
  <key>NSMainNibFile</key>
  <string>MainView</string>
  <key>CFBundleResourceSpecification</key>
  <string>ResourceRules.plist</string>
  <key>UIRequiredDeviceCapabilities</key>
  <array>
    <string>armv7</string>
  </array>
  <key>UISupportedInterfaceOrientations</key>
  <array>
    <string>UIInterfaceOrientationLandscapeRight</string>
  </array>
  <key>UIApplicationExitsOnSuspend</key>
  <true/>
  <key>UIStatusBarHidden</key>
  <true/>
  <key>LSApplicationCategoryType</key>
  <string></string>
  <key>UIInterfaceOrientation</key>
  <string>UIInterfaceOrientationLandscapeRight</string>
  <key>MinimumOSVersion</key>
  <string>6.1</string>
  <key>LSRequiredIPhoneOS</key>
  <true/>
  <key>UILaunchImageFile</key>
  <string>Default.png</string>
  <key>CFBundleGetInfoString</key>
  <string></string>
  <key>UIDeviceFamily</key>
  <array>
    <integer>1</integer>
    <integer>2</integer>
  </array>
</dict>
</plist>

アプリケーション ローダーによって検出されたアプリのプロパティ リストにまだいくつかのオプションが欠落しているか、いくつかの値が間違った方法で入力されていると思います。問題の一部は、Xcode を使用していない場合、Apple の開発者ガイドがあまり役に立たないことです。「使用しない、Xcode で入力」とマークされているキーがたくさんありますが、説明はほとんどありません (例: MinimumOSVersion)。

本質的な質問は次のとおりです。アプリケーション ローダーが使用済みの SDK バージョンをどこから取得するか知っている人はいますか? または、Application Loader は「Xcode バージョン」を気にし、どこかに指定する必要がありますか? どんなアドバイスも素晴らしいでしょう!

4

2 に答える 2

0

データはその決定の基礎であり、おそらくInfo.plistにはありません。情報がどこにあるかについては、プロセスのその部分がかなりブラックボックスであり、それに関するドキュメントがないため、私にはわかりません。

物事をより簡単に、より簡単にするために、私が提案するのは、開発とテストのためにクロスプラットフォームIDEを維持することですが、公開する準備ができたら、Xcodeを使用してください。これを行う必要がある理由はいくつかあります。

  1. Xcodeではバージョンのアーカイブが簡単です。これにより、アーカイブしたアプリケーションのバージョンの適切に管理されたリストが保持されるため、後でデバッグするためにdSYMとコードを使用できます。このアーカイブプロセスはアプリアップロードシステムに統合されており、その時点で公開したコードを追跡するのに役立ちます。

  2. アプリケーションローダーはXcodeの一部です。すべてに互換性があることなどを確認するために、.ipaは実際には同じバージョンのXcodeで作成する必要があります。次に、バンドルが拒否された場合は、別のバージョンを試す必要があります。これは、ビルドプロセスの一部ではないことがわかります。

私はあなたの質問を避けているように思えるかもしれませんが、最終的にあなたがApp Storeルートにアップロードするとき、Appleはそれを完全にカバーしています。そのため、私たちは彼らのルールに従ってプレーしなければなりません。彼らは、あらゆる種類の危険なビルドがApp Storeに到達するのを防ぎたいので、厳選されたアップロードプロセスを持っています。

クロスプラットフォームIDE/開発は良いルートであり、すべてが解決されたように見えますが、独自のアプリストアシステムへのアップロードに関しては、もはやクロスプラットフォームにすることはできません。

于 2013-02-01T15:21:16.123 に答える
0

わかりました。しばらく時間がかかりましたが、先週、Xcode を使用せずに Application Loader を使用してプログラムを送信することに成功しました。問題は、XCode でビルドされたプロジェクトからリバース エンジニアリングした、文書化されていないキーの束でした。同様のことを達成したいすべての人のために、ここで私のために働いた変更されたInfo.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

使用されている OS のバージョン文字列を持つ新しいマジック キー。この文字列を生成する方法がわかりません。これは Xcode が別の plist に書き込んだもので、コピーしました。

    <key>BuildMachineOSBuild</key>
    <string>11G63b</string>

.

    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleDisplayName</key>
    <string>Drone game</string>
    <key>CFBundleExecutable</key>
    <string>game</string>
    <key>CFBundleIconFiles</key>
    <array>
        <string>icon.png</string>
        <string>icon@2x.png</string>
        <string>icon-iPad.png</string>
    </array>
    <key>CFBundleIdentifier</key>
    <string>[The bundle identifer]</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>NSHumanReadableCopyright</key>
    <string>[Copyright notice]</string>
    <key>CFBundleIconFile</key>
    <string>icon.png</string>
    <key>CFBundleName</key>
    <string>Drone game</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>

ここに本当の魔法があります。ここでも、どこにも文書化されていないいくつかのキーがありますが、問題の説明のエラー メッセージを考えると、キー DTSDKName と DTSDKBuild が特に重要であると思われます。ええ、でも Xcode のバージョン文字列 (なぜ Apple はそれを知りたいのですか?) と iPhone のバージョン文字列です。繰り返しますが、これらを生成する方法がわかりません。

    <key>DTCompiler</key>
    <string></string>
    <key>DTPlatformBuild</key>
    <string>10B141</string>
    <key>DTPlatformName</key>
    <string>iphoneos</string>
    <key>DTPlatformVersion</key>
    <string>6.1</string>
    <key>DTSDKBuild</key>
    <string>10B141</string>
    <key>DTSDKName</key>
    <string>iphoneos6.1</string>
    <key>DTXcode</key>
    <string>0460</string>
    <key>DTXcodeBuild</key>
    <string>4H127</string>

これも変更しました。変更したことを覚えていないので、これはコピーアンドペーストのアーティファクトだと思います....

    <key>CFBundleSignature</key>
    <string>ASDR</string>

.

    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>NSMainNibFile</key>
    <string>MainView</string>
    <key>CFBundleResourceSpecification</key>
    <string>ResourceRules.plist</string>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
        <string>armv7</string>
    </array>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UIApplicationExitsOnSuspend</key>
    <true/>
    <key>UIStatusBarHidden</key>
    <true/>
    <key>LSApplicationCategoryType</key>
    <string></string>
    <key>UIInterfaceOrientation</key>
    <string>UIInterfaceOrientationLandscapeRight</string>

古いバージョンに変更されました.Application Loaderによる拒否の責任はないようですが、5.0はとにかく正しいです

    <key>MinimumOSVersion</key>
    <string>5.0</string>  

.

    <key>UILaunchImageFile</key>
    <string>Default.png</string>
    <key>CFBundleGetInfoString</key>
    <string></string>
    <key>UIDeviceFamily</key>
    <array>
        <integer>1</integer>
    </array>
</dict>
</plist>

バンドル

最後に、有効な「.app」ディレクトリをコンパイルできると仮定して、これからバンドルを生成する必要があります ( ios-simを使用してシミュレータで「.app」ディレクトリを実行するか、携帯電話に展開して確認してください)。Fruitstrapを使用する- 優れたツールです!)。私は ipa-bundle を選びました。次のスクリプトを使用して、.app-directory から生成しました。

#!/bin/bash
cp embedded.mobileprovision [.app directory]
codesign --force --sign "[Distribution Key Identifer]" --entitlements Entitlements.plist [.app directory]
cd [.app directory]
ln -s _CodeSignature/CodeResources CodeResources
cd ..
/usr/bin/xcrun -verbose -log -sdk iphoneos PackageApplication -v [.app directory] -o "$(pwd)/[bundle name].ipa" --sign "[Distribution Key Identifer]" --embed embedded.mobileprovision

embedded.mobileprovisionは、Apple のモバイル プロビジョニング センターからダウンロードした配布プロビジョニング プロファイルです。.app ディレクトリにコピーして貼り付けるだけです。

[Distribution Key Identifer]キーチェーンからの配布署名の識別子です。

コード署名は 2 回実行されることに注意してください。1 回は「PackageApplication」の一部として、もう 1 回は手動で呼び出されます。明らかに、有効な .ipa を構築するために何が必要かはわかりませんが、これはうまくいきました。不要な手順を取り除いて、これを自由に改善してください。

これが、似たようなことを達成しようとしている人に役立つことを願っています。

于 2013-02-13T14:07:59.280 に答える