Travis CIで "The requested device could not be found because multiple devices matched the request." が出るときの解消法
要約
- Travis CIでテストを走らせる際に “The requested device could not be found because multiple devices matched the request.” と出て失敗するときの解消法
- Simulatorの指定が一意でなく、対象に複数端末が見つかっていることが原因なので、 実行前に新しいシミュレータを作成し、そのIDで指定する
前提
CIとしてTravis CIを利用しており、以下の設定でテストを実行しています。
language: objective-c xcode_project: Sample.xcodeproj xcode_scheme: SampleTests osx_image: xcode8.2 xcode_sdk: iphonesimulator script: - xcodebuild build-for-testing test-without-building -scheme SampleTests -configuration Debug -sdk iphonesimulator -destination "name=iPhone 7" ENABLE_TESTABILITY=YES | xcpretty
問題
しかし、上記のスクリプトを実行すると、以下のエラーで失敗するケースが少なくありません。
xcodebuild: error: Unable to find a destination matching the provided destination specifier: { name:iPhone 7 } The requested device could not be found because multiple devices matched the request.
原因
Travis CIで割り当てられるイメージの中で destination
の条件に当てはまるシミュレータが複数見つかった場合に失敗します。
解消法
destination
は id
name
,OS
で指定できますが、
今回のように name
だけあるいは name
とOS
で指定すると、
一致するシミュレータが複数存在する可能性があります。(割り当てられるイメージによるため、確実に失敗するとは限りません。)
解消するためにはシミュレータを一意に指定する必要があります。
そこで、 実行前に新しいシミュレータを作成し、そのIDを指定する 方法をとります。
language: objective-c xcode_project: Sample.xcodeproj xcode_scheme: SampleTests osx_image: xcode8.2 xcode_sdk: iphonesimulator before_script: - SIMULATOR_UUID=`xcrun simctl create "iPhone 7" "iPhone 7" 10.2` script: - xcodebuild build-for-testing test-without-building -scheme SampleTests -configuration Debug -sdk iphonesimulator -destination "id=$SIMULATOR_UUID" ENABLE_TESTABILITY=YES | xcpretty
新規作成したUUIDを指定することで、シミュレータが一意に指定でき、失敗しなくなります。
Swift [条件分岐]
条件分岐
if
括弧は使っても問題ないが使わない方を推奨
if 条件式 {
処理
}
let age = 22 var shouldNotDrinkBeer = false if age < 20 { shouldNotDrinkBeer = false } else if age > 60 { shouldNotDrinkBeer = true } else { shouldNotDrinkBeer = false }
三項演算子
ある条件の評価後が true
であれば値Aを, false
であれば値Bを代入
let 変数 = 条件 ? 値A : 値B
let policemanMessage = hasDrivingLicense ? "OK. No Problem." : "I'll arrest you."
switch-case
Enumとの相性がいい
書かなくても break
が入っている状態
どの case
にも合致しない場合 default
の処理が実行される
意図的にフォールスルーしたい場合は fallthrough
を入れる
switch 変数 { case 条件: 処理 case 条件: 処理 case 条件: 処理 default: 処理 }
switch type { case .Normal: // Normal case .Special, .Temporary: // Special or Temporary default: // else }
比較も可能
var n = 10 switch n { case n < 10: // Do something case n < 20: // Do something default: break // No action }
他にもタプルや範囲指定も let where
も使えるがここでは割愛
Swift [メソッド]
メソッド
引数なしメソッド
// 文法 func 関数名() { 処理 }
func showOK() { print("ok") }
引数ありメソッド
// 文法 func 関数名(仮引数: 仮引数の型) { 処理 }
func showMessage(message: String) { print(message) } // Usage: showMessage("Hello world!") // Hello world!
func showMessage(message: String, name: String) { print(message + " from " + name) } // Usage: showMessage("Hello world!", name: "Sasakky") // Hello world! from Sasakky // ラベルもつけられる func showMessage(message: String, withName name: String) { print(message + " from " + name) } // Usage: showMessage("Hello world!", withName: "Sasakky") // Hello world! from Sasakky
返り値付きメソッド
// 文法 func 関数名() -> 返り値の型 { 処理 }
func height() -> Int { return 10 }
func multiply(val1: Int, by val2: Int) -> Int { return val1 * val2 }
Swift [変数]
変数の宣言
Swiftでは、NSInteger
は Int
, NSString
は String
let[var] 変数名: クラス名
のように宣言できます。
再代入不可能な let
宣言後変更しない(できない)変数 宣言時に値の代入(初期化)が必要
let text = "Some text." // 文字列の代入
let count: Int let num = 3 num = 4 // ERROR
正確には代入後のメモリが変更できないということなのでオブジェクトのプロパティの変更は可能
class User { var name: String init(name: String) { self.name = name } } let user = User(name: "Taro") user.name = "Jiro"
再代入可能な var
宣言後変更可能な変数
(Swift 2.0より let
で済む変数が var
で宣言されている場合には Warningが出る)
var n: Int n = 10 n = 100
iOSアプリ開発で便利なことまとめ
ショートカット
実行
command + R
停止
command + .
ビルド
command + B
クリーン
command + shift + K
新規作成
command + N
プロジェクトナビゲータを開く
command + 1
デバッグエリアを開閉
command + shift + Y
ファイルを一つ戻る
command + control + →
ファイルを一つ進む
command + control + ←
.hファイルと.mファイルを行き来する
command + control + ↑
command + control + ↓
スタートウィンドウ
command + shift + 1
デバイスマネージャ
command + shift + 2
Alcatraz
command + shift + 9
※ 導入済の場合
Quick Open
command + shift + O
(多分)
command + control + O
にカスタムしちゃってるのでうろ覚え
ショートカット(テキスト系)
検索
command + F
ファイル内検索
command + control + F
ファイル内置換
command + shift + F
全検索
ジャンプ
command + click
ヘッダファイルへジャンプ
エディタ
スニペット
よく使うコードをスニペット化して保存しておける
デバッグ
ブレークポイント
ブレークポイントをある行に仕掛けるとその行が実行される瞬間に一時停止する
ウォッチウィンドウにその瞬間の変数に入っている値が表示される
Quick Look ボタンを押すとUI部品だった場合見た目まで表示される
一時停止時、コンソールに
po self.view.frame
とか打ち込むと値が表示される(po = print object)
※ Xcode6 + Swift 1.2 のとき selfが認識されないことが多々
View Hierarchy
デバッグ時に使える
実行中のViewの階層構造を3D表示できる
UIが崩れた時に原因を探るのにとても便利
スタックトレース
ブレークポイントでひっかけたり、クラッシュしたときにどの箇所で止まっているか、
どのメソッドから呼びだされているのかがわかる
プラグイン
Alcatraz
https://github.com/trawor/XToDo
プラグインマネージャ
インストール、管理が簡単にできる
Fuzzy Autocomplete
https://github.com/FuzzyAutocomplete/FuzzyAutocompletePlugin
曖昧でも補完してくれる。かなり便利
ただちょっと重い
VVDocument-Xcode
https://github.com/onevcat/VVDocumenter-Xcode
///
と打ち込むだけで適切なコメントテンプレートを用意してくれる
XAlign
https://github.com/qfish/XAlign
command + shift + X
でインデントを綺麗にしてくれる
XTodo
https://github.com/trawor/XToDo
control + T
でTODOを一覧表示
(別に検索でも良い気はしている)
Xcodeの見方
ざっくりと。
エリア
ツールバー
コマンド
- Run
- 実行ボタン
- 長押しで Test, Profile, Analyze選択できる
- Stop
- 停止ボタン
- 複数実行中の場合は長押しで個別選択できる
環境
エディタ
- Standard Editor
- エディタエリアを通常表示
- Assistant Editor
- エディタエリアをパネル分けで複数表示
- +ボタンを押せば2枚以上表示可能
- Interface BuilderのUIを各画面サイズでプレビューもできる
- Version Editor
- Gitの差分表示
エリア
ナビゲーションエリア
- Project Navigator
- ファイルツリー
- Symbol Navigator
- クラスやメソッドを表示
- Find Navigator
- 検索
- Replace All や正規表現も利用可能
- Issue Navigator
- WarningやErrorを表示
- Test Navigator
- テスト項目を表示
- Debug Navigator
- 実行時にCPUやメモリ使用量スタックトレースなど表示
- Breakpoint Navigator
- 設定されているブレークポイント
- Report Navigator
- 使ったことない。笑
ユーティリティエリア
Inspector(上部)
- File Inspector
- 選択されているファイルの詳細
- ファイル名やファイルパスの変更が可能
- Help Inspector
- 選択している箇所のヘルプを参照
- Identity Inspector
- (Interface Builderのみ)ファイルの識別
- Attributes Inspector
- (Interface Builderのみ)属性設定
- Size Inspector
- (Interface Builderのみ)サイズ設定
- Connection Inspector
- (Interface Builderのみ)IBOutletやIBAction, delegateなどの接続状態
Library(下部)
- File Templete Library
- New File時に出てくるのテンプレート
- ナビゲーションエリアにドラッグアンドドロップで作成可能
- Snipet Libray
- スニペット
- エディタエリアにドラッグアンドドロップで挿入できる
- Object Library
- Interface Builderで利用できるオブジェクト
- Interface Builderにドラッグアンドドロップで追加できる
- Media Library
- プロジェクトに追加された画像や音楽メディアファイル
- Interface Builderにドラッグアンドドロップで設定できる
デバッグエリア
- Toggle Debug Area
- 開け閉め
- Breakpoint
- ブレークポイントのオンオフ
- Pause/Continue
- 一時停止と続行
- Step over
- Step in
- Step out
- View Hierarchy
- Viewの階層構造を視覚的に見る
- Simulate Location
- 位置情報をシミュレーションする