kumamotone’s blog

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

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

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

f:id:kumamotone:20180727000359j:plain

会場はマネーフォワードさんでした。新オフィスきれい…

f:id:kumamotone:20180727000416j:plain

以下発表内容です。参加枠としては iOSブログまとめ枠でしたが Android の発表内容に関してもまとめています。

気になるところや間違いなどあればご指摘ください。埋まっていない資料は公開されたのを見つけ次第反映します。

Optional(2018)年...その後 / tamadon さん

speakerdeck.com

Optional(2018)年あけましておめでとうございますというプッシュを打ってしまったという事件があった。

moneyforward.com

これを機にwarningを撲滅すべく、iOSエンジニアを結集して取り組んだ。

最初warningが20,000件、ビルド時間1293秒とかあったが、インデントや、簡単なのを潰しただけで1000件強まで潰せた。

ライブラリをCocoaPods等利用せず導入していたが、ライブラリのバージョンをコミットログから推測して影響範囲を調査、CocoaPodsに乗り換えた。

ライブラリに独自実装を追加している部分は、そこを調査してforkしたライブラリに移行した。

そうこうして3ヶ月頑張ったら、ワーニングが2万件以上あったのが1件になり、ビルド時間も265秒になった。

最後残った1件は課金のレシートがiOS6形式だからというやつなのだが、現在取り組んでいる。ここらへんが可視化されただけでも良かった。

AndroidXに移行するために / syarihu さん

speakerdeck.com

みんな使っている Support Library、サポートされているのはv14以降だけなのに名前がv7とかになっていて混乱を招くので、support Libraryはv28で終了し、今後は Android X にすべて統合しようというムーブがある。

移行大変そうだが、移行ツールがあるのがあるので使ってみた。

やってみると shortcuts.xml と aapt2でエラーが出た。色々なパッケージ名それぞれで動的に切り替えるようにしてて、リソースの出力が生のxmlファイルだったのだが、圧縮されたflatファイルが生成されるようになったため、そこを迂回する必要があった。

また、Migrate to... を使ったら DeepLinkDispath でハマった。android.enableJetifier が true になったことによって問題が起きていた。これはissueとPRは立っているがまだ解決されていない。

とりあえず今のうちに一回Migrate書けてみて、どのくらいハマるのか見ておくのは良さそう。特にOSSをたくさん利用しているプロジェクトは注意。

Kotlin と比較して理解する Swift 5 で実装されるかもしれない async/await について / y.imajo さん

speakerdeck.com

Swift で今後導入される予定の async は、非同期関数にasyncをつける、awaitで結果を待って取り出すように記述できる。

Kotlin で同じように書こうとすると、Kotlin way にならない。基本は suspend fun でやって、並列処理の待ち合わせだけ async でくるむ。

Swift5でもFutureというものを自分で作って、それでくるんで.getで取り出せば複数処理の待ち合わせができるということがプロポーザルに書かれている。

Tips for migrating to Picasso2.71828 / chiiia12 さん

speakerdeck.com

Picasso を migrate したらつらかった話。

2.5.2 で、一部の端末で画像が表示されない問題があった。原因はわからんけど Jake は v3.0.0 で試してみてと言っている。3.0.0はまだメジャーリリースじゃないので2.71828 にmigrateすることにした。

withがgetになってたりしたりするが、あんまり難しくなく移行できた。

が、コールバック帰ってこないことがたまにあり、つらかった。

結局、Okhttp3Downloaderを使っているところで問題があることがわかった。Okhttp3Downloader は複数あるっぽくて、 JakeのものではなくPicassoのものに変更して解決した。

ブログにも書いたのでご参照ください。

chiiia12.hatenablog.jp

ゆるく学ぶARKit / mcz9mm さん

speakerdeck.com

ARKitでできることを紹介する。

まず平面、垂直、画像の検出。これはARKitがよしなにやってくれる。2.0では複数の画像を同時に認識できるようになった。

3Dオブジェクトの認識。あらかじめ物体のスキャンを行いモデルを作成する。他のアプリから読み込みも可能。オブジェクトの名前も取れる。

AR空間の共有(2.0〜)。Shared experience を用いて、複数人での共有、保存と呼び出し、ARMappingStatusで計測の状態を確認できる。

Quicklook(2.0〜)。これ使うとARKit使う必要なくなる。.USDZを読み込んでAR上に表示。表示だけであればアプリ側の実装は要らない。

Quicklook に関しては以下のページが良いので見ると良い(iOS12, Safariで閲覧できる)。

ARKitshop.magnolia.com

Cloud FirestoreでのClient Side Joinについて / shogo.yamada さん

speakerdeck.com

Client Side Join の概要と実装方法を紹介する。

Client Side Join とは、Firebaseの別コレクション同士の情報をクライアントサイドでjoinして画面に表示させること。

ユーザーが表示しているグループ一覧を表示したいという例を考える。ユーザーコレクションと、グループコレクションというが作られているはずで、これをJoinする

実際のAndroidアプリの実装としてはユーザーが所属しているグループIDを取得しにいく→取得したID一覧をRecyclerViewのセルを生成するAdapterに渡すという流れ。

qiita.com

Farewell SnapKit / kameike さん

speakerdeck.com

SnapKitよりもNSLayoutAnchorの方がDX(Developper Experience) が高いと感じるし、寿命も長いと思うので使っていったらいいんじゃないかという話。

SnapKit は equalTo の後に設定できる型が多様すぎて、書き方によってはありえない組み合わせのものが出来上がったりする。AnchorのほうはNSLayoutXAxisAnchorしか入らんとかになる。

