kumamotone’s blog

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

「SwiftUI を理解するために必要な Swift 5.1 の新機能 (some View編)」の書き起こし

先日、Bonfire iOS #6 というイベントで、「SwiftUI を理解するために必要な Swift 5.1 の新機能 (some View編)」という15分のトークをやりました。

Bonfire iOSは自分で立ち上げて毎回企画してきたイベントで、今回は後輩に運営の旗振りをお願いしたところ、自分も発表する流れになり、不安を感じつつもなんとか発表にこぎつけることができました。

ありがたい反応もいただいています。

資料は Speaker Deck にありますが、資料だけだと分かりづらい部分もあるかと思うので、今回は実験的に書き起こしを用意してみました。

当日来られなかった方や、発表の復習に使いたい方などに使っていただければ幸いです。

続きを読む

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

超遅刻投稿です。申し訳ありません。

potatotips #61Androidブログまとめ枠で参加させていただきましたのブログです。Wantedly さんでの開催。

遅れて参加になってしまったので最初の2本は聞いた内容ではなくスライドを読んで書いてます>< 最近は両OSとものまとめを書いていましたが今回は素直にAndroidトークのみまとめています。

[Android] Clip, Elevation, ViewOutlineProvider

speakerdeck.com

ImageViewを角丸にしたり丸にくり抜いたりとかすることがある。

BitmapTransformation(Picasso/Glide)は簡単に使えるが、transformation animationをつくるのが難しい。Canvasを使ってclipするのはCanvasの知識が必要でなかなかむずい。さらに、これらはelevationでの影がが適切に反映されない。

developer.android.com

ViewOutlineProviderというのを使う手があって、これを使うと elevation もうまく反映されている。ただしAPI 21+。簡単にclipやtransformができる。

[Android] CameraXとMLKitの関係や如何に

www.slideshare.net

CodelabsでCameraXとFirebase MLKitをさわった

Camera2では全部コールバックで順序関係あり、しかも画面のライフサイクルい依存しているのがつらかった Camera Xは設定さえすればLifecycle-awareである 便利!

Firebase MLKitではシンプルなインターフェイスで物体認識や文字認識ができる

Codelabsはそれぞれ30〜60分ぐらいでこなせる量 くっつけて、カメラをつかった物体認識や文字認識が簡単にできた 便利!コードはこちら↓

github.com

[Android] 外部SDKのViewにマスク処理をする方法と罠

speakerdeck.com

f:id:kumamotone:20190515194757p:plain

歌詞表示Viewの上下にグラデーションをかけたい ただし、歌詞表示Viewは外部SDKのもので手を入れることはできない

ViewGroup#dispatchDraw で子Viewの描画をフックすれば子Viewにエフェクトがかけれそう ただし super.dispatchDraw(canvas) のあとに単に canvas にマスク処理するのはすでに後ろのViewがcanvasに描画されているためNG

オフスクリーンバッファ(ViewGroupと同じ大きさのBitmapとCanvasを用意)すればよい

ViewGroup#dispatchDraw で オフスクリーンバッファをクリア→オフスクリーンバッファに子Viewを描画→オフスクリーンバッファを加工(LinearGradientとPorterDuffを使う)→オフスクリーンバッファの内容をcanvasに描画 というようにすればよい

罠として、対象のViewがalphaを持っている場合はそのalpha値が反映されてしまい、意図しないエフェクトになってしまうことがあるので注意

Githubにコードがあるので参考にしてください

github.com

[Android] アニメーション実装の新しい選択肢 MotionLayoutが中々便利で期待できそう

speakerdeck.com

MotionLayout便利 最初の状態と最後の状態を制約で指定することでアニメーションをひとつのXMLで実現することができる

とくにすごいのはSwipeとClickのTransitionが指定できることで、これをやるとスワイプやクリックをトリガーにしてアニメションすることもできる

alphaの状態でスライドを作成したが2019/05/09 にbeta1が出たとのこと

[Android] Google Play Consoleの時間指定公開のハマりポイント

speakerdeck.com

通常の公開は公開ボタンをクリックしてからGoogleでアップデート処理があり、その後ストアに反映される。一方、時間指定公開はGoogleでアップデート処理が。名前がわかりにくいが、時間指定公開というのは時限式という意味ではない

時間指定公開した場合、リリーストラックの変更のログが反映されないが、市場公開されているわけではない。公開ボタンを押すまでは市場公開されないので安心するとよい。

[Android] Recommend Widgetを作った話

おすすめ記事を出すView?を作った CTRを計測するためにViewTreeObserverを使用したらしい

[Android] Androidの開発とFlutterの開発を比較してみる

AndroidとFlutterを比較してみる

  • 言語
  • Viewのコード
    • 似てる
  • APIコール
    • 似てる
  • テストコード
    • 似てる
  • アプリサーズ
    • 現在のところFlutterはでかいことがある

[Android] Flutter 1.5 Features(Overview+Alpha)

Flutter 1.5 の新機能。 Dart 2.3、バグフィックス、Material & Cupertio widget sets、アプリ課金(in-app purchases)サポート、Flutter for Web。

Flutter for Webは現在Technical Previewという状態で、Githubにコードが上がっている。

github.com

Hello Flutter for Web の方法はGithubにあるがそのままやるとうまくいかない場合もあるのでQiitaとかにもやり方が書いてあったりする。

そのほかの資料

github.com

感想とか

f:id:kumamotone:20190525010702j:plain

