kumamotone’s blog

iOS/Android アプリエンジニアです https://twitter.com/kumamo_tone

potatotips #50 に参加しました (iOS, Androidブログまとめ)

potatotips #50iOSブログまとめ枠で参加させていただきましたのブログです。

f:id:kumamotone:20180420011750j:plain

会場はWantedlyさん。めっちゃおしゃれ(語彙) すごく見やすくて聞きやすい環境でしたし、持ち時間時間が見やすく表示されていて発表しやすそうでした。

f:id:kumamotone:20180420011818j:plain

50回目ということでスピーカーの方々もはじめて発表したときのこととか振り返ったりされてました。

以下発表内容です。参加枠としては iOSブログまとめ枠でしたがAndroidの発表内容に関してもまとめてみました。間違いや気になるところなどあればご指摘ください。

埋まっていない資料は公開されたのを見つけ次第反映します。

"Hello Flutter"の次におさえたいFlutterのポイントその3 / Kenichi Kambara さん

www.slideshare.net

その2

www.slideshare.net

その1

www.slideshare.net

Flatterの概要、特に今回はUIに焦点を絞った話。

FlatterではDart言語でWidgets Treeというものをガリガリ書いていくことになる。Scaffoldというテンプレートクラスを使って作っていく。ScaffoldにはAppBarとBodyがぶら下がっている。

Columnというのを使うと、AndroidでいうLinear Layout の Verticalみたいなものが実現できる。Columnにまたボタンとかテキストフィールドがぶら下がっている。

Flutter向けのGUIビルダーが Google I/O で発表されることを期待しています!

recyclerview-selection / kgmyshin さん

speakerdeck.com

recyclerview-selectionの概要と、つかいかたについて。

recyclerview-selection とは?

28.0.0 alpha1から導入された、複数選択の機能の。ドラッグして複数選択みたいな機能が簡単に作れますよみたいなライブラリ。マウスなどにも対応しているらしい。

使いかた

Recyclerview, Viewholder, Adapterは一旦ふつうに作る。ただ、stableIdを使うようにする。SelectiontrackerインスタンスSelectionTracker#Builder でつくる。各引数に、Key、使うRecyclerview、StateIdKeyProvider、今どこのアイテムを選択している解決するItemDetailsLookUp、StorageStrategy、必要だったらリスナーを与える。あとはViewに選択状態を反映しておわり。

ブログにもっと詳しく乗ってるよ

inside.dmm.com

サンプルコード

github.com

Yet another simple Logger / ngtk さん

speakerdeck.com

XcodeのConsole log使ってますか?なるべくデバッガーをつかわずに問題解決したい。たとえばログとか。

ただログ機構に不満がある。ロギングのレベルが指定できない。ライブラリの標準出力がコントロールできない。

github.com

ライブラリ色々見たが、Swiftybeaver がオッとなった

:star: 3500 ぐらいで、ログレベルに対応してて良い。一方出力先も指定できる。文字列をコピペできない、有料のプラットフォームとセットになっている、とか概ねいいけど微妙なところもあった。

欲しい機能ぐらいであれば自分で作れるかもということで作ってみた。ざっくり実装紹介。

Glide 4 with Kotlin / hkusu さん

speakerdeck.com

画像ライブラリGlideの使い方とGlide4の機能の話。

hkusuさんのプロジェクトではpicassoがメンテされないのでGlideに乗り換えたという経緯がある。

Transformation。Glide4 では クロップ、角丸は標準で用意されている。また Glide Transformations使うとBlur, BrightnessFilter とか凝ったやつも簡単にできる。Glide4でアニメーションのデフォルトがフェードなしになったことに注意。

Glide Optionではよく使うオプションを定義して再利用できて便利。便利なんだが、Transitionや、サムネイル・リスナーの設定などはできない。これはGlide Typeとして定義できるがGlide Optionに比べると制約がある(複数指定できない、引数指定できない)。

しかし、Kotlinなら拡張関数があるので、GlideRequestとかに生やしてしまえば同じように処理をまとめられる。

Tagged / to4iki さん

speakerdeck.com

Idを型化したい。たとえば Userって型とSubscriptionっていう型があって、それぞれにidがあるのだが、これらは違うもの。なのでStringとかじゃなくて型にしたい。

ほかの例として、 Codable を使う場合は、decoderを実装すればよい。ただ、これいちいち書くのめんどいし、Userの比較するのにEquatableをIdにも実装せんとあかんのかよとなる、

structの各要素のEquatableの実装めんどくさい問題は、Swift4.1のConditional Conformanceで解決した。

github.com

さらに、この機能を使ったTaggedというライブラリがあり、これを使うことでプリミティブな型を簡単に型として扱うことができる。

DiffUtil and ListAdapter / kubode さん

speakerdeck.com

DiffUtil と ListAdapter の紹介。

github.com

