43
43

More than 5 years have passed since last update.

Facebookアプリ申請文書にあったiOSシミュレータービルドで微妙にハマってた。

Last updated at Posted at 2015-03-04

「Facebookのレビュー申請文書に、iOSシミュレータービルドっていうのがあるよ」と言われて『ほぇー!(°▽°』と思って試してみたら微妙にハマったので、メモ

実際に、該当する文章は以下

iOS Simulator Build or Apple Store ID listed in Settings

Facebookのレビュー全体の日本語訳はこの辺りがよさそう

iOSシミュレータービルドとは?

  • ザックリというと、開発しているアプリを他のマシンのiOS Simulatorで動かすためのビルド(多分)
  • Facebookへのアプリ申請とかだと、AppStoreでの公開前にFacebookの審査を受けたいはずなので、使えると便利なはず

手順

基本的にはFacebookの開発者向けサイトに記載されている

実際に行った手順

1. 開発しているプロジェクトの xcodeprojファイルがあるフォルダに行く

$ cd MyApp

2. 最新のsdkのバージョンを確認する

  • xcodebuild -showsdks
$ xcodebuild -showsdks
OS X SDKs:
    OS X 10.9                       -sdk macosx10.9
    OS X 10.10                      -sdk macosx10.10

iOS SDKs:
    iOS 8.1                         -sdk iphoneos8.1

iOS Simulator SDKs:
    Simulator - iOS 7.0             -sdk iphonesimulator7.0
    Simulator - iOS 7.1             -sdk iphonesimulator7.1
    Simulator - iOS 8.1             -sdk iphonesimulator8.1 ←今回はコレ
  • 一番新しい iphonesimulatorを覚えておく

3. ビルドする

  • xcodebuild -arch i386 -sdk iphonesimulator{version}
$ xcodebuild -arch i386 -sdk iphonesimulator8.1
(略)
** BUILD FAILED **
MyApp

The following build commands failed:
    CompileC build/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/i386/hoge.o MyApp/Controller/hoge.m normal i386 objective-c com.apple.compilers.llvm.clang.1_0.compiler
  • ターゲットに入れていなかった何かがひっかかったようです
  • 問題が無い場合は、ここで、BUILD SUCCEEDEDと出ているはずです

BUILD FAILEDした場合

  • どういうスキーマとターゲットがあるのかを確認しておきます
xcodebuild -list
  • Build ConfigurationsとSchemesで使うヤツを覚えておきます

  • 『xcodebuild -schema {myscheme} -configuration {target configuration} -arch i386 -sdk iphonesimulator{version}』を実行

$ xcodebuild -scheme MyApp -configuration Release -arch i386 -sdk iphonesimulator8.1

(略)
    /usr/bin/touch -c /Users/ionis_h/Library/Developer/Xcode/DerivedData/MyApp-abcdefabcdefabcdefabcdefabcd/Build/Products/Release-iphonesimulator/MyApp.app

** BUILD SUCCEEDED **
  • BUILD SUCCEEDEDの直前にあるパスを記憶しておきます
    • "/Users/ionis_h/Library/Developer/Xcode/DerivedData/MyApp-abcdefabcdefabcdefabcdefabcd/Build/Products/Release-iphonesimulator/MyApp.app" の部分
2015/12/9 追記

masuharaさんに教えて頂きました!
利用しているもの等の違いで、プロジェクトによっては、以下のコマンドになるようですよ。

$ xcodebuild -arch x86_64 -sdk iphonesimulator9.1 -configuration Release -workspace アプリ名.xcworkspace -scheme アプリ名

詳しくはmasuharaさんのコメントを参照してみてください。

4. 動作確認

I. マシン上のデバイス確認

$ xcrun simctl list devices

(略)
    iPhone 6 (********-****-****-****-************) (Booted)
  • 表示されるデバイスIDを覚えておく
  • Bootedと表記されているので、この場合はすでに起動済み

II. シミュレーター起動

1つ前の手順ですでに起動している場合は、この作業は不要

$ open -a "iOS Simulator" --args -CurrentDeviceUDID ********-****-****-****-************
  • ***...の部分は先程覚えておいたデバイスID
CUI起動で良い場合
  • 手動での動作確認が不要である場合は、GUIは不要なので、以下で
$ xcrun simctl boot

III. インストール

ビルド時に覚えておいたパスを使ってインストールする

$ xcrun simctl install booted /Users/ionis_h/Library/Developer/Xcode/DerivedData/MyApp-abcdefabcdefabcdefabcdefabcd/Build/Products/Release-iphonesimulator/MyApp.app
  • 実はビルド時に、プロジェクト配下の「build/Release-iphonesimulator/」にもappフォルダが作成されている
    • ただし、こちらを指定すると以下のようなエラーが出てしまいインストールが出来なかった
$ xcrun simctl install booted build/Release-iphonesimulator/MyApp.app
simctl[10713:1007] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff8ac2b25c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff95329e75 objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8ab2add1 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:] + 385
    3   CoreFoundation                      0x00007fff8ab40ad9 +[NSDictionary dictionaryWithObjects:forKeys:count:] + 57
    4   simctl                              0x00000001079f16a6 simctl + 13990
    5   simctl                              0x00000001079f2d5d simctl + 19805
    6   libdyld.dylib                       0x00007fff943c95fd start + 1
    7   ???                                 0x0000000000000004 0x0 + 4
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Abort trap: 6

なおインストール時に指定した、bootedは、起動させたデバイスIDを指定するのでもOKです。

IIII. 後始末

動作確認が終了したら、シミュレーターをシャットダウンする

xcrun simctl shutdown ********-****-****-****-************
  • ***...の部分は覚えておいたデバイスID

その後は、シミュレーターにインストールした方のappをzipで固めて、facebookへ申請したりする。
このappファイルを他のマシンにコピーして、「4. 動作確認」以降の手順を行えば、開発マシン以外でsimulatorでの動作確認も出来るはず。
(そんな事がしたい状況はあまり無い気はします。)

参考にしたリンク

43
43
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
43