AndroidGoogle I/O 後ということで新しいトピックが多くて面白かった。iOS も fromkkさんが Dark Modeを実現するライブラリ を作っていたりして、新しいトピックないのでとか言ってないで自分もなんかやらんとなぁと思いました。

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

超遅刻投稿です。申し訳ありません。

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

会場は ZOZOテクノロジーズ さんでした。

f:id:kumamotone:20190328000501j:plain

バッチバチにおしゃれな社屋 やっていきを感じる

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

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

togetter.com

意外に面倒じゃなかったXcode Template

Xcode の テンプレートは自分でも作れるぞ 作り方を紹介 xib とか storyboard もできるらしい

(自分用メモ)ここらへんとかも参考になりそう↓

www.lanches.co.jp

アプリのパフォーマンス改善を数値化

speakerdeck.com

Firebase Performance Monitoring で パフォーマンス計測、Firebase Remote Config で ABテストができる 組み合わせると簡単に計測できて素敵

Bitrise の人のデモ / Viktor さん (Bitrise iOS Engineer)

Bitrise すごいよ モバイル特化しとるんや 簡単 code signing 設定 とても簡単

  1. なんか新機能の予定はある? A. 物理デバイスでのテストができるようになるかも

Bitrise の人のデモ / Tamas さん (Bitrise Android Engineer)

Bitrise すごいよ 簡単 設定 とても簡単

Bitrise 上で UIテストできて動画ブラウザで見れる バリアントの設定もできる

iOSで正しく歩数を取得する

speakerdeck.com

HealthKit の HKSampleQuery でiOSバイスの歩数などが取得できる。しかし、HKSampleQuery を使うと、 iPhoneApple Watch の歩数が重複してカウントされてしまう。

HKStaticticsQuery の options: .cumulativeSum を使えば、 重複を考慮していい感じに集計された値が取れる。Bundle ID(com.apple.healthからはじまるもの)で絞ることで不正対策ができる。

サンプルコード

github.com

Qiita

qiita.com

Firestoreを使って純広告配信機能を作った話

speakerdeck.com

ユーザーの所在地、性別、年齢の推定情報などをUserPropertyに設定して、RemoteConfig と連携させると、ターゲティングが簡単にできる。便利。

Azure PipelinesでiOSアプリをCI/CDしてみよう🚀

speakerdeck.com

Azure Pipelines は CI/CD サービスで Azure DevOps の1機能。無料枠で1800分/月、オープンソースプロジェクトなら並列ジョブ10で無制限に動かせる。

f:id:kumamotone:20190416112419p:plain

Visual Designer を使うことでpod installしてビルドしてApp Centerで配布、みたいなパイプラインをGUIで書くことができる。

App Centerと併用することでテストアプリを配布できる。

protobuf in kotlin

speakerdeck.com

square/wire に 2019/03/14 の Version3.0.0 alpha01 で Kotlin Generator が追加されて、Kotlinのデータクラスを吐いてくれるようになったっぽい。

--java_interop をつけるとBuilderパターンのメソッドチェーンでプロパティを設定できるようになる?

proto2 から proto3 になったときに requiredとoptionalが廃止されたっぽく、その影響で proto3 から生成したモデルには NonNull と Nullable の区別がなくてすべて Nullable になるっぽい(マジか)。

f:id:kumamotone:20190416112343p:plain

github.com

WebView as 
Fancy and effective 
View

speakerdeck.com

Webの表現力の高さを利用して以下を実装してみた

  • 紙吹雪
    • minifyしたjsファイルを読み込んでWebGLで描画
  • グラフ
    • React/Recharts というD3のラッパーライブラリを使って表示

iOS/Android でだいたい同じ体験を一度に実装できるので便利だが、Webの技術、アプリエンジニアが扱うと大変っちゃ大変なので上手に使っていきましょう

f:id:kumamotone:20190327210314p:plain

Transparent な WebView の作り方はこれだけ

iOSアプリで気になった動きや表現を上手にアレンジして活用してみる

www.slideshare.net

Twitter の TabBar 画像のバウンドアニメーション、Pinterest のコンテンツ画像の段差表示の表現、Yummyのコンテンツ画像の示唆効果の表現など、巷のアプリで気になったUI表現を取り入れたサンプルを作ってみたので、その紹介と実装などについて。

medium.com

僕は上スワイプでBottomSheetを出したかっただけなんだ

docs.google.com

BottomSheetDialog を、"シート部分ではないところを上にスワイプして全画面になるように引っ張り出す"やつをやりたい。(説明が難しいのでGoogle Docs のアニメーション参照)どうするか?を解説 

github.com

つかおう!L2CAP

speakerdeck.com

通常のBLE実装と比べたときのL2CAPの利点

  • 一回あたりの送信できるデータサイズが大きい
  • BLEの手続きをラップしてくれていて、NSStreamを扱うだけで良い?

マルチモジュール化のTips

speakerdeck.com

マルチモジュール化すると並列ビルドできてビルド速度が改善する。packageで分けるより強い制約をつけることができる。Dynamic feature modulesを利用することができる。

Dagger使ってて新しくモジュールを追加したがビルドに失敗して半日ほど潰したが、kotlin-kapt忘れただけだった kapt 忘れは dependencies をスクリプト化して防ごう

感想とか

f:id:kumamotone:20190328000533j:plain

少なくとも次の回の開催までには投稿するという自分ルールがあったのだが今回ついに破ってしまった。Bitriseのおふたりと休憩時間や懇親会で結構お話できた。

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

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

f:id:kumamotone:20190301002053j:plain
会場