DiffUtilでは、2つのListの差分をO(n)で計算できる。これは1000個のリストのうち50個の変更があったとき、Nexus5Xで4.6秒で計算できる速さ。

ListAdapterは、Support Library に 27.1.0で追加された、DiffUtilをつかうRecyclerView.Adapter。デモ。簡単。注意点としては、MutableListと一緒に使ってはならない。

From ObjectMapper to Codable / kobakei さん

speakerdeck.com

APIが返してくるJSONをObjectMapperでやってた部分をCodableにおきかえた。

Codableの基本的な説明。ネストしたJSONのパースの仕方、CodingKeyの話、日付String→Dateに変換など。JSONがつらい形で返ってきても、Decoderを自前実装すればよしなに対応できる。

ちなみにCodableAlamofireというのを使うと、responseDecodableObjectというのがrequestに追加されて、そんまんまCodableの型のオブジェクトを受け取れる。

github.com

Viewのキャプチャを撮ってみる / e10dokup さん

www.slideshare.net

特定のViewだけをキャプチャしたいときどうする?こういうときは、android.R.id.contentでActivity全体をキャプチャできる。これやると通知領域のないスクショが撮れる。

android.R.id.contentで画像としてキャプチャする場合。View#getDrawingCache()でViewのキャッシュを作成してBitmapで取得する(android-ktxならView#toBitmap()でもOK)。これ使うと、子になってるViewもまとめて実行される。注意点としては、使う前にView#setDrawingCacheEnabled(true)しよう。

画像ではなく、PDFとしてキャプチャする場合。PDFのいいところとしては、テキストをテキストとして保存してくれる。PDFDocumentというクラスを使ってキャンバス芸でキャンバスにゴスゴス書いていく感じになるが、たぶんPDFDocumentはこうやって使うものではない…

ほかにもMediaProjection API(API 21〜)を使うという方法がある。MediaProjectionは仮想のディスプレイにミラーリングしてやるという方式(こっちは自前のアプリだけでなくServiceとして起動して任意のアプリのキャプチャ撮ったりできる)。

iOSは自動生成の夢を見るか? / Nonchalant さん

speakerdeck.com

自動生成の前にDIの話。Swinjectを使っている。

github.com

container.register()をゴスゴス書くことになる。動的DIなので参照されるまで気づけなくて、間違うとクラッシュするとかありうる。

github.com

Sorceryは自動生成ツールで、これを使うとボイラープレート自動生成してくれる。Stencilテンプレートというのをテンプレート言語としてつかう。

紹介したコードでは、命名規則を利用したが、Sourceryはあるプロトコルに適合している型だけを抽出するとかできるので、Prefixとかずれても大丈夫なはず。

SourceryにおけるStencilの文法は以下にあります。

github.com

Preferences as a Service / izumin5210 さん

speakerdeck.com

アプリで使用する設定値、どこに保存する問題。結局サーバー側の挙動に影響するものが多いので、Shared PreferenceやRealmなどを使う方法もあるが、結局ローカルだけに保存するという選択肢が取れない場合もある。

しかしアプリごとに毎回同じような設定用のサーバーを立てるのはつらい…なので汎用的に設定値を管理するサービスないわば、Preferences as Serviceをつくった。

また内製なので、外に出したくない情報も使うことができる。またアプリでViewにそのままマップできる形で返すとか、A/Bテスト用の機能などをつけたり、色々便利に使っている。

今更C++でアプリを書く / 5mingame2 さん

www.slideshare.net

専門学校でゲームの作り方を教えたりしている。現在はCinderというのを使ってボードゲームカルカソンヌっぽいアプリを作っている。

github.com

あまり手厚いサポートはないが、学生がはじめて3Dを触るのに丁度よい規模感。UnityやUnrealEngineだと便利過ぎる。公式リファレンスは割りと充実しているが、ネットでググってもほとんど情報がないので、教育的(?)。

OpenGLの薄いラッパーとして使える、便利な点として、OSの違いを吸収してくれる。特にサウンドとか自分でやるとエグいので良い。またUnrealEngineなどと比べて良いところとして、ライブラリの再ビルドでトラブルが少ない。XcodeやVS2017が使えるならC++14が使える。

iOS SDKが使いたい場合は、Objective C++つかえばC++のコードからObjective-C使える。

ゲーム作れるが、手間がかかるのであまりお薦めはできない(編注:おすすめはできないと言いながらも楽しそうだった)。

消費型課金を導入する / morizooo さん

Presentations by morizooo // Speaker Deck

課金方式、消費型課金、非消費型課金、購読型課金がある。今日は消費型課金の話をする。

Play Billing Library。おすすめの習得法、play-billing-codelabさわって感触を掴んでからTrivialDriveV2を使うのが良い。

できること。課金できる端末か調べる、購入情報の取得、商品情報の取得、Google Playの購入画面を出すなど。

