#potatotips 29はbitFlyer社で開催!iOS/Android開発Tipsのまとめ!
第29回potatotipsに発表者枠で参加してきました。
が、ブログ枠にも負けじと自分もまとめ頑張ります!!!(既に速さ的に負けてますが)
先行者androidまとめ:potatotips #29 に参加してきました – heki1224の適当な日記
先行者iosまとめ:2016/5/25 #potatotips #29 (iOS/Android開発Tips共有会) に参加してきたよ – koogawa log
【Android】Multi-Window上での「共有」について
AA最適環境表示アプリをMulti-Window対応させようとした時の話ですが、遅刻してしまったのでメモは残せませんでした…
【iOS】WWDC初参加の方に送る6つのおすすめな巡り方
小生の発表。詳しく(もないけど)はこちら
【Android】Tips to learn “DI”
- Daggerに興味があるけどDIがなじまない人へのお話と、Spring bootの紹介と自分の学習体験についてのお話
- Spring BootはSpring Frameworkを簡単に利用するために開発された
- Frameworkの真ん中にDIコンテナがあって、コンポーネントを作ってコンテナに登録して取り出しをする。これがDependencyInjection
- RESTAPIアプリケーションを考えた場合に、URLを解釈してコントローラを登録し、しておきアノテーションで注入する
- クラス書いてアノテーションを書くだけで実装できる
- サービスでインターフェースを書いて、アノテーションをかいておくと、サービスの注入を切り替えることができる
- NHKの番組表を実装した時に中間サーバを作った
- この時にプラグインやDIなどを勉強できた
- Daggerを使う目的であるDIをSpringBootを使えば気軽に学習できました
【Android】New Layout Editor with ConstraintLayout
- GoogleI/O 2016で発表されたConstraintLayoutの紹介
- レイアウトをマテリアルデザインに準拠した最適な位置に自動調整してくれる
- 特徴
- GUIベースでレイアウトを作成
- AndroidStudioが自動でxmlを生成
- AutoConnectとInferenceによるレイアウト制約
- API 9〜対応
- 使用要件
- Android Studio v2.2 preview 1~
- JDK 1.8~
- いいところ
- 小規模なライブラリでバンドルされていないライブラリになる
- API9~対応
- 開発スピードも向上する
- ネストがへるのでパフォーマンすが向上する
- 悪いところ
- 生成されるXMLがattributesが多くての可読性が悪いのでレビューがしづらい
- viewを思った通りに作れるGUIインターフェースは信じきれていない
【iOS】Bitriseを使っています
- ネイティブアプリ向けCIサービス
- Github以外にも対応
- GUIで色々設定できる
- 無料枠がある
- ビルド時間に制約あり
- ワークフロー
- CIの処理順をワークフローで管理する
- ステップはGUIで追加・削除ができる
- カスタマイズ
- ワークフローの間の+を押下すれば追加することができる
- シェルを追加もできる
- ビルド番号も簡単に買えられる
- Slackでのつぶやきもできる
- iTunesConnectにもアップできます
- Submit for TestFlight Beta Testingのフラグの設定が逆になる。
- yesにするといきなし申請が飛ぶので注意
- 所要時間
- 無料枠だと10分しかビルド時間が使えないので間に合わない
QA
- circle ciみたいなことができるか?
- シェルスクリプトが使えるので駆使すればできるかも?
- 10分かかるプロジェクトはswiftか?obj-cか?
- obj-cです
- cocoapodsやったり、cloneしたりする時間がかかります
Segueをもっと使いやすくするTips
- ResourceKitとSegueAdditionというライブラリの紹介
- ResourceKit
- StoryboardからXMLをよんでコードを生成してハードコードをなくす
- ResourceKitを使うと、補完がきくようになり、typeが防がれ、replaceし忘れがなくなる
- SegueAddition
- SegueAdditionを使うと、performSegueという関数が使えるようになるので、prepareForSegueを使う必要がなくなる
- 値渡しが楽になる
- 狭いスコープで完結するようになる
- 循環参照しないつくりになっている
- ResourceKit + SegueAddition
- 文字列の指定がなくなり、より補完がきくようになる
QA
- ビルド生成するタイミングで生成か?
- 生成するタイミングになります
- ResourceKitはコンフィグファイルが用意されていて、余計なものは生成しないというのもできるので、それを使えばファイルを書き出す時間が短くなります
- マネーフォワードではどんなかんじでSegueを使っているか?
- 逆にマネーフォワードでは歴史的にSegueをたくさん使っている
【Android】Delightful Android DB Development
- androidにおけるDB周りの実装を楽にしてくれるライブラリの紹介
- 公式サイトのサンプルをみると、sqlを直書きしている
- insertの処理を見ると、content valueというオブジェクトを作って諸々の処理を作る必要がある
- 良くないと思うところ
- 決まり文句が多い
- 事前に定義しておかないといけない
- javaとsqlの構文がまざる
- create tableなどが文字列で書いてあり、スペルミスなどが起こってしまう
- SQLDelight
- squareが作っています
- SQL分を静的解析してくれる
- javaとSQLのコードを切り分けできる
- 書いたSQLからjavaのモデルで自動生成してくれる
- 使い方はdependencyを記述して、intellij pluginを入れる
- プラグインいれるとコード解析できるようになる
- 例えばpotatotip.javaというモデルを入れたかったら、sqldelightディレクトリに同じ階層でpotatotip.sqという同じファイル名で作る
- sqファイルはSQLだけを記載する
- スペルミスなどをするとその都度警告してくれるようになる
- SQファイルを用いてビルドするが、potatotipmodelというモデルを作ってくれる
- mapメソッドも用意してくれます
- Mapを使うと数行でINSERTが書けるようになります
QA
- SQLが動的に変わる場合はどうなるか?
- まだ使いこなせていないので使ってみてください
- OR Mapperを使わずにSQL rewriteを使わなかったのはなぜか?
- square社のものを使ってみたかった
- OR Mapperもあまり使ったことがないので使ってみたい
【iOS】AppStoreで最新バージョン以外のiOSアプリをダウンロードする方法
- AppStoreからのアプリをDLする時のリクエストを編集して旧バージョンのアプリを取得できる
- AppStoreには初回リリースから全てのバージョンがずっと公開されている
- Mac, iTunes, Charlesを使えば出来ます
- Charlesは無料でも利用出来ます
- やり方
- iTunesはAppleIDでログインしておく
- CharlesでMacの通信アプリをキャプチャする
- iTunesで対象アプリをDLする
- Charlesでキャプチャを確認する
- レスポンスをみてコピペしておく
- このコピペ部分がバージョンIDになる
- 上に行くほど古い
- breakepointを設定する
- アプリを削除してもう1回DLする
- breakしたところでappExtVrsldのstring値をDLしたいバージョンIDで書き換えて、Executeボタンを押下すると旧バージョンがDLされる
- QA
- 自分で通信を眺めて発見したのか?
- 付録のURLに載ってました
- 初代のamazonアプリで買い物できるか?
- 買い物できなかった
- 自分で通信を眺めて発見したのか?
【Android】 5 RxJava Tips You Might Not Know
- RxJavaは最後にunsubscribeを呼ばないとメモリリークが起きる
- 呼ぶ際にはnullチェックをする必要がある
- nullのところをSubscriptions.enpty();をいれてあげればnullチェックが外せます
- 何回も呼ばれる可能性があるような通信で、前のリクエストをキャンセルしたい場合、3回めの結果が返る前に2回めの結果がかえるかもしれない
- そのときは前のsubscriptuonをunsubscribeしてからとりなおす必要がある
- この場合は、SerialSubscription()というのを使うといい
- 前にsetされたsubcriptionを自動的にunsubscription()してくれる
- 非同期で長い処理をやる場合はメインスレッドでやると固まるので裏でやるが、結果が戻ってきた場合はcomposeメソッドを使う場合がある
- 共通化したい処理をcomposeで返す
- そうすると決まりきった処理を返せるようになる
- onSubscribeを自分で実装するのはやめたほうがいい
- subscribeした瞬間になにかやってonCompletedをしたい場合
- onSubscribeを自分でやるのではなく、fromCallableメソッドを用いる
- concatを続けて呼ぶと便利
- concatはデータがあったらそれを返す
- firstは一番はじめに見つかったものを返す
- キャッシュの実装をする場合に、メモリーをみて、ディスクをみて、ネットワークのものを見てデータを取得するといったことができる
QA
- 順番を守る必要があるとき、古いのは捨てたい時があると思うが、そういう時はどうするか?
- SerialSubscriptionを使えば以前のリクエストは勝手にキャンセルされます
- subscriptionEmptyという話で、Emptyを使って困ったことはないか?
- 今のところない
- Emptyを使ってページ周りの処理で、一番下でロードして次のを読み込むというのをやっていたが、読込中に一番下という判定がきてもいい場合はsubscribeの判定ができない
- →簡単なフラグをもたせるといいと思う
- bounceを使うのもいいと思う
Indroducing Anglerfish
- 全てのバージョンのシミュレーターを入れると選択が大変なので改善するPluginを作った
- Anglerfishを使うとシミュレータをソートできるようになります
- 今後実装予定機能
- 起動時以外でもSimulatorのソートを反映
- ソートのOn/Offの切り替え
- 実機とSimulatorとをショートカットで切り替え
メモリリークに関する噂の今昔
woshidan様
- メモリリーク対策でググッて出ることがほんとうに必要かLeakCaneryを使って調べてみた
- RecyclerViewは全然メモリリークの検出が確認されなかった
- FABのクリックリスナはリーク確認できなかった
- AndroidのGCはマーク・アンド・スイープ方式でやる
- ルートオブジェクトに当たるものが全て生存していなければGCされる
- 昔はメモリリークしなくても細かくメモリを管理したかったのではないか
- 昔はGCに関する工程でアプリのスレッドが全て止まった
- 今はGCの主要な工程が並行処理できるようになり、マルチコアCPUの恩恵が受けられるようになり停止時間が短くなった
- Activity自体もリークしにくくなっている
- UIのイベントリスナの開放は前ほど気にしなくてもいい
- ルートオブジェクトがActivityと違うもの、Bitmap、Handler、AsyncTaskなどには引き続き注意しましょう
Swift Package Manager (SwiftPM, SPM)
SwiftPackageManager入門
- swift-package-managerはAppleがswift3.0からやるもので、従来のライブラリをパッケージとよんで、CocoaPods. Carthageのようにライブラリを管理するツールだが少し違う
- 他と違ってXcodeを使わずにパッケージ(プロジェクト)全体をビルドすることができる
- Xcodeを使わないでパッケージ全体をビルドする
- まだ未完成で、Appleのリポジトリには将来像が書かれているが具体的にはまだわからない
- ビルドとテストはできるが、Archiveがない。しかしかわりにXcodeプロジェクトを生成するコマンドがある
- 将来的にSwiftPackageManagerはXcodeに組み込まれる
Tips
- Module
- sourceとtestのフォルダの中をディレクトリで分ける事で名前空間を分けられる
- サードパーティのライブラリで名前がバッティングしてもよさ気
- Travis CI
- linuxと、osxを同時にテストするやり方もできます
コマンドラインツールを作ってみた
- tryswiftdevで作ってます
FAQ
- iOSの開発で使えるか?
- 使えるが、アプリは出せない
- アーカイブができない
Android BLEのつらみを予防するTips
Bluetooth Low Energyとは?
- Bluetooth4.0のこと
- Central:みつけて接続する
- Peripheral:見つけられて接続される
- iOSのほうが安定動作している
Android BLEのサポート状況
- CentralがBLE AdvertiseしているPeripheralをScanしてConnectする
- OSのチップセットを理解する必要がある
- Centralは4.3以上〜
- Peripheralは5.0以上~
- チップセット
- Centralは基本全て対応しているが安定性の差が激しい
- Peripheralは特定のものに対応してる必要がある
- Scanは安定するが、Connectは不安定
- 接続要求をしても成功しない
- 接続できてもService/Characteristicが見つからない
- Service/Characteristicが見つかっても値の読み込み、書き込みができない
Android BEL Centralのつらみ
- コードで克服するのはつらいので仕様で克服
- →BLEを使わない!
- BLEを以外(ClassicBTなど)でできないか
- 動作対象端末を絞る
- Android4.3はサポートしない
- できれば5.0以上のみにする
- BLE接続の頻度を下げる
- 接続せずにスキャンだけで済むならそれがいい
- UUID指定のスキャンを前提にした仕様を辞める
- 大きいデータはOverflow領域に格納される仕様があり、iosからはできるが、Andoroidから見つからない場合がある
FAQ
- 現状、peripheralの普及感と、具体的にこういうアプリで使われているというユースケースがあれば教えてください
- android advertiseを使っているのはあまりしらない
- 対応状況としていうと、FlatSick端末GalaxyS6、 Nexus6、HTC、experia Z5などできるとおもわれる
- 最近出来たのは大体対応している
- advertiseできる一覧がgithubにまとめられている
- 出ているキャリアによって変わったりしている
スタイルの一貫性を保つ
何故一貫性が必要か
- 何かをするのに必要な物は運動、視覚、認知の3つがある
- この中では認知負荷が一番高いのでこれを下げるのが使いやすいアプリ
- ユーザが既に知っているデザインを用いる
- テキストのスタイルをどう一貫性を保つか
- NSAttributedStringを使うと自由にスタイルを適用できる
- 一貫したスタイルを保ちつつ局所的にスタイルを変更できるのが理想
- 4つ文字の大きさがあった場合Enumでそれぞれ定義してStyleを渡してあげる
- Builderのクラスにはサイズや色などを設定できるようにしている
- アプリケーション全体で使えるスタイルを制限している
- 実際はNSAttributedStringをextensionして実装している
- UIcatalog
- UIのコンポーネントを詰め込んだものを共有用で作ってデザイナーと共有している
@mogmetの所感
appstoreのハック方法などは本当にtipsらしいtipsで面白い発表でした。
また、BLEなどは実装しても挙動が不安定なのでなかなか大変そうだな・・・と思いました。そういえば車でmacbookを繋いだりした時に中々つながらないことがあったりしたなぁとかふと思い出しました。接続先の機器にも依存するんですね。
今回、自分は発表枠で出ましたが、そろそろネタが尽きかけているので探しに行かないとと想っています。
しかし、ちょうどWWDCも近いですしネタは今後たくさん潜んでそうですね!!