kumamotone’s blog

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

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

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

今回はTimersさん主催で、Zoomのウェビナーを使ったオンラインでの開催となりました。

f:id:kumamotone:20200427202651p:plain

[Android] 写真動画のフォルダ選択に対応した話 / akatsuki174 さん

speakerdeck.com

写真フォルダを取得して表示する方法。

github.com

流れとしては

  • ContentResolver を使ってデータを取得
  • 加工しやすい形で格納
  • データを表示する

f:id:kumamotone:20200427201425p:plain

取得するカラムなどを設定する。

f:id:kumamotone:20200427201438p:plain

ContentResolver のクエリとしてはこんな感じになる。

f:id:kumamotone:20200427201449p:plain

データの格納をして、

f:id:kumamotone:20200427201500p:plain

表示はよしなにする。

Android Q(10)〜では、Group by + Count で SQLiteException が起こったが、自前でハンドリングした。DATAはdeprecatedになっていたので、使わないようにした(パス自体は取る方法がある)

[iOS] For Developing URL Routing of SwiftUI App (SwiftUI時代のURLルーティングを考察する) / freddi さん

speakerdeck.com

URL SchemeなどでURLが開かれて、アプリを特定の開くという状態を考える。

SceneDelegateでURLをパースして、特定の画面を開くとき、

以前は application(_:, open:, options:) が呼ばれていた。

f:id:kumamotone:20200427202030p:plain

SceneDelegateではこっちが呼ばれる↑。

特典の画面を開く方法として UIApplication.keyWindow を使う方法があると思うが、これは Deprecated になっている。

SceneDelegate.window を代わりに使う方法もあるが、scene(_ scene:, openURLContexts:) を使って以下のように実装した。

f:id:kumamotone:20200427202324p:plain

ややこしくなってきたらCoordinatorのようなクラスを作るのがおすすめ。

[Android] ML Kit (Auto ML Vison Edge)で写真から家族を検出する / tsutou さん

犬、猫、子供、大人の画像を合計2万5千枚学習させて、入力写真がどれに属するかという分類をML Kit にやらせる。

ML Kit の学習のときは、 オプションに、下限レイテンシ、汎用、高精度を設定できる。

f:id:kumamotone:20200427202948p:plain

5時間ぐらいで割と精度が出た。

ML Kit はローカルのモデルを使用する運用、リモートのモデルを使用する運用、両方が選択できる。両方というのもあり。ローカルでやる場合はアプリサイズが増えてしまうが、それが許容できる場合はローカルに置いて、適宜リモートも使うという方法がよさそう。

実装方法はスライド参照。

[Q] アプリサイズはどのくらい大きくなりますか?

[A] 今回のだと 4MBぐらい

[macOS] Virtual Web Cameraを作ってみよう / kishikawa katsumi さん

speakerdeck.com

Snap Camera 、どうなってるんだろうと思って中を見てみた。

インストーラーを見てみると、.pluginというファイルをインストールしているっぽい。

f:id:kumamotone:20200427203710p:plain

ここに置くとあたかもカメラが増えたようになる。

f:id:kumamotone:20200427203754p:plain

情報が少ないながらもにわかに盛り上がり始めている。

f:id:kumamotone:20200427203901p:plain

公式は、情報が32bit時代のやつでめちゃくちゃ古いが、PDFは2枚でよくまとまっている。

github.com

これを踏まえた上で、OBS用にやってくれてる人のコードとか、

github.com

同じ人が CoreMediaIO DAL plugin のサンプルを公開してくれたりしている。

github.com

さらにSwiftで書き換えてくれている人もいる。

これらを参考に、ウィンドウを重ねれるアプリを作ってみた。

f:id:kumamotone:20200427204119p:plain

やり方、つまづきそうなところだけ紹介する。まず、info.plistについて。Factory interface と右下のやつはなんでもいいんだけど値を合わせないといけない。

f:id:kumamotone:20200427204220p:plain

