横浜 iOS勉強会 第14回  #yidev


勉強会のメモです。

http://cocopon.me/blog/?p=4353

# 1. Dynamic Typeの基本的なお話,  @koogawaさん

  https://www.slideshare.net/koogawa/dynamic-type

  iOS7から設定で文字サイズを変更できるようになった。
  設定を反映するにはアプリ側で対応が必要。標準アプリだとメールアプリ、メッセージアプリなどが対応している。
  Notificationで設定変更検知も可能。   
  ex.)
    label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];

  導入によるユーザの反応：
      システム全体で設定が共通のため、あまり反応はよろしくない。
      また、システム設定で変更できるということがユーザにわからないということも多い。


Tips:

* [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline] でフォントオブジェクトを取って、サイズだけ参照するといった使い方も可能。
* アクセシビリティ設定と組み合わせると、通常の設定できるサイズよりさらに大きくできる。     


# 2. NSInvocationの便利さとハマりどころ, @saku2sakuさん
   https://www.slideshare.net/ganbit1021/nsinvocation

  NSInvocationはメソッドを動的にコールする仕組み。

  サンプルコード: 
    http://workshop.iphonework.biz/files/2013/12/NSInvocationSample.zip

  Tips:
   - 引数が2番目から始まる理由： 実体が IMPであり、0番目がself, 1番目がセレクタ自身だから。
   - NSInvocationの戻り値は自動解放されることに注意。
     プリミティブ型などの場合はメソッドシグネチャで型を取得し、mallocで必要な量だけ確保する必要がある。

# 3. 最近、テストコード環境どんなかんじですか？,  @tokoromさん
https://speakerdeck.com/player/d1b1d1e04c3c01316bc772e59c5bd9a1#

今回の前提条件: 標準のXCTestフレームワークを使う

- 非同期処理のテスト
  GHUnit AsyncTestCase

  TKRGurardをそのための仕組みを作った。Cookpadで既に使ってる。
  WAIT & RESUME
  SHORTHANDモードをオフにもできる。

- matcher
  XCTAssertsでなんとかなりそう。
  Expectaが好み equalObjects, int型などの面倒事がない。マッチャの種類も多いので失敗時のガイドもわかりやすい。
- OCMock
  andDoとか便利
- OHHTTPStubs
  実際に通信させずにテスト用データの差し替えるのが便利。

- CUI&Guard
  CUIが改善されている。

  Xcode 4.x
    TEST_AFTER_BUILD=YES TEST_HOST=

  Xcode5から
    xcodebuild test -destination $(DESTINATION)

Guard を使うとコードを保存したらすぐテストが走るといったことができる。vimでコード変更して、guardでテスト実行という流れが可能。

xctoolを使うとテスト結果をきれいに整形してくれるが今回は使わない前提。xcprettyを使うことで可能。
xcodebuild … | xcpretty -c

xctestというコマンドもあるが調査中。

- コードカバレッジ
 xxx.gcno, xxx.gcdaを生成する必要がある。
 Xcode5 & iOS 7で生成されないのでハックした。
 XCTestObserverで flushするタイミングがわかるが、それでも不完全。。

Q&A
・ViewControllerのユニットテストはしていない。
・通信モジュールのテストはOHHTTPStubs でやってる。
・OS X Serverによる Botsも実運用している。
  ただし、まだ不安定でうまくいったりいかなったり。プロジェクトによってはうまくいっている。

# 4. NSURLSession, @cqa02303

  今年は、Arudinoとかハードで遊んでみた。eVocaloid + COreMIDI。カメラコネクションキットを使うといろいろ遊べる。ただし、作っても他の人が使えなくて微妙。。AppStore最高。

 NSURLSessionのお話
  アプリが死んだ後もdaemon経由で通信を続けてくれる。
  ただし、アプリが強制終了されたときは通信も切られる。

アプリがフォアグラウンドでバックグラウンド通信を始めるときと、
バックグラウンドで始めるときとで挙動が違う。バックグラウンド通信が始まらない。

daemonの存在は Instruments で実行するとわかる。networks という名前。Instrumentsを使うと裏側が除ける。


# 5. JavaScriptCore, @k_katsumi
WebViewで間接的にやっていた ObjC -> JS呼び出し、JS -> ObjC呼び出しが簡単になった。
・ObjC <-> JavaScriptのオブジェクトラッパ
・ObjC -> JS
・ObjC <- JS


WebView以外での利用用途としては、ObjC にはないが JSにあるライブラリを使いたいこと。
    例) Textile Parser, はてな記法 Parser, JSONを圧縮するライブラリ(json hpack)
 
- JS -> ObjC,   Make UI with JS

  準備: 
   1. JSExport を継承したプロトコルを作成し、そこに JSから呼び出したいメソッドを定義しておく。
   2. ObjCのオブジェクトを作成し、JSContextにセットしておく。

class_addProtocol で動的にプロトコル追加もできる。これでUIButtonなども対応させられる。
ただし、現時点では Protocolを動的作成したものを追加すると contextにセットするときにaboartしてしまう。
OSの不具合と思われる。将来直る可能性が高い。

次にやったのはプロトコルの自動生成。crunだと完全にはできなかった。

サーバにコードを置いておけが、ビルドレスで UIを変えられる。
エンタープライズ用途で使うと良さそう。


# 6. 会社をやめて独立したらすること。他,  @nagamatsumasatoさん

[参加者のみに公開された門外不出の内容でした]



# 7. iBeaconについて, @noliliさん
ARARTアプリ, Bloomclockなどを開発。

iBeacon についての Appleのサンプル。”AirLocate”

enter, exit は領域をまたいだ時にだけコールされる。requestState で現在の場所がわかる。

UUID登録できるのはアプリに対して20個まで。UUIDとは別に major, minor を付けられる。

iPhoneを Beaconにするときは CBPeripheralManagerを使う。

<おまけ& Undocumentedな内容>
[こちらも門外不出のお話でした]