【第23回】potatotips(iOS/Android開発Tips共有会) まとめ(iOS版)

* [【第23回】potatotips(iOS/Android開発Tips共有会)](http://connpass.com/event/21750/)に「iOSブログまとめ枠」で参加しました
* 発表を聞きながらメモったことをふんわりまとめました(発表者の発言そのものではない点、ご注意ください)
* お気づきの点がありましたらお気軽にコメントおねがいします!

# 発表一覧
https://github.com/potatotips/potatotips/wiki/potatotips-23

# 会場
* 会場は [ジムが併設されている](http://moffice.tokyo/matome/articles/QY5WsnJB?page=2) というIT企業にあるまじき超健康オフィスと噂の [FiNC](https://finc.co.jp/)さんです。
 
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/potatotips?src=hash">#potatotips</a> FiNCさん会場着！ ペッパーくんが出迎えてくれました。 <a href="https://t.co/nPky03sqm0">pic.twitter.com/nPky03sqm0</a></p>&mdash; 所 友太 (@tokorom) <a href="https://twitter.com/tokorom/status/669091458838753280">2015, 11月 24</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 発表内容(iOS)
## @susieyy	[状態管理とビューデータバインディング](https://speakerdeck.com/susieyy/zhuang-tai-guan-li-tohiyutetahainteinku)
* つくってます　→　[Sync 仕事用グループチャット](https://itunes.apple.com/jp/app/sync-group-messaging-app-for/id1014462508)
* 発表の内容はQiitaにもまとめてます → [Swift - MVVMをベースに複雑な振る舞いをしっかり把握できるアプリ開発 - Qiita](http://qiita.com/susieyy/items/2af5321b287b8d2f49f6)
* **アプリのコード複雑になっていませんか?**
* カオスになる原因:1つの画面で複数の状態表示を実現しなければならないから
 * 初期状態
 * 通信中
 * 結果0件
 * 結果x件
 * 通信エラー
* 画面の状態(Status)の整理にオススメ → ViewDataBinding with SwiftBond
* Viewごとに、取りうる Status を Enum で定義し、この Status ごとに別々の view を所持(Stack)
* Status を変更することで View の表示を制御する
 * Blank
 * Loading
 * Error etc...
* さらにアプリ開発でよくあるケースとして、通信で取得した items (何らかのデータ配列) があるかないかによって表示を変えたい場合が → **Sync では "Status" と "items" の両方の状態によって表示を制御している**
 * `items >= 1` の状態で通信中はステータスバーのインジケータだけ回す
 * `items >= 1` の状態で通信エラーになっても、エラー画面は出さずに取得済みの items を表示し続ける
* 会場質問
 * MVVMは全面的に便利だけど、「こういうのはやりにくくなった、ここは上手くいかない」などはある?
     * 全体的に、あまりデメリットに感じる点はなかった
     * データ永続化のためにさらにモデルとしてマッピングしてるので、そこがやや冗長かなと思う部分はあった。
 * nibでは使えない?
     * nibでも使えます
* こちらも参考になるよ → [How to fix a bad user interface - Scott Hurff](http://scotthurff.com/posts/why-your-user-interface-is-awkward-youre-ignoring-the-ui-stack)



## @tomzoh	[tvOSネイティブアプリを作る](http://www.slideshare.net/hasegawatomoki/tvos-55455684)
* 団長!
* つくってます → [Untappd - Discover Beer](https://play.google.com/store/apps/details?id=com.untappdllc.app&hl=ja)
* AppleTV大好きです
* tvOS は 
 * Lightning → (´・ω・｀)　
 * MicroUSB  → (´・ω・｀)　
 * TypeC     → ✌('ω')✌
* [このケーブル使えてます](http://www.amazon.co.jp/dp/B0119RLTN4)
* 基本的に Obj-C / Swift のライブラリは使えると思って良い
* cocoapods では platform として「:tvos, '9.0'」を指定
* 既存のライブラリも podspec に1行追加すすれば使えるようになる
* ハマりどころ
 * アプリは200MB以内
 * データ永続化にディスク使えない
 * UIWebViewがない
 * **デバイストークンは取れるし送信してもエラーにならないけど送れない(´・ω・｀)**
* DEMO
 * iPhone上のYoutube動画をリストから選ぶと、AppleTVアプリ上でその動画が再生


## @yimajo	[HealthKitで日別のデータを一度に取得する](http://www.slideshare.net/YoshinoriImajo/healthkit-55457080)
* つくってます → [エンジニアアウトプットランキング - Stargazer](https://stargzr.net/)
* インタビューもやってます。インタビューされてもいいよって人募集してます。一緒にインタビューしてくれる人も!
* Health Kit で日毎のデータを取得したい(3日前から現在までの歩数を、日ごとに表示とか)
* 具体的な説明がドキュメント等になく、理解しにくかったので共有します
* [コードで書くと30行くらい](https://github.com/yimajo/HealthKitStatisticsCollectionDemo)
* `statistics.sumQuantity()`はすでにソース(iPhone/AppleWatch)の重複データを省いたデータ
* `statistics.sumQuantityForSource(source:)`ではソース(iPhone/AppleWatch)別のデータが取れる


## @yoshimikeisui [Simple Graph](https://speakerdeck.com/yoshimikeisui/simple-graph)
* つくってます → [FiNC](https://itunes.apple.com/jp/app/finc/id965626396?mt=8)
* FiNC でも1つ目の発表にあった SwiftBond 使ってバリバリデータバインディングで開発してますYO(｀・ω・´)
* Objective-Cを知らないiOSエンジニアです
* リニューアルでグラフをつくことになった
* 有名なライブラリを漁ってみたがそんなに豊富な機能は要らない(使わないグラフ、オプションが多い) → **よし自作だ!**
* やること
 * 表示したい要素の数から、x軸の1目盛りの幅を決める
 * y軸の高さを求める
* **シンプルなグラフなら、自作すると楽、そしてたのしい**

## @daisuke0131	[View Monitoring Tips](http://www.slideshare.net/daisukeyamashita180/view-monitoring-tips)
* つくってます → [ViewMonitor](https://github.com/daisuke0131/ViewMonitor)
* 勉強会もやってるよ → [オープンソースライブラリ研究会 - iOS Android Rails編 - ](http://connpass.com/event/22476/), [TensorFlow研究会](http://d-cube.connpass.com/event/23094/ 勉強会はじめました)
* 画面上でタップした View の座標や FontColor が取得できるライブラリを作っているのでその話です
* `didFinishLaunchingWithOptions`に1行追加するだけ
* viewの描画イベントをフックする必要がある
* ハマりどころ
 * `userInteractionEnabled = false` になっているとタップが検知できない → ライブラリの中で一度すべての view を `userInteractionEnabled = true` にセットしている。ライブラリOFFにした時に戻している。
* 「Obj-C対応して!」ってプルリクが来た! → **Pure Swiftでなくなっちゃうという悲しみ(´・ω・｀)** → でも入れた
* CocoaPods で Storyboard の利用がうまくいかずコードでむりくり実装したのがちょっとイケてないと思ってる

## @YuichiroTakahashi SwiftScriptingのススメ
* 何かスクリプト言語使えたほうがちょっとしたもの作るとき便利だよなー → そんなあなたに SwiftScript !
* めっちゃかんたん!
* #!(シェバン)を書いて、実行権限つけるだけ!
* SwiftScriptでスプラトゥーンの武器名抽出スクレイパつくったよ
 * html解析 → [Kanna](https://github.com/tid-kijyun/Kanna)
 * ライブラリ管理 → [Carthage](https://github.com/Carthage/Carthage)
* ハマりどころ2つ
 * 非同期処理が終わるまで待ってくれない! → [SwiftScriptRunner](https://github.com/mgrebenets/SwiftScriptRunner)を使えばおk
 * ファイル単位の import ができないのが使いにくい
* DEMO 
 *  **taylor.swift**
 *  俺のお気に入りのテイラー・スウィフトの曲を流してくれるスクリプト 
 *  **つくってみたかったの(´・ω・｀)**
 *  なにが言いたかったかというと、SwiftScript で AppKit も使えるよ!!! GUI簡単に作れるぜ!

## @TachibanaKaoru [Xcode7時代のアプリ配布](http://www.slideshare.net/toyship/xcode7)
* つくってます → [朝時間.jp -朝ごはんレシピや朝カフェ、朝のニュースを毎日お届け！](https://itunes.apple.com/jp/app/chao-shi-jian.jp-chaogohanreshipiya/id400435286?mt=8)
* **同じ配布でも、「なんのために、誰に配布するのか」によって、アプローチがことなる**
 * 端末登録などの事前作業はなるべく排除
 * ビルド → 配布は自動化したい
* Xcode BOT
 * Xcode5から導入されてるApple公式CI
 * **potatotipsで結構布教してるんですが、みなさん使ってくれない(´・ω・｀)**
 * Pros
     * Xcode7でUIテストも可能で便利になりました
     * Commitごとに自動ビルド可能
     * Analyze(静的解析)もできる
 * Cons
     * 開発者用のプロビジョニングファイルと端末登録が必要
     * CocoaPodsと相性が悪い
* External Test
 * iTunes Connectから配布
 * Pros
      * AppleStore からリリースするモジュールと同じモジュールを落とせる
      * デバイス登録不要
      * 1日2回まで → 1日4回までに最近改善された(**カウントの変更がアメリカの西海岸時間での1日なので注意が必要**)
 * Cons
       * iOS8以上しかつかえない(古いOSをサポートしていると使えない)
       * 「アプリバージョン」を変更する度にApple審査が必要。「ビルドバージョン」の変更は審査不要
       * 審査時間はだいたい数時間~5日。普通の審査よりはゆるいが、rejectもあった。
* Internal Test
* エンタープライズ配信


## Noritaka Kamiya	[tvOSを拡張する](https://speakerdeck.com/nolili/tvoswokuo-zhang-suru)
* つくってます → [ユビレジ](https://itunes.apple.com/jp/app/yubireji/id442910152?mt=8) , [Bloomclock](https://itunes.apple.com/jp/app/bloomclock-hd/id616625419?mt=8)
* 「AppleTVでクロッシーロードやった人ー!」→ 会場挙手
* [このケーブル使えてます](http://www.amazon.co.jp/USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%80%90A-TypeC-USB-C-device-od-31acbk/dp/B00TP827IG)
* AppleTVは...
 * Handoff 🙅
 * Multiple Connectivity 🙅
 * Keychain Sharing 🙅
* **Core Bluetooth は使える**😂
* AppleTV側がホスト
* AppleTVも含めて2台なので、実質1台しか繋げない。
* オススメサンプルコード →  [BTLE Central Peripheral Transfer](https://developer.apple.com/library/ios/samplecode/BTLE_Transfer/Introduction/Intro.html)
* パケットに乗るデータ量制限がきつい(MTU 20 Bytes...) → Jsonそのままとか無理


## Motoki Narita [watchOS2 tips](http://www.slideshare.net/motokinarita7/watchos2-tips-55465866)
* つくってます → [HOME'S(ホームズ)](https://itunes.apple.com/jp/app/homes-homuzu/id342650611?mt=8#), [リボカメ - Revolver Camera](https://itunes.apple.com/jp/app/ribokame-revolver-camera/id1039880433?mt=8#)
* 「WatchOS開発している人ー!」 → かろうじて2~3人
 * **0人じゃなくてよかった… (´・ω・｀)**
* watch OS2 の Tips
 * complication はショートカットとして配置できる
 * WCSession ではサイズの大きいデータ(画像など)は渡せない → TransferFile を使う
 * iOS/watchOS間型を共有すると便利 → Target Membersip で iOS/watchOS両方にチェックするだけ
 * ビルド完了時にHapTic(超オススメ)
     * watchOS開発の最大の敵はビルド時間
     * ビルドしてからアプリが起動するまで10分待ちました(最大)
     * **watchOS2で追加されたhapticを使用して、起動したら起動したら音を出すようにすると◎**


## 感想
* **司会者の司会芸**がすばらしい
* MVVM、実例がUI開発していると本当によくあるケースでとてもしっくり来ました。わかりやすかったです
* 自作するかライブラリを使うか迷うことがあるので、「自作すると楽、そしてたのしい」は参考になりました(｀・ω・´)
* Swiftでスクレイピングするライブラリまで出てるのか…!とびっくりしました。なんでもありますね。今度SwiftScript試してみよう。
* アプリ配布方法を場合によって使い分けるのは素敵。本当は一本化したいけれど、現状だとどれも一長一短ある印象です。
* テスト用にちょっとhttpでjsonファイルを取ってきたい場合、DropboxかGistに貼り付けてRow表示してそのURLを使うとお手軽
* 懇親会で得た知見:
 * **FiNCさんはBMI25以上の人は就職できない**(ただし、入社後にBMI25未満になりますという情熱を見せればOKの可能性も)
 * FiNCさんの社内にはガチのジムがある