iOSDC 2018 day2 参加メモ
iOSDC 2018の2日目参加メモです。
iPhone が数秒おきにクラッシュするんだけど!
- iPhoneが再起動する
- 12月2日から突然発症
- 一部アプリの通知をオフにすると解消
- Zaimサーバ側、Xcodeにエラーなし
- 原因判明
- LocalNotificationをコメントアウトしたら発生しなくなった
- LocalNotificationなしバージョンを作る
- ユーザを救いたい。が、アプリ削除、通知オフは避けたい
- 13月は対象外のエラーメッセージが出ていることがわかる
- AppleからiOS11.2がリリースされて解消する
- iOS11.2へのアップデートにはアンインストールor通知オフにしなければならず残念
- 解消後、Blog, Twitter等で一般ユーザ、技術者向けに情報発信
- 対象iOS: 11.0.x 11.1.x
- なぜZaimが対象になったか?
- 日本がJSTで12月2日になるのが速い
- 多くのユーザが使っている
まとめ
- Blog, Twitter等の調査
- デモコードを可能な限り作って、テストする
- 英語で騒ぐ
- 修正版を申請して、広報する
詳解Fastfile
Fastlane活用事例
- コードレビュー
- リリースフロー管理
- サブミット
- リリースビルド(CIのみ)。slack bot と 定期実行。
- 社内向けビルド自動化。Enterpriseライセンス
- メトリクスの監視。ビルド時間、CIのコードカバレッジ
Fastfileの基本
- ありがちなこと。なんでもfastfileに書きがち
- 基本的にはRubyで、便利な独自機能もある
- private_lane。内部からしか呼べないlane
- private_lane と def は違う
- returnではなくnextを使う
- importを使って巨大なFastfileを分割できる
# vim: syntax=ruby
と1行目に書くとシンタックスハイライトがつく- 公式ドキュメントのAdvancedに詳しく書かれている
読みやすいFastfile
- Fastfileへの記述量を減らしていく
- Fastfileはコードを書く場所ではない
- 多くの変数定義をFastfileに書かない。環境変数を使う
- 設定とロジックを分離する
- 引数に渡すのではなく設定ファイルGymfileなどに書く
- Actionを分離する
- プロジェクトごとにActionを定義できる
- new_actionコマンド
- Action分離のメリット
- パラメータのバリデーションがしやすいConfigItem
- テストが書きやすいrspec
- ConfigItemのtype:Arrayはカンマ区切りの文字列がくるとArrayに変換してくれる
- コードサイン
- 複雑になりがち
- コードサインはXcodeで設定するといいがXcodeは不安定なので微妙かも
デバッグ技術
Depth in Depth
- Depth:深度、奥行き
- 写真をボケさせるのに使われている
- その他にも背景を飛ばしたり、3Dスキャンしたり、できる
- zozosuiteも使っている(っぽい)
深度の種類とセンサ
- 視差:Disparity
- 左右の見え方の違い
- 7/8 Plus, X の背面カメラ
- DepthはDisparityから計算できる
- Time??? todo あとで修正
- 光 Ture Depth??? todo あとで修正
- iPhoneXの前面カメラ
実装
- どの方法でも最終的にはAVDepthDataで取得
- depthDataMap 深度マップのピクセルデータ
- 方法1:写真から、ImageIO利用
- 方法2:カメラからリアルタイム、AVFoundationを利用
- 方法:ARキットから、captureDepthDataというプロパティ
- 方法に優劣はない。用途によって選ぶ
背景合成について
- CIBlendWIthMaskを使うだけ
- CIFilterはMetalのパイプラインで実行されるので速い
- 深度なので背景が???でうまくいかない
- 顔認識して深度マップを2値化する
- ギザギザもある。スムージングで対策
- 深度が取れないところがある。holesという。RGBで保管
- isFilteringEnabled便利なプロパティ
- PortraitMatteがある
- セグメンテーション特化したマスクを取得できる
- 利用条件有り
- 静止画のみ
- 人が写っていないといけない
ARKit Maniacs
「QRコード読み取り?楽勝ですよ😙」=>「AVFoundationを信じたおれがバカだった😇」
- 今回の例ではQRコードが8つあった
- 調べてみる
- QRコードの連結機能なことを知る
- 最大16個に分割可能
- JISの規格を確認
- 複数のモードがあることも知る
- AVFoundationでは無理、、、ではなくなった
- iOS11のCIQRCodeDescriptorで可能
- ただし、デコードは自前。モード毎に実装する必要がある
Synchronized iPhones!
やりたいこと
- リフレッシュレートに合わせて同じ画面を表示する
- 誤差は16.66msec以内に抑える
- リフレッシュレートにあわせた描画にはCADisplayLinkを使う
時刻同期
- iOSはどのように時刻を合わせているか
- インターネット上の時刻サーバ(NTP)、GPS、携帯電話回線(NITZ)の3つ
- どれが優先されているかは公表されていない
- NTPとNITZはUTC、GPSはGPS TIME
- JST, UTC, TAIとGPS TIMEについて
デバイス同期
- 時刻同期では実現できないことが判明Bluetoothを使うことに
- 平均して20-40msecの遅延が発生した
- 通信の遅延を消去する事を考える
- 通信時間の削除
- 通信時間は距離に依存する
- PeripheralとCentralが相互に誤差を送り合って補正することで遅延を収束させられた
- 通信障害が発生
- 接続可能なCentral数は仕様上の制限はないが制限がある
- 2階層から複数階層にしたが安定性に課題あり
UIViewとUITextInputで作る縦書きのTextView
UITextInputの機能の紹介もあり有用