エントリーポイントの名前はここに対応している(C++の場合)。

サンプルバッファをCIImageにして位置を変えて合成。CIImageにしてオーバーレイ。AVCaptureSessionで画面をキャプチャ、ウィンドウのキャプチャもできる。データの受け渡しは、プロセス間通信が使えるはず。ただしモダンなやつが使えない。

[Android] Troubleshooting on Build & Release Flutter apps / Kenichi Kambara さん

speakerdeck.com

Flutterアプリをリリースしようとしてみた。

Android側はRelease用の証明書をコンソールに登録しないと通らない。

Androidは透過画像がアイコンに設定できるのだが、iOSはアルファチャンネル入っているとArchive→Validate Appで弾かれる。

ソーシャルログインがある場合、Sign with Apple 対応しないとリジェクトされます。

[iOS] Touch Bar on Catalyst / fromkk さん

speakerdeck.com

以下書いたけど公式の書き起こしがあるのでそっちを見たほうが良い。

note.com

f:id:kumamotone:20200427205650p:plain

Catalyst から Touch Bar が使える。NSTouchBarとして表現される。限られているものの、 6種類ぐらい使える。

実装方法。

f:id:kumamotone:20200427205759p:plain

NSTouchBar.CustomizationIdentifierを定義。どのTouchBarかを識別する。

f:id:kumamotone:20200427205940p:plain

NSTouchBarItem.Identiferで表示する項目の種類を識別。

f:id:kumamotone:20200427210425p:plain

CatalystではmakeTouchBarというメソッドを実装する。

f:id:kumamotone:20200427210448p:plain

NSTouchBarに生えているプロパティはこんな感じ。

f:id:kumamotone:20200427205900p:plain

カスタマイズできるかどうかはここで設定できる。

f:id:kumamotone:20200427210633p:plain

NSTouchBbarDelegateを実装する。メソッドは1個しかない。

NSTouchBarItemには、customizationLabelを設定しておくと、カスタマイズ時にラベルが表示されるようになる。

f:id:kumamotone:20200427210545p:plain

Touch Barを検索する場合順序があって、こんな感じになっている。

注意点。Swift UIでは表示できなかった。また、スライダーを表現するNSSliderTouchBarItemから取得するプロパティが無い。keyから取ってこれるけど心配。

サンプルコードは公開しています。

github.com

[Android] Tips on Databinding in RecyclerView / Shota Ara さん

RecycleView で LiveData を DataBinding する。

f:id:kumamotone:20200427210954p:plain

lifecycleOwner と model を binding に設定する。

今回話したいのは、lifecycleOwnerについて。

f:id:kumamotone:20200427211117p:plain

ここに何を渡すかというと、Activityなら、Activity自体だが、Fragmentの場合はviewLifecycleOwnerを渡す必要がある。

RecyclerViewの場合は? binding.root.contenxt as LifecycleOwner を渡す。一見できているように見えるが、これだけだと挙動的にメモリリークしている。

f:id:kumamotone:20200427212543p:plain

解決方法。FragmentのLifecycleOwnerを渡せば良い。また、viewHolderをLifecycleOwnerにするという手もありそう。

[iOS] e-Conte board 開発話 / codelynx さん

https://speakerdeck.com/codelynx/e-conte-board-dev-story

f:id:kumamotone:20200427211959p:plain

絵コンテを作るためのアプリを作った。Apple Pencilで書き込める。

Core Graphics を使っている。

f:id:kumamotone:20200427212139p:plain

f:id:kumamotone:20200427212153p:plain

スクロールする方法はいくつかあるが、今回は3を採用(ペンと指で別の機能にする)。

f:id:kumamotone:20200427212238p:plain

タッチでdrawできなくしたり、pencilのときはZoomできなくしたりできる。

また、縦に広がるSegmentedToolControlというのを作った。

f:id:kumamotone:20200427212343p:plain

これについてはAdventCalendarに書いた。

qiita.com