会場は GREE さんでした。

f:id:kumamotone:20190301001957j:plain
採用強化中+KMNZのチャンネル登録よろしくとのこと

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

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

Page Object Pattern with XCUITest

speakerdeck.com

Page Object Pattern は DRY かつ Readable な UIテスト を実現できる

Firebase A/B Testingを使ってサーバ側までA/Bテストした話

Firebase A/B Testing エンジニアじゃなくても条件変えれるので便利

ModelをLayerで分けてUnit Testの観点を明確にする

speakerdeck.com

Layered Architecture にしてテスタブルにしてる 各層のテストの書き方を紹介

簡単にARアプリを作ってみよう

ARCore / SceneForm のおかげで3Dモデルの知識なくても簡単にARできる!ありがてぇ

SwiftでVRMファイルを表示してみた話

speakerdeck.com

github.com

VTuberKit 作った VRM読み込んでSceneKitで表示できるぜ! 実装を紹介 今はUnityのアニメーションをimportするのをやってる

ViewPager2をちょっとさわってみよう

speakerdeck.com

ViewPager2のIFはほとんど同じ RecyclerViewを使って実装されてる RTLサポート、縦方向ページングサポート、1のバグが治っているなど まだalpha

RxSwiftに対応したバリデーションをGenericなProtocolで実装してみた

extension ObservableType {
  func validate<V: Validator>(_ validator: V.Type)
    -> Observable<ValidationResult<V.ErrorType>> where V.ValueType == Self.E {
      return map { validator.validate($0) }
  }
}

RxSwiftのチェーン中に protocol Validator を実装したやつを実装したクラスを与えてバリデーションできるように、 ObservableType に extension 生やして解決した シンプル

github.com

AndroidX Navigationを導入した話

speakerdeck.com

そろそろstableのNavigation safeArgsでの方安全なFragmentArgsの生成、Deep Link、Transition Animation、Shared Element

Navigation 使うと常にバックキーで戻れるようになってしまうが Activity#addOnBackPressedCallback() を使ってハンドリングできる

逆引きRxSwift: 編集画面のViewModel設計と実装

note.mu

編集画面のViewModel設計。 startWith使うと双方向バインディングしながら初期値設定できる

AndroidアプリのUI/UX改善例その2

speakerdeck.com

項目が多いので https://github.com/mirrajabi/search-dialog というのを使ってフィルタリングできるようにした

教えて!Xcode

speakerdeck.com

Address Sanitizer は配列外アクセス等を検出できる Diagnostics から有効にできる(ObjCのみ) 詳しくは以下を見ると良い

qiita.com

Androidの状態管理をするライブラリOwlの紹介

speakerdeck.com

Reduxライクな状態管理ライブラリを作っている Coroutineを使った非同期処理の導入、Jobの管理、ViewModelとの統合

画面遷移が絡む値の受け渡しをRxSwiftで直列化してみた

speakerdeck.com

github.com

subscribe複数回書かないと行けなさそうな処理を呼び出すVCにObserverを置く→呼び出し処理をprotocolのextensionにして直列化した

あらためてLiveData

LiveData, MutableLiveData, MediatorLiveData の説明 わかりやすい

OWASP MASVS

OWASP MASVS は モバイルアプリケーションの基準となるセキュリティ要件

Immutable data holder

speakerdeck.com

Immutable な LiveData のみを公開しよう LiveDataならswitchMapで変換できる 拡張関数でより簡潔にできる

感想とか

f:id:kumamotone:20190301001938j:plain
すし

RxSwiftの話が何故か多かった気がする

NavigationやViewPager2とか新しいライブラリのTipsが知れてよかった

RxSwiftのバリデーション用のextensionは簡潔に書けてすき

VRMKitはシンプルにすごい

今回も最初からへとへとでついにちょっとしたコメントを書くのがやっとになってしまった

懇親会では個人的にも最近導入したLiveDataの話できたりとか、インターネッツではお見かけするREALITYの人ともお話できてなんだかんだよかった

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

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

会場は FiNC Technologies さんでした。

f:id:kumamotone:20190128233606j:plain

個人的には今月のApp Client Melting PotというFiNCさん主催のイベント以来だったのですが、なんか重大発表でも始まるんかってぐらいおしゃれ会場でした。

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

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

RxSwift - テストスケジューラの解像度について / y.imajo さん

speakerdeck.com

RxSwift で .debounce() をテストする話。

debounce(0.3)なら 3.3 秒のタイミングとかでちゃんと発火されるかとかを調べたい。ただ仮想時間は整数なので現実時間指定の0.3と合わない… →仮想時間に変換すればOK

qiita.com

今からはじめるrobolectric / moriiimo さん

speakerdeck.com

RobolectricでUIテストを書いてみる。 @Config(sdk = [LOLLIPOP])sdkのバージョンを指定できる。.start() や .resume() とかでライフサイクルを呼べる。performClick クリックイベントを模することができる

Roomのテストを書いてみたい。書いてみた。context には InstrumentionRegistry.getInstrumentation().targetContext をつかう

アプリ内の絵文字をカスタム絵文字化した話 / RyoIzumi さん

iPhoneでもTwemojiを表示したい。Apple絵文字をちゃんとTwemoji化するのは意外と大変で、家族の絵文字をconvertすると家族分裂したりする。

詳しくはUnicode Emojiのことを勉強してくれという感じなのだが、emojicaというライブラリがあるのでこれが使える。

github.com

UILabel や UITextView 上のiOS絵文字をカスタム絵文字に変換できる。

日本語入力で UITextViewのmarkedTetRange が考慮されていないとか emoji 11.0 に対応してないとかあったが、パッチを送ってなんとかした。(emoji 11.0に関しては今送ってるところ)

Flankでテストを爆速にする / Kubode さん

speakerdeck.com

Flank はFirebase Test Lab を並列化するテストランナーで、Android/iOSに対応。導入が結構簡単。

github.com

なぜ導入したのか?CIテストに28分とか掛かる… そのうちgcloud(Firebase Test Lab)に18分掛かっていた。

導入した経緯としては、CI/CD Test Night #2 でBitriseの中の人が紹介していたので。

Flankの機能。YAMLによる設定の管理ができる。gcloud公式のYAMLと互換性のある記述が可能。FirebaseTestLabでやってれば移行が簡単。

シャーディング。これがメインなのだが、指定した数に自動でテストを振り分けることができる。各シャードで必ず実行するものを指定したりもできる。 testShards=-1にすると最速だがテスト数*1分の課金が発生し、270個のテストだと4.5ドルも掛かってしまう。いいあたりで調整する必要がある(8とか16とか)。

コストレポートが出せる。テスト結果はHTMLやJUnitXMLで出せる。

fastlane+Bitriseでやったが、./results/*/をコピーすればテスト結果をbitriseですぐ見れる。

もともとFirebaseを導入していたのでほとんどやることなかった。flank.jarは24MBもあるのでgit管理しない。

Flankでshard=16にしたら28分が8分になった。やったね

CI上で結果が見えやすくなりテスト項目の見直しに繋がった 速くなっただけでなく、未使用コードの削除や無駄なwaitに気づけるなど副次的な効果もあった

導入コストも金銭的コストもやさしいので、iOSにも導入したい

SceneKitでふんわりした影を描画したい / noppe さん

speakerdeck.com

iOS12 から usdz をサポートするようになった。

File アプリで プレビューやAR配置ができる。

Fileアプリで見ると影がきれいについている。これはWWDCで語られていた Contact Shadow(設置感・重なり感を出すもの)だと思われる。これをやってみたい!

SCNLight の castsShadowをONにして、directionalかspotタイプを使う。するとかなりはっきりした影ができてしまう。shadowRadiusというプロパティを使えばふんわりになるがなんか雑な感じ…

さらに調べていると、Contact Shadowとは耳慣れた言葉で言えばAmbient Occlusionのことであるという記述が見つかった(耳慣れたってなんだよ)

SSAO…ScreenSpaceAmbientOcclusionはカメラに生えとって実装できるが、ふんわりしない…ふんわりした影は自前でやらないと無理そう

SCNTechniqueという、マルチパスレンダリングのためnクラスがある。これは画面1回の更新の間に、異なるシーンを複数回レンダリングして合成した結果を表示する機能で、MetalやOpenGLESでシェーダを書くことができる。カメラを2つ配置して、下からの入力を深度に変換しブラーをかけるみたいなのを作ってみたが、モアレ(縞模様)ができたりしてうまくいかなかった。シェーダ真面目に書こうとするとサクッとできなさそう

最終的には、gobo(SCNLightの影を自前の画像で描画する機能?を使って、SCNTechniqueで深度画像に変換→SCNViewのsnapshotでUiimageで取得→ブラーかけて→goboに渡した

これではまだFileの表現に達してはいないが、今までのに比べればまぁまぁ見れるものができた

MDCのBottomAppBarのShadowの実現方法 / HiroYUKI Seto さん

speakerdeck.com

OSがShadowを描画する条件。

  • Android 5.0↑
  • elevation が 0 より大きい
  • Viewのアウトラインが四角形か、凸図形(凹んでいる部分がない=CONVEX_PATH)

BottomAppBarは明らかに凹んどるけど影がついてる。これどうしてるの

MaterialShapeDrawableを使ってるっぽい。でTopEdgeがMaterialShapeBottomAppBarTopEdgeTreatment。これはarcでくぼみを表現していて、TreatmentのgetEdgePathを見れば分かる。

setShadowCompatibilityModeをSHADOW_COMPAT_MODE_ALWAYS にすればOSがつける影以外が使える。ShadowRendererというのを使ってて、便利じゃんと思ったが、残念ながら @hide (IDE上で見えなくする?)や @Restricto(LIBRARY_GROUP) (ライブラリ内から呼ばないとwarining出る的なやつ?)アノテーションがついており、リフレクションとかしないと使えない。

スクリーンタイムと仲良くなる / 5mingame2 さん

speakerdeck.com

iOS11から純正のカメラアプリでQRコード対応している

ところで、スクリーンタイムというiOS12からアプリの使用状況を集計したり、時間制限をかける機能がある。時間制限が掛かっているとアプリ起動直後に落ちることがわかった。

どうやら制限掛かっていると、AudioSessionのコンテキストが取得できてない様子 didFinishLaunchingWithOptions: で初期化処理をしてたのだが、ここで落ちてる感じだった

UnityでiOSアプリをビルドするとXcodeのプロジェクトとソースが生成される。これを参考にした。するとここら辺 applicationDidBecomeActive: に書いてたのでそこに移動した。

いまさらWorkManager / どくぴーさん

speakerdeck.com

適宜実行されたり実行されたことの保証が必要なバックグラウンドタスクを扱う。compileSdkVersion 28。

シンプルでこれまで自前で実装しないと行けなかった要件、たとえばAPIレベル、Play Servicesの有無によるJobScheduler/AlermManager/FirebaseJobDispatcherの使い分け、バッテリ・通信状態などに合わせた処理などとかを自動でなんとかしてくれる

Workerについて。Worker を継承したクラスを作る。override fun doWork() 内で必要な処理を記述し、成功・完了に応じてWorker.Result.success/failureを返す(これ以前は定数だったので codelabs のコードを直接使うと死ぬ)

WorkRequestについて。Workerへ実行に必要なデータを与える(DataクラスをbuilderクラスでbuildしたものをsetInputDateでsetする)。注意点としては、でかいデータは与えられない。一度だけ実行できるものと定期的に実行させるものがある。

生成したWorkRequestの実行はWorkManager#enqueueするだけ。

複数のworkを連結したいときがある。WorkManager#beginWithでContinuationが返ってくるのでthenで連結とかすると、重複することがある。なのでWorkManager#beginUniqueWorkに変更する。でExistingWorkPolicyで実行中の処理に対する処理を変更する。

Workの実行状態を制限したいときは、実行時に制約(通信状態や、充電中かどうか‥など)が付けられる。uniqueIdを与えたContiuationはキャンセルできる。LiveDataとの連携、Rxサポートもある。

UIViewPropertyAnimator and Easing / TachibanaKaoruさん

speakerdeck.com

UIVIewPropertyAnimatorはiOS10〜なのでそろそろ入れてもいいんじゃないという感じ。

UIView.animate は都度アニメーションのようすを設定するが、 UIViewPropertyAnimatorは動きを宣言して、好きなタイミングで実行するようになった。イージングが簡単にできる。

制御点を設定できるのだが、結構難しい。カスタマイズするときはデフォルトで定義されているやつをちょっといじるのが良さそう。

既存のライブラリのパラメータを拝借してイージング用のUIViewPropertyAnimatorをいっぱい生やしたextensionを書いたので難しさ感じる人は使ってみてください。

github.com

既存プロダクトにダークモードを実装した話 / Hakuto Suzuki さん

ダークモード、目に優しいだけでなくコンテンツを目立たせることができる。(画像がいい感じに見える)

夜間の利用ユーザーが多いので導入した。CVR にも良い影響があった。

実装は AppcompatDelegate.setDefaultNightMode(AppcompatDelegate.MODE_NIGHT_YES) を設定。

WebViewへの画面遷移を挟むとなぜかDarkmodeじゃなくなるというバグがあった(GoogleのIssue Trackerに登録されている)遷移する前にWebViewの初期化を再度行うと回避できるっぽい

WebView怖い

Hint of “Passcode Lock” Screen and Logic (with LocalAuthentication). / fumiyasac さん

www.slideshare.net

パスコードロック画面作った。設計を紹介。

バックグラウンドに入るタイミングで上に画面かぶせる感じ。AppDelegate のライフサイクルでなんかやってる場合は処理がかち合うので注意という感じだった

詳細はQiitaで:

qiita.com

5プラットフォームをサポートしているプッシュ通知SDKをFCMに移行した話 / konyavic さん

speakerdeck.com

SDK開発者として実装に必要なステップを減らし、ドキュメントをシンプルに保つことを意識している。

アプリのグロスのためのSDKを作っていて、プッシュ通知、ABテスト、アナリティクスなどが利用できる。5プラットフォームに対応している。このSDKを2019年4月までにGCMからFCMに移行しないといけないことになった。

トークンの取得部分を変更することになったが、FCM、Tokenの取得メソッド多すぎ問題。FirebaseInstanceIdのgetToken()というのがあるがdeprecated。getInstanceId()は推奨されているけど新しすぎて、SDK利用側が利用できないかもしれない。結局はgetTokenなどでも使えるAPIは維持しつつ、getInstanceId()でtokenを取得するようにした。

つかおう!Storyboard / coffeegyunyu さん

speakerdeck.com

コードでUI書いてるとつらいときある。StoryBoardを使うと、iPadのときの文字サイズ、横向きにしたときの指定などが簡単に指定できる。

これにより、iPhone/iPadや横向き対応はもちろん、Container View、UISplitViewController、Pop Over、Form sheet、Slide Over、Split View、iPad ProのPortrait+SplitView+UISplitViewController、tvOS…などなど色々な UI の表示形式に対応することができる。

github.com

Visionとモザイクで遊んでみた / ochimさん

WWDCの資料とクラスメソッドのブログ見て実装した。VNDetectFaceRectanglesRequestで顔取れる。boundingBoxに位置が入っている。この座標系は左下起点のやつでUIKitと違うので注意。

CIFilterを使うとモザイクかけれる。boundingBox使うと顔だけモザイクかけれる。

感想とか

最近へとへとになりながら会場向かってへとへとになりながらメモりがちで懇親会の頃にはへとへと度高めだけど最終的には懇親会でいい感じに刺激受けれるしやっぱり今回も色々知らないこと知れたりして良かったな〜ってなるので良い

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

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

会場は アイスタイル さんでした。

f:id:kumamotone:20181218192411j:plain
アイスタイルさん

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

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

[iOS] テストデータ自動生成方法の別解 / tattn さん

speakerdeck.com

ユニットテストでMockAPIClientを作るときに 特にViewModelなんかしんどい。ネストしたテストデータの初期化なんかが特にしんどい。

APIのレスポンスをテストデータに差し替える方法としては、たとえばprotocol で差し替えたMockAPIクライアントにデータを差し込む方法がある。

乱数で初期化してテストデータにするというのが良いんじゃないかと思った。

github.com

コード生成を使う方法と、リフレクションが考えられる。コード生成は外部ツールを使うことになるので今回はできればしたくない。

Swiftのリフレクションには、Mirrorというのがある。しかし使う前にインスタンス化が必要。というわけでCodableを使うのを思いついた。Randomizable というのを作った。

Randomizable に適合したやつのrandomValueを呼ぶとプロパティのランダムな値を返してくれて便利。ランダムのルールはカスタマイズできる。

実装は、RandomDecoder() っていうのを作っている。Randomizable に適合させると、 Decodable に適合している型であれば、randomValueの実装がいらなくなる。

実装はひたすら各型について書かないといけないので結構大変だが、とにかく乱数を返しているだけである。

ランダムなJSON文字列がほしければ、ランダム生成してDecoder使えば良い。コマンドラインツールとして活用できそうなので、SPM対応した。

Codable はリフレクションにも使える。黒魔術やリフレクション、コード生成など使えるものは何でも使って楽していこう

[Android] Firebaseで解決するAndroidの機種依存 / gyamoto さん

speakerdeck.com

Androidには機種依存がある。たとえばBLEのアドバタイズをおこなうと、出力強度とアドバタイズ感覚が機種によって異なるなど…

たとえばXperia 系は BLE の強度が弱い、Galaxy系は出力を挙げないとアドバタイズ系が安定しない、などBLE のパラメータは機種依存があることがわかった。

機種によって設定を変えてやりたいが、これをハードコーディングしていくのはつらい。

なので Firebase UserProperty と RemoteConfig でパラメータ設定した。

Firebase UserPropertyは言語や地域などユーザー層を示す属性を設定できるプロパティ。RemoteConfigなど、Firebaseの他のサービスでユーザー判定のフィルタリングとして使える。

RemoteConfig管理画面で設定した値を配信する仕組み。アプリから設定された値を取得して永続化、参照できる。

この2つを組み合わせる。以下のような流れでやれば良い。

  1. まず機種を特定できる端末情報をUserPropertyに設定
  2. UserPropertyから機種ごとの値をRemoteConfigに保存
  3. RemoteConfigによってアプリの振る舞いが変わるように実装

[iOS] RxSwiftとMVVMパターンと仲良くなる次のステップ / fumiyasac さん

www.slideshare.net

MVVM でアプリ作った。以下のようなことをした。

  • UICollectionViewをベースにしたカルーセルを表示する
  • ドロップダウンメニューから表示内容を変更する
    • メニューを Observable で表現
  • 初回表示状態からボタンを押すとまつ尾に10件ずつデータを表示する
    • BehaviorRelay で通信状態やリストを表現
  • インクリメンタルサーチで該当したデータを最大10件表示する
    • Debounce や Throttle を利用する

サンプル:

github.com

Qiita:

qiita.com

[Android] Empty State表示共通化の事例 / kentaro さん

speakerdeck.com

Empty State(○○はありません的な)の表示を共通化した。

Empty State表示、画面作成時に都度デザイン・実装していたのだが、画面によって表示がバラバラだし、そのたびに考えることが増えたりして大変だった。

通化することによって表示を統一して、コスト削減になった。

具体的な実装は、何がemptyなのかをenumで表現、Viewはカプセル化プロトコルとデフォルト実装などを使って綺麗に実装した。

楽できるところは楽して注力すべきところに注力できると良い。

[Android] Behavior of nested async in Kotlin Coroutines / URI さん

speakerdeck.com

Kotlin 1.3 になってCoroutineがstableになった。アップデートしたら、アップデート起因の不具合を埋め込み(流出はしていないが)、修正することになった。

バグ対応から学んだ、ネストしたasyncのふるまいと対応方法について簡単に説明する。

ver 0.30.0 から、ネストしたasyncのキャンセルが親のcoroutineにも伝播するようになった。たとえばlaunchで直接呼び出したasyncの例外が親のlaunchに伝播する。

解決方法を4つ紹介。1.withContext でコンテキスト切り替える。2.Globalscope.async でスコープを変える。3.CoroutineExceptionHandlerを渡して集約する。4.SuperVisionを導入する。キャンセルの伝播の方向を制御できる。supervisorScope {} というので囲めば、asyncを使っていても、asyncの例外が親のlaunchに伝播しないようになる。

以下の記事を参考にしました。

qiita.com

sys1yagi.hatenablog.com

[iOS] 生きた仕様書としてのUIカタログアプリ運用 構想編 / hiragram さん

speakerdeck.com

==前置き==

仕様書は死ぬ。

仕様書死なないでほしい。

なぜ死ぬのか?

ちまちま仕様書を更新しても死にゃせんから。

では短期的なメリットがあればいいのでは?

==前置き終わり==

仕様書に求めるもの

  • 画面にある全ての機能が網羅的に残されている
  • 画面にある全ての状態変数が網羅的に残されている
  • それぞれの状態のときにそれぞれの機能がどう振る舞うかが網羅されている

そして

  • 常に最新である

で、構想なのだが、UIカタログ的なアプリをシュッと作れる環境を用意したらいいんじゃない?と思っている。

各画面は表示に使うための情報を外から注入されるインターフェースをもつ。たとえばObservableとか差し込む。

何が嬉しいのか?

UIカタログを見てデザインチェックができるとか。開発的にも便利。疎結合になるのでAPIクライアントとかと別にビルドできる。とか。

[Android] KTSで社内マルチモジュールライブラリを配信する / Kubode さん

speakerdeck.com

なんで社内ライブラリの配信するのか?社内のデザインシステムのため。AARライブラリ化してmavenで配信したい。

デザインシステムっていうのはデザインの原則やコンポーネント群。これがあるので共通化できて楽。

Atomic Designはデザインシステムの設計手法の一つ。これをモジュールに落とし込んでみる。

mavenリポジトリをどうするか。GradleはS3のURIをサポートしている。認証ありもサポートしていて、S3にした。あとbitriseにアップロードするworkflowを書いた。

Androidはそのままではアップロードできない。できないというか pom.xmlの設定をめちゃくちゃ大量に書かないといけない。android-maven-gradle-pluginを使えば楽。

groupとartifactIdとversion を指定する。がアップロードしようとしたらだめだった。android-maven-gradle-pluginを使っていると古い方のがデフォで参照されて、新しいmaven-publishを使わないとS3の配信がサポートされないらしい。

maven-publishを使う版は無いのか?と思って探したらあった。android-maven-publish を使ったら良い。これで ./gradlew publish できた。

なにげに例に KTS が出てたけど KTS は問題なく使えるよ

[iOS] Appleの標準アプリで使われている半モーダルビューについて / idonuntius さん

半モーダルビューの定義だが、iOS8 の Apple Music で使い始められて、今ではメールやマップなど色々なところで使われているやつ。

半モーダルビューは「現在のタスクやワークフローをコンテキスト内で自己完結する機能を提供する」ものらしい。

モーダルビューは、タスクに戻るためにはサブタスクを終了しなければならない。

半モーダルビューに関してはキャンセルとかない。 WWDC で紹介されていた Redirect UI っちゅうやつだと思う。タスクとサブタスクを並列に実行できる。

iOS の標準アプリで半モーダルビューが増えているので、これから増えていくとおもう。

[Android] RecyclerViewとGridLayoutについて学んだ話 / nagais さん

1カラムのViewと2カラムのViewが混ざっている画面を作った。

GridLayoutManager をセットした RecyclerView を使用して、モデルごとにViewTypeを設定、 GridLayoutManager が SpanSizeLookup というのを持っているので、モデルの持っているViewTypeごとに変えれば良いことがわかった。

[iOS] 久々のiOSリリースあるある / 5mingame2 さん

久々のiOSリリースで色々ハマった。

GameCenterでエラー。ios10でgemecenterにログインしているはずなのにスコア送信とかできない‥ボードとかも真っ白これはGameCenterからサインアウトして再サインアウトしたらなおった。利用規約の変更でアカウントで止まっていたっぽい

審査出す時のValidationでエラー。Launch Screnn File のファイル名から.xibを削除したら通った。

審査でリジェクト。ゲーム中にスナップショット取ってストレージに保存することができるのだが、ユーザーに使用用途を明確に伝える必要がある。Info.plistのNSPhotoLibraryAddUsageDescription/NSPhotoLibraryUsageDescriptionに設定すればOK。

ソースコード公開したよ:

github.com

[Android] Android開発でmitmproxyを使った話 / bigbackboom さん

speakerdeck.com

responseの値を書き換えて本番環境でアプリの強制アップデートのテストがしたい。Charlesがなんかうまくいかないのでmitmproxyでやってみた。

https が拾えてなかったけど、 app/src/main/res/xml/network_security_config.xml を作って信頼する証明書を設定、AndroidManifest.xml で networkSecurityConfig を設定すればOK。

実は以下でハマってただけでCharlesでもできた。

qiita.com

[iOS] 読んで良かった本をiOSエンジニアに紹介する / よっしーさん

いろいろ紹介。

感想とか

f:id:kumamotone:20181218211256j:plain

最近 Kotlin Coroutines を書いていて、ちょいちょいどうすればいいのか迷ってることとかあって懇親会で聞けてよかった。

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

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

会場は スマートニュース さんでした。

f:id:kumamotone:20181218154453j:plain
地球くん

地球くんかわいいですね。

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

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

Best Bugs 2017 in SmartNews iOS / aramaki さん

www.slideshare.net

スマートニュースであった2017年の面白いバグ(単純なバグではなく、ちゃんと書いているのに予想外の動きをするもの)を3つピックアップ。各々ワークアラウンドで解決して対処。

Android 8.0のPush受信時のサービス起動について / hideoさん

speakerdeck.com

Pushを受けた後に処理をServiceに委譲し、別途我道を取得してNotificationを出していた すると、Android8.0でstartService()したときにIllegalStateExceptionになってた どうやらpush受けてからstartServiceまでに時間がかかりすぎると起こったりするらしい

おそらくアプリではどうしようもないところで時間を食ってしまっているので、startServiceに失敗したらとりあえずService使わないことにした(画像が表示されなくなることにはなったが、画像が表示されなくてもリアルタイムで通知することを優先した)

Redirectable in App? / ushisantoasobu さん

speakerdeck.com

Redirectable =思考の方向転換や割り込みに対応(ジェスチャーしているときのジェスチャーに対応する)。

iPhone X が出て1年、徐々にRedirectable なUIが浸透してきたのではという持論。

How to contribute GPUImage-android / kettsun0123 さん

speakerdeck.com

iOS の GPUImage framework を 参考にしたライブラリがある。

github.com

contributeするにはどうしたら良いか?一番簡単なのはフィルタを追加すること。本家に比べてまだまだFilterがたりない。

リストからまだ作ってないフィルタを選んで、作って、sampleを作って試して、PRを出せばOK。

静的な定義で動きのあるレイアウトを作る(AutoLayoutライブコーディング) / kishikawa katsumi さん

speakerdeck.com

blog.kishikawakatsumi.com

のライブコーディング。

  • 親の親のViewとの制約つけるときは Align 使うとやりやすい
  • 優先度の異なる複数の制約を同時に定義することで、静的な定義だけで切り替え(動的な振る舞い)を実現できる

5分でわかるKotlinコルーチン / shogo.yamada さん

speakerdeck.com

  • Coroutineは関数の途中で中断させたり、再開させたりするやつ。Retrofit と組み合わせて使えるよ
  • 単純に RxJava の代替とはいえない

UIGestureRecognizer と UIResponder の違い / やまださん

speakerdeck.com

以下のようなことをしたい。

  • タップ位置に点を描画
  • ドラッグで描画したものを移動
  • ダブルタップで拡大縮小

  • UIGestureRecognizerで良いんでは?と」思ったけど遅い 時間もはかってみたが、 ワンテンポ遅れて描画される

  • タップした瞬間に描画したい場合は UIResponder を使ったほうが良いかも

OSS開発のリテラシー / Android編 / gfx さん

gfx.hatenablog.com

Orma を例に、OSS を開発するときに満たさなければならない/満たしててほしいこと

MUST↓

  • ライセンスを明記
  • READMEを置く
    • Ormaを参考に
  • リリースしたら git tag を打って push する
    • 手でやると忘れるので自動化できると良い
  • CIを設定してバッヂをREADMEに置く
    • テストがなくてもCIの設定はすべき
  • アーティファクトのgroupIDはライブラリ固有のものにする
    • artifactIdにも ライブラリ名を含めるほうが良い
  • bintray に成果物を公開するときはライブラリごとにorgをつくる

Fluid Interfaceの実践 / SCENEE さん

speakerdeck.com

Map とかにある下からにゅっと出るやつのライブラリを作った(ありがたや)

github.com

ScrollView はプリミティブな Fluid Interface。予測可能な動きを実現する処理のひとつとしてprojectionがある。物理法則をコードに落とし込んで実装。

Appstoreconnect api with Open API Spec / d_date さん

speakerdeck.com

AppStore Connect API 出た

github.com

Open API Spec。Swagger Codegen 作ってた人たちが fork して作ってる。今のバージョンは3。

バージョン3の oneOf なのだが、Swiftのコード生成に関してはAnyに変換されてしまいCodableに適合できていない状態 みんなで作りましょう

もっと! Alternative Resources / takasfz さん

speakerdeck.com

良い年月日入力フォームを作るみたいな記事があって、英語圏の PC Web の話だが、以下とかを満たすのが良い入力フォームだと言われてた。

  • 月/日/年にわかれてる
  • 適切なラベルが付いている
  • テキストフィールドのサイズが入力するもののサイズと合ってる

日本語圏なら 年/月/日にしたい…こういうリソースの出し分けってどうする?Alternative Resourcesつかえばできるよ。

作り方。リソース追加ダイアログでぽちぽちする。

言語や国、キャリア、画面サイズ、APIラベルによって、画像、レイアウト、文字列、とかとか出し分けれるよ!便利

Dribbbleで見つけたコンセプトデザインの実装 / edm さん

dribbble.com

を実装した。

  1. スクロールと合わせて数値を表示
  2. 背景色のグラデーションを追加

とかあるが、2について話す。

touchesMoved でスクロールに応じての水温の計算したりする。

github.com

おそらく解説↓

qiita.com

Dynamic Links 知られざる?Firebaseの秘技 / なかてぃる さん

speakerdeck.com

Dynamic Links は Firebaseが提供しているアプリに対するすごいリダイレクトリンク。AndroidiOS、PCに応じてリダイレクトしてくれる。

アプリのインストール有無を判定できる上、ストアからのインストールを挟んでもディープリンク発火できる。使い方。パラメータをクエリでつめてく。d=1 でデバッグ

アプリ側もふつうに対応する必要はあり、iOS→ユニバーサルリンク、Android→Intent Filter でスキーム起動できるようにしておくようにはする必要ある。

RxSwiftのエラー分岐Tips / y.imajo さん

speakerdeck.com

異常処理系のパターンはいろいろあるが、 materialize() を使うとひとつのObservable から正常系とエラー系のObservableに分けられる。

-AndroidiOSどっちが早く作れるか-今夜くらべてみました / kboy さん

note.mu

  • ぽちぽちやってたら Firebase につながるので IDEでFirebase使うのはAndroidのほうがはやい
  • ドロワー デフォルトであるので Androidのほうがはやい
  • Firebase の JSONパース toObject メソッドがあってAndroidだと楽

Koin x AndroidでMVIアーキテクチャを採用する / itome さん

speakerdeck.com

github.com

MVIはModel-View-Intent(android.content.Intentではないよ)。RxJava / Kotlin での実装例を紹介。

良いと思ったとこ。

プログラマーに対する制約が強く、テスタブル、エラーハンドリングが容易(Rx使ってるので)で良い。

良くないかもと思ったとこ。

1回きりのイベントを伝えるのが難しい、複雑なレイアウトではViewStateの更新の処理が重くなる、冗長になりやすい。

感想とか

余裕がなく記事まとめ雑になり申し訳ない気持ちがありますが、なんだかんだ行くと懇親会とかで刺激を受けてやっぱポテチええな〜となりますね