sasayakki

新卒iOSエンジニアがささやくブログ

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 の条件に当てはまるシミュレータが複数見つかった場合に失敗します。

解消法

destinationid name,OS で指定できますが、 今回のように name だけあるいは nameOSで指定すると、 一致するシミュレータが複数存在する可能性があります。(割り当てられるイメージによるため、確実に失敗するとは限りません。) 解消するためにはシミュレータを一意に指定する必要があります。 そこで、 実行前に新しいシミュレータを作成し、その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を指定することで、シミュレータが一意に指定でき、失敗しなくなります。

TODO

Swift

  • 変数
  • メソッド
  • 条件分岐
  • ループ
  • 配列
  • タプル
  • 構造体
  • クラス
  • Enum
  • Optional
  • Extension
  • Protocol
  • Generics
  • Closure
  • Access Control
  • Comment

iOS

  • ライフサイクル
  • UIViewController
  • UIView
  • UIScrollView
  • UITableView
  • UICollectionView

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では、NSIntegerInt, NSStringString

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の見方

ざっくりと。

エリア

Kobito.CJb6pX.png

ツールバー

Kobito.IheSvv.png

コマンド

  • Run
    • 実行ボタン
    • 長押しで Test, Profile, Analyze選択できる
  • Stop
    • 停止ボタン
    • 複数実行中の場合は長押しで個別選択できる

環境

  • Scheme
    • 各実行環境の設定ができる
  • Device
    • 実行する端末を選択できる
    • シミュレータか実機
  • Status
    • Xcodeの状態を表示

エディタ

  • Standard Editor
    • エディタエリアを通常表示
  • Assistant Editor
    • エディタエリアをパネル分けで複数表示
    • +ボタンを押せば2枚以上表示可能
    • Interface BuilderのUIを各画面サイズでプレビューもできる
  • Version Editor
    • Gitの差分表示

エリア

  • Navigator
    • ナビゲーションエリアを表示/非表示
  • Debug Area
  • Utitlities

ナビゲーションエリア

Kobito.ckr3oM.png

  • Project Navigator
    • ファイルツリー
  • Symbol Navigator
  • Find Navigator
  • Issue Navigator
    • WarningやErrorを表示
  • Test Navigator
    • テスト項目を表示
  • Debug Navigator
  • Breakpoint Navigator
  • Report Navigator
    • 使ったことない。笑

ユーティリティエリア

Inspector(上部)

Kobito.ta7d0C.png

  • File Inspector
    • 選択されているファイルの詳細
    • ファイル名やファイルパスの変更が可能
  • Help Inspector
    • 選択している箇所のヘルプを参照
  • Identity Inspector
    • (Interface Builderのみ)ファイルの識別
  • Attributes Inspector
    • (Interface Builderのみ)属性設定
  • Size Inspector
    • (Interface Builderのみ)サイズ設定
  • Connection Inspector
    • (Interface Builderのみ)IBOutletやIBAction, delegateなどの接続状態

Library(下部)

Kobito.2syFNl.png

デバッグエリア

Kobito.zJRBek.png

  • Toggle Debug Area
    • 開け閉め
  • Breakpoint
  • Pause/Continue
    • 一時停止と続行
  • Step over
  • Step in
  • Step out
  • View Hierarchy
    • Viewの階層構造を視覚的に見る
  • Simulate Location
    • 位置情報をシミュレーションする