また、コードはGithubで参照できる。

github.com

ちなみにアプリはダウンロードできるけど課金しないと使えない このアプリ使う可能性のある人って100人ぐらいしかいないので全員にダウンロードしてもらっても採算取れない せつない

[Android] ContextThemeWrapperでThemeをより賢く / rmakiyama さん

スライド

speakerdeck.com

radiotalk.jp

ContextThemeWrapperでThemeを動的に置き換えられる。

例として、ステータスが変わったらImageViewの背景色を変えるというのをやってみる。

f:id:kumamotone:20200427213011p:plain

既存のcontextを第1引数、置き換えたいやつを第2引数に指定する。

f:id:kumamotone:20200427213058p:plain

Viewの生成のときにも同じようにできる。

[iOS] SwiftUIでNeumorphism!!! / Ryo Tsuzukihashi さん

speakerdeck.com

f:id:kumamotone:20200427213323p:plain

iOS6ぐらいまで使われていた、Neumorphismという考え方がある 現実の物質に似せて、直感的に操作を理解させるというやつ。

f:id:kumamotone:20200427213355p:plain

実装、ColorのExtensionでベースのカラーコードを受け取り、ベースの輝度のみを変えたもので影を作る。

f:id:kumamotone:20200427213542p:plain

shadow(color:radius:x:y) を呼び出したら簡単に Neumorphism の影がつけられる。ライブラリにした↓

github.com

[Android] Wi-Fi Suggestion API / syarihu さん

おすすめの通知ダイアログとともにWiFi情報を自動で追加してあげる機能がある。

f:id:kumamotone:20200427213934p:plain

Q以上の場合は以前のAPIがdeprecatedになっているのもあり、Wi-Fi Suggestion API を使うと良い。

f:id:kumamotone:20200427214044p:plain

一回いいえで拒否されると、割と深いところで権限を取り直してもらわないといけなくなる。のでこれを出すときは割と丁寧なコミュニケーションをしないとユーザビリティ的に面倒なことになる。

f:id:kumamotone:20200427214214p:plain

このメッセージだが、2019年12月5日のアップデートで変わったので、同じAndroid 10 でもメッセージが違うという罠がある…

f:id:kumamotone:20200427214332p:plain

ブラックリストに入れられるとSSIDはどこからも確認できなくなってしまうので、解除について注意事項を書いておいたりすると良い

f:id:kumamotone:20200427214414p:plain

アンインストール時には削除されるのは、覚えておくと良さそう。

また、Android11以降は、大きな変更が入ってるっぽいので注意してみておくと良さそうとのこと。

[iOS] Custom Gesture Recognizer の世界 / TachibanaKaoru さん

speakerdeck.com

Gesture Recognizerの話

f:id:kumamotone:20200427214819p:plain

ジェスチャが認識されている途中で音を鳴らすとかしたい

そういうときのために Custom Gesture Recognizer がある。

f:id:kumamotone:20200427214924p:plain

UITouchのpreviousLocationには直前にタッチした場所が入っている。

f:id:kumamotone:20200427214959p:plain

この位置が現在の位置と離れていれば離れているほど速く動いているってこと。

f:id:kumamotone:20200427215117p:plain

速さと同じようにgradient(方向)も取ることができる。

f:id:kumamotone:20200427215233p:plain

ジェスチャの各状態のときに、速さと方向が取れる。

f:id:kumamotone:20200427215308p:plain

P→P→P→Rなパターンのみ成立とみなす。

ストロークによっては、ユーザーの入力を意図通りに判断するのが難しい場合もあるため、状況に応じた最適化が必要。

コードはこちら

github.com

そのほか

  • リモート参加だとディスプレイ広く使えるのでブログ書きやすくて良い
  • カナダと福岡から発表している人もいてそれも良かった
  • 個人的に内容も勉強になるのが多くてよかったです!
  • QAがZOOM上でやれるのも良い

f:id:kumamotone:20200427215213p:plain