SnapKit の edges が使いたいときは10行ぐらい extension を書けば良い。

SnapKit もまだ保守されているのでまだ慌てる時間ではなさそう。

J2Kコンバータをカスタマイズする / paraya3636 さん

speakerdeck.com

J2Kコンバートで苦労した点。J2KコンバータがNonNullに強制変換してしまう。

温かみのある方法はしんどい‥→J2Kコンバータをカスタマイズ すればいいんじゃないか

Kotlin の TypeConverter.kt を編集して実行すると、Nullable にしてくれるようになった。これで気軽にコンバートできるようになった。

Custom URL Schemeを支える技術 / ぎぎにゃんさん

speakerdeck.com

Custom URL Scheme に対応すると、Safariからアプリの特定の画面に直接遷移することができる。

しかし、Schemeの一覧性が低い、URL中に含まれる文字列やQuery Parameterのパースが面倒という問題がある。

pokedex://pokemons/25 というのをハンドリングしたい場合を考える。普通にやろうとすると結構めんどくさい。のでライブラリ化した。

github.com

これはURLスキームを開くと、open url に渡ってきてよしなにしてくれるというライブラリ。

使い方は Appdelegate で router というのを定義して、 func application()router.openIfPossible(url, options: options) を呼んでやるだけ。

: から始まるパスにマッチした文字列を任意の型で取得することができる。

値のキャストはどうなっているかというと、Extractableというプロトコルと実装している。

type=water というのを enum で受け取りたい場合があるが、これもできる。type=water,grass のようにタイプが複数になった場合も、Swift 4.1 の Conditional Conformance で [Extractable]Extractable に準拠させることで実現できている。

Swift 4.2 から実装される @dynamicMemberLookup を使うとプロパティを動的に生やすことができる。これを宣言すると、subscript(dynamicMember:)の実装を読みに行き、プロパティを生成できる。

そうすることによって pokedex://pokemons/:pokedexID のルーティングを let pokedexID: Int? = context.arguments.pokedexID で取るといったことができるようになった。

まだ master へはマージしていないが機をみて入れたいと思う。

今日話した内容はブログにも書いてあります。

techlife.cookpad.com

sharedUserIdを使った俺得開発ツールの作り方 / Takao Sumitomo さん

www.slideshare.net

アプリ開発デバッグ用の画面を作ることありますよね。そのために内部リリース版を作ったりする。

ここで課題「開発用のサーバーに向き先を変えたい」→これは設定画面に書き換え機能を作って解決した。

しかし、初回のプロセスの立ち上がり時の通信先を変えたいということがあった。これは設定画面では対応できない…

sharedUserId … AndroidLinux のユーザーIDを共有する仕組みがあり、通常アプリごとに異なるユーザーIDが割り当てられるが、意図的に同じユーザーIDにもできる。

これを使って開発ツールを作った。アプリを起動しなくても各種プリファレンスの書き換え、エンドポイントの書き換えができる。

はじめての VoiceOver 対応 / RyoAbe さん

speakerdeck.com

アクセシビリティの属性には5つある。

  • accessibilityLabel - ラベル
    • 画像のみのボタンには label をセットさせることが必須
  • accessibilityTraits - 特性
    • Cell にはデフォルトっではtraits は何も設定されていない
    • ボタンならbutton、リンクならlink みたいにする
  • accessibilityHint - ヒント
    • ラベル、特性だけでは補えない情報
    • たとえば「ここをダブルタップしてください」のようなもの
  • accessibilityValue - 値
    • UIButton の場合は空だがPickerなど値を持つようなコンポーネントには値が入っている
  • accessibilityFrame - フレーム
    • 独自でElementを作ったりしなければ不要のはず

UIAccessibilityPostNotificationは、Stringを読み上げたりviewにフォーカスをあてたりできるが、よく使うならextension にしておくと便利。

Accessibility Inspector Audit を使うと 大まかなAccesibilityの不備を確認することができる。

少し手を加えるだけで利用可能なユーザを増やすことができるし、 明日我々の目が見えなくなるかもしれない。UI設計に対する理解も深まるので、VoiceOverやっていきましょう。

SdkSearchのアーキテクチャ / stsn さん

github.com

SDKSearch は Android SDKのドキュメントを検索するためのJake製アプリ。

特徴:フルkotlin、coroutine を使っている、multiplatform。

SdkSearchの各コンポーネントの説明。(多かったので資料が出たらご参照ください)

全レイヤー感のイベントのやりとりはCoroutineのChannelで行っている。名前の付け方が全体的に独特と感じた。UIBinderとか‥

そんなに大きくないアプリなので、もっと大規模なアプリになると適切な設計というのは変わってくるかもしれない。

VoiceOverについて超語る / coffeegyunyu さん

www.slideshare.net

  • cellのImageViewにタッチイベントを登録するだけではVoiceOver状態だとタップできない、isAccessibilityElementをtrue
  • ラベルがない画像は、 accessibilityLabel
  • Traits = UIAccessibilityTraitImage にしていれば画像から判断して読み上げてくれる(iOS11〜、3本指タッチで)
  • UILabelも設定したほうが良くて、英語の読みがおかしいときがある。発音を設定できる(iOS11〜)
  • CFBundleSpokenName も設定しておけばアプリ名も任意の読みで読ませられる

感想とか

f:id:kumamotone:20180727000256j:plain f:id:kumamotone:20180727000308j:plain

行明けで体調ぶっ壊れ気味だったけど一応ブログ書ききってえらい