課金フロー。クライアントGoogleに→レシートを受け取る→サーバーに対してレシートの検証を行う(このとき購入したユーザー、アイテムの情報も送る)→Googleに検証してもらう→レシートの検証結果をクライアントに投げる→消費リクエストをクライアントからGoogleに送って終わり

複数端末で操作するとか、色々なクラッシュ要因があるがあるので、色々考えつくのはやるとして、フェールセーフになるように気をつけたほうがいい。

キーボードの切り替えをいい感じにしたい / wakwak3125 さん

speakerdeck.com

Facebook Messengerアプリとかで見る絵文字とか表示するキーボードの切り替えをしたい。適当にやったら豪快にViewが動いたのでやり方を考えた。

まずMessengerアプリを参考にした。単純にView構造のdumpを adb shell dumpsys activity top でとってみてひたすら切り替えてみた。そうすると気づいたのだが、特に変わったCustomViewを使っている様子はなかった。キーボードの裏にViewがある雰囲気を掴み、キーボードを閉じる際に高さが変わらなければ、View豪快に動くことがないのではと考えた。

実際にやってみた。toAdjustNothing(), toAdjustResize()を適切に使うようにしたら、キーボードを閉じる際に高さが変わらなくなり、問題が解決した。が無理矢理感があると思っていて、やりかたを募集している。

コードは以下に置いてあります。

github.com

Introducing Izumo / nakajijapan さん

speakerdeck.com

Izumoという、macOS, iOSで動くMarkdownエディタを使ったので紹介。CloudKit + CoreDataを使用してクラウドと同期をとるのと、リアルタイムMarkdownパーサを実装しているのが特徴。

Swiftが発表されたタイミングで発表されたCloudKitだが、なかなか同期処理がつらい。Markdownのパースも正規表現ゴリゴリでつらい。同期もCloudKitというフレームワークを使っているからといって単純に出来るわけではなく、結構やることある。

色々つらいが普段できない体験ができてよかった。

ディープリンクを実装した / Takasy さん

speakerdeck.com

通知から該当ページを起動する、という機能をつくる。

起動している/していない、登録している/登録しないの組み合わせパターンでそれぞれ違うことする。たとえば起動していて登録済みならページを開く、起動していないなら起動画面を見せてからページを開く、未登録で起動中なら何もしない、未登録で起動していないなら起動するだけ、という感じ。

どう実装したかというと、起動画面を透明なActivityにする、条件分岐をして適切な処理をすると言う流れ。

透明にする方法はStyleを設定する(windowsistrunscrentをtrueに)。条件分岐の方は、起動activityにdataをつけて、oncreateでintent.dataにuriが入ってるのでスキームをパースする。

ただホーム画面をスタックに積むというところで詰まって、droid girlsの方に質問とかして解決した。TaskStackBuilderというのを使うとActivityを起動せずにスタックにつめる。FlagにはSINGLE_TOPを設定しておく。

RxSwift, Codable, Moya で API クッキング! / Akkey さん

YoutubeAPIを叩くアプリ。軽い気持ちで技術選定して、RxSwift, Codable, Moya を使ってみた。

github.com

Moyaではenumでエンドポイントを定義して、リクエストごとにcaseを定義する。

MoyaにはTargetTypeというプロトコルがあって、エンドポイントはこれに準拠させて extension で baseURL, path, method, parameters を実装することによって設定する。

RxMoyaを使う場合、注意点としてリクエストを行うAPIクラスは、シングルトンでProviderが開放されないようにする必要がある(結果をSubscribeできなくなるため)。MultiTargetというのを使うと、Providerごとに型が違っても共通で使えるようになる。

webviewが辛かった話 / aboy さん

WebViewがつらかったという話。「Webサービスのアプリ版がほしいな〜」という案件を任された。

Web版できることはやりたい、ログイン状態は保持したい。ということで、WebViewでやることになった。

しかし案の定、WebViewの謎の挙動に悩まされ大変な目に…

なぜこんなことになったのか、ヘッダーリクエストまわりをいじったせいで、戻るの機能が使えず自前実装になって実装が複雑になっていった。またもともとページ数がかなりあるWebサービスなので、動作を担保する範囲がめちゃくちゃ広かった…

WebViewは安易につかうとつらいです。ちゃんとWebViewを使うべきなのかよく考えましょう。

感想とか

github.com

  • Taggedは早速Swift4.1の機能を活かしていて面白いライブラリだなと思いました。

  • iOSはいい感じのデファクトっぽいロギングライブラリが出て来ると良いですね…Timberやlogger的な…(あるのかな?)みんな各々実装してそう

  • AlamofireとRxSwiftは個人的に使っているのですが、RxMoyaと組み合わせるとすごく良い感じになりそうなので参考になりました。

  • Webサービスのアプリ版がほしいな〜」みたいな案件、今後遭遇するかわかりませんが、恐ろしそうなので気をつけようと思いました…