iOSDC 2016 に参加してきました
iOSDC 2016
2016年8月20日午前10時3分 土
iOSDC 2016 に参加してきました。
とても濃く、参考になる内容ばかりでした。
次回開催があれば是非また参加したいです。
懐かしい面々にも再会でき、そういった意味でも参加してよかったです。
try! Swift で「凄い内容でしたねー、レベル高かってですねー」って一緒に話してた人たちが今回バンバン発表者側に回ってて「自分はこの半年何やってたんだろ」みたいな取り残されてる感を覚えたり。まぁそれも含めて良い刺激になったということで。
以下雑なメモです。
- iOSDC 2016
オープニング
Handling rich text in Swift
@k_katsumi さん
iOS におけるテキストレイアウトの仕組み
- 適当に作ると
- インデントずれ
- 小文字y,gの下が切れる
- 行間が詰まってる
- iOS のテキストの描画の仕組みを説明
iOSのテキストレイアウトについて
- iOS 7 以降のテキストレイアウト TextKit
- 高速なモダンテキストレイアウト・レンダリングエンジン
- CoreTextで作られている
- UIKitとの統合
- UILabel
- 「TextKit を使う」とは UILabel を使ったりすることと同義
- UILabel を普通に使う
- ヒラギノとシステムフォント
- 何も考えずにヒラギノ指定するとy,gの下が切れたり行間が詰まったり
- 行の高さは何で決まるか
- フォントが持つ高さの情報
- iOS, Mac のヒラギノは特殊なメトリクスを持つ
- Ascent, Descent が狭い
sizeToFit
するとキレる
- 上下に Descent を補う
- ヒラギノのメトリクスに注意
- ヒラギノを明示的に指定しない
- システムフォントを使う
- デザイン指示書でのヒラギノ指定は大抵システムフォントを意図してるはず
- 中国語ようフォントにフォールバックしたくない可能性
- ヒラギノを指定する場合、アルファベットに気をつける
- 日本語フォントにフォールバックさせる方法もある
UITextView
- デフォルトのマージン
- textContainerInset
- ヒラギノを指定した場合
- font.leading
- デフォルトのスタイルをリセットする
- textContainerInset に UIEdgeInstanseZero を突っ込む
- usesFontLeading を false に(デフォルト true)
様々なスタイルに適用
- 行間
NSAttributedString
- min/maxLineHeight
- 複数の大きさの文字を同時に描画する際に参照される
NSAttributedString を活用する
- 箇条書きを一つの UITextView で実装
まとめ
- iOS 7 以降のレイアウトはいかに綺麗な
NSAttributedString
を設定できるか - タイポグラフィの基礎を知ろう
- フォントにヒラギノを指定するときは注意
- できるだけシステムフォントを使おう
QA
- システムフォントを指定するとヒラギノ指定時より小さくなるが?
- システムフォントを指定した場合の見え方をデザイナと共有するのがいい
- ダメなら
NSAttributedString
を頑張って指定していくしかないがしんどい
- イラレで見てたフォントのサイズと見え方が違って驚かれる
RxSwift は開発をどう変えたか?
@_ishkawa さん
RxSwift
- RxSwift とは
- イベントストリームを抽象化するライブラリ
- Obsevable
- RxCocoa が提供
- subscribe にイベントごとにクロージャを指定
- bindTo
- イベントストリームを接続できる
- Operator
- Observable の変換絞り込み組み合わせ
Rx vs 従来方式
- Rx
viewDidLoad
で全ての実装が完了する- 水道管にホースをつなげていく感じ(?)
- 従来方式
- IBAction
- シンプルな仕様であれば読みやすいですね
- バケツに水を入れるイメージ(?)
Rx
- 全てのイベントストリームの表現手段が同じ
- 貯めておいて後で取りに行くという動作がない
- イベントストリームの依存関係がoperatorで表される
現在地の天気アプリ
- Rx が有利になる例
- 位置情報の利用を許可するかどうか聞く
- 従来方式
- パッと全体のフローを追うのは難しい
- Rx
- 処理の流れが追える
- 複雑な制御もバインドだけで
まとめ
- イベントストリームを宣言的に扱えるようになった
- 複雑なイベントストリームでも全体を把握しやすい
- ストアドプロパティによる状態管理を減らせる
ishkawa さんは Swift 本執筆中とのこと。冬(今年とは言っていない)
QA
- もっと実用に即したらコード量どれぐらい?
- イメージでは少し増える。言っても1.5倍ぐらい
combineLatest
- 実開発では全部 Rx ?
- 目指してはいるがなってない
- variable で橋渡し
iOS10時代のCollectionView最新つかいこなし
@TachibanaKaoru さん
New Lifecycle of Cells
- 10000 cells for 10000-row table?
- No
- セルはいつも表示される数だけ
- iOS 10 では
- queue にストアされる cell の数が増えた
- 生成処理が遅れる可能性が低くなる
- メモリ使用量は増えている
- prefetchDataSource
- iOS 10 で増えたqueueの1画面分が増えた
For better Performance
- セルサイズ固定の方が高速
- セルの処理フローを想定した高速か
- 思い処理は cellForItemAtIndexPath で
- 描画処理の高速化
- Blend-Layer処理をなるべく使わない
- シミュレータの debug->color blend layer でチェック
- 赤のレイヤーはパフォーマンス低下させてるかも
- 透過pngファイルやclearColor背景を使わない
- 塗りの背景上に画像を表示する場合
- 画像に背景色を含めることで高速化可能
- clearColor背景を使用しない
- UILabel の背景色を後ろの背景に揃える
- 塗りの背景上に画像を表示する場合
- View の角丸やシャドウ処理を避ける
- Blend-Layer処理をなるべく使わない
QA
- prefetch とかはデリゲートで、iOS9 ユーザに害はない?
- その通り
- 例えばどんな場合に使う?
- 画像の先読み、データソースの内容に合わせてレイアウトの計算とか
Reactive State Machine
@inamiy さん
- Reactive
- Swift FRP用ライブラリ
- 状態の変更
- 状態の取得
- FRP + MVVM で状態管理が楽に
ポケモンで例える
- 野生のビューモデルが飛び出してくる
- ビューの数だけビューモデルが出てkるる
- FRP + MVVM
- データフローであり、状態管理ではない
- 汚いイベントを流すことができたり
- 汚いデータフローをつなぐこともできたり
予測可能な状態
- React.js
- データフローの固定
- 状態数を最小化
- View をステートレスに扱うフレームワーク
- component: 生の DOM の代わりにレンダリング
- 子から親へのデータフローが辛い
- Redux をセットで使用する
- Middlewareの位置付け
- reducer を通る前に副作用を扱う
- 順序依存
- 非同期処理が難しい
- 複数のMidlewareが非同期で連鎖反応したらどうなる?
- Redux はミーリ・マシンと投下
もっといい設計を考える
- Redux + FRP(改善案)
- Reactive/RxAutomaton
- 使用例(ログイン処理)
- 小さな状態管理からでっかいシングルトンまで幅広く対応
- Elm の基本設計に近い
- Model View ViewModel から Automaton へ、。。?
まとめ
- データフローという名の状態
- FRP + MVVM による状態管理は依然複雑
ドッグフーディングしやすい環境を整える
@mao_nishi さん
4つの改善ポイント
ドッグフーディングとは
- 自作プロダクトを自分たちで使ってフィードバック、改善
- 継続が大変
アプリ利用依頼
- 自分が作ったことの説明ではなく、メリットを伝える
- 〜できるようになります!
- 自分が作ったことの説明ではなく、メリットを伝える
- アプリDL
- Apple Developer Enterprise Programに参加して配布
- App Sore 経由のアプリと共存できないのは嫌
- Bundle ID を変更しておく
- 普段使う
- フィードバック作成
- メール作るの面倒文章書くの面倒キャプチャ取らなきゃ。。
- 楽にできる仕組みを用意しておく
- テスト配布版だけに表示するボタン
- スクリーンショットとって意見を選択式
- テスト配布版だけに表示するボタン
- プライバシーの配慮
- スクショだとIDがばれたり。。
- キャプチャ時にマスク
- フィードバックに集中してもらおう
- スクショだとIDがばれたり。。
その後の変化
- チームのモチベーション向上
- 議論が活発化
- 仕事の進め方自体の見直しも
- よくない仕様になっている場合、なぜその仕様になってしまったのか、など
- よくないものはよくないと言いやすくなった
おまけ
- FeedbackKit
- MIT ライセンス
- メール送信、カスタム機能でSlack送信など
メモリー管理の美味しいバイキング料理
@rayfix さん
weak
- Swift weak
- 強い参照0でdeinit
- 弱い参照があるとゾンビになる
- 弱い参照0の時にはもう死んでいる
- 強い参照0でdeinit
まとめ
- 美味しいSwiftを書くには
- メモリとの相性を把握する必要がある
デザイナーに Storyboard をお任せする技術
@cockscomb さん
導入
- チームや個人のモチベーション重視
- 開発環境をセットアップする
- 手取り足取り教える
- 実際に触れてもらう
iOSアプリのリモートサポートツール「ミレタ」の作り方 #WebRTC #Swift #PrivatePod
@masuidrive さん
- iOS の画面をブラウザで確認できる
- クリックは反映されない
- WebRTC
- Safariでは未サポート
- iOS, Android の SDK も出ている
- 相手のIPアドレスをどうやっって知る?
- ファイアウォールは?
- シグナリングさーば、STUNサーバ
- SkyWay でお手軽に立てられる
- シグナリングさーば、STUNサーバ
- Mireta
- スクリーンショットを定期的に取り
- WebRTC でブラウザに送信
- ブラウザの手書きをiOSに送信
- Mireta SDK for iOS
- 接続部分のコードをパッケージ化
- 画面と一緒に送るデータを設定
- シグナリングサーバの再設定など
- SkyWay 以外でも使えるように
- Swift で CocoaPod
- Swift で Pod を作るとPrivate frameworkが正しく認識されない問題
- Monkey patch 的に対処
- Swift で Pod を作るとPrivate frameworkが正しく認識されない問題
- Web アプリ側
- React + Redux
- Rails 5
SwiftでのGeoFence実装 - Tipsを添えて
@shmdevelop さん
GeoFence機能とは
- 地理的領域の観測
- 特徴
- Suspended, Not Running の状態でも検知動作継続
- 省バッテリー消費
- 追加デバイス不要で任意の地点を登録可能
- 制限
- 精度の限界
- 100 - 200 メートル単位の精度
- 検知タイミングの遅さ
- 領域に入った場合には約10秒以内
- Out 1−15分
- 地点登録は1アプリ20ポイントまで
- 精度の限界
- 実装方法
- 位置情報取得許可
Tips
- 領域内にい続けた時突然IN/OUT繰り返すことがある
- イベントハンドリングでフィルタする
Xcode で快適なデバッグライフを追い求める
@dealforest さん
- クラッシュしたら AppDelegate もしくはアセンブラだった問題
- Exception Breakpoint を追加
- ただしうまく使えないケースも
- Exception 前提のコードが書かれていると今回の意図とは違うタイミングで Break
- ただしうまく使えないケースも
- Diagonostics を設定
- 不正なメモリ操作を検出
- Enable zombie objects, address sanitizer
- パフォーマンスきになる際は後者はオフに
- Exception Breakpoint を追加
- どの ViewController かわからない
- Symbolic break point
- 起動時に指定のViewControllerにしたい
- EnvironmentVariable
- 端末のログ、ファイルを取り出したい
- LLDB で slack に送信