Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

iOS 13/iPad OS 13に向けて対応した事 #ios13 #xcode11

f:id:fromkk:20190829183951p:plain

iOSDCの登壇が終わってホッとしているかっくんです。
先日リリースされたFamm 4.0.0 にてiOS 13/iPad OS 13向けの対応を行いました。
この記事ではどの様にして対応を進めたのかを共有します。

社内調整

WWDC 2019が終わり帰国してすぐに社内向けの調整を行いました。
ざっくりいうと「8月いっぱいはiOS 13/iPad OS 13向けの対応を行いたいのでiOSチームはよほど緊急対応が無い限りは他の案件はストップしたい」という事を伝え了承してもらいました。
恐らく、何よりもこの部分が難しい会社も多いだろうことは想像に容易いですが、快諾してくれたPO及び社内のメンバーには感謝しています。

新機能

Dark Mode

f:id:fromkk:20190827180940p:plain:h480

iOSDCなどの登壇を見て頂いた方もいるかもしれませんが、WWDC 2019前12で僕はとてもDark Modeを推進していました。
さすがにこの状態でDark Modeに対応しないのは僕的には無しなので何としても対応したかった物の一つでした。
こちらは社内調整が必要だったのですが、ざっくり言うと「対応必須ではないが他社のアプリが対応していく中でうちだけ対応しないのはダサくないですか?」という様な事を伝えると対応出来る事となりました😎
ProductチームやiOSチーム、デザイナーチームと調整が必要で、色の決めや画像の対応など最初から最後まで微調整が続きとても大変でした。
また、今後新たにページを作る際にもDark Modeを意識する必要が出てくるなど、コストとしても大きいかもしれないですがとても良いチャレンジになったと思います。

iPad Any Size

f:id:fromkk:20190827181052j:plain:w480

以前書いた様にFammのiOS版はiPhoneだけでなくiPadにも対応しています。
しかし、以前の対応の時は縦固定のみの対応でした。
社内からも横画面対応の要望はとても多く、どこかで対応したかったのですが今回丸一ヶ月時間があるという事で、思い切ってフルスクリーン必須の解除ランドスケープモードの対応を行いました。
基本的にはAutoLayoutで組まれているので大抵の画面は問題無いのですが、UICollectionViewを使っている場合、古くからある画面でframeでレイアウトが組まれている場合はレイアウトの修正対応が必要でした。
また、稀に縦画面に最適化されている画面もあり、画面を横にするとボタンが下の方に隠れてしまうなど期待と異なる挙動をするページもあり、そういうページにはスクロールビューを入れるなどしてユーザーが詰む事が無いように調整を行いました。

先述したDark ModeとiPad Any Size対応については、何度かQAをしてもらいながら徐々にクオリティを上げていく事で、抜け漏れがなるべく無い様に対応を進める事が出来ました。
※ちなみにMulti Window、Catalystは未対応です。

Drag and Drop

f:id:fromkk:20190827181959g:plain:w480

先述したiPadのAny Size対応を行うと他アプリとのSprit Viewでの表示が出来てしまうんですよね。
これまではずっとフルスクリーンだったのであまり気にならなかったですが、他のアプリと並べて表示が出来ると途端にDrag and Dropしたくなったので対応しました。
とりあえず画像をFamm(iPadのみ)のアルバム画面(ログイン後トップ画面)にドラッグ&ドロップするとアップロード出来る様になっています。
こちら、通常のアップロードとは異なるフローなので、写真の日付を保持出来ないという問題があり、古い写真をアップロードしても最新の日付でアップロードされてしまいます。
もしご利用の際にはご注意ください。

SceneDelegate

対応必須ではないのですが、今後必須化される恐れもあるので今のうちに対応を進めておきました。
方針としては以前発表した資料にもあるAppEventHandlerの様なクラスを作成して、iOS 13以上ではSceneDelegateから、それ以外ではAppDelegateから共通メソッドを呼び出す様にしています。

こちら対応した副作用として UIWindow(frame:) が無効になってしまうので、カスタムでオーバーレイしたいビューなどが表示されなくなってしまうという不具合を生んでしまいました。
暫定対応としてアプリ上にはMulti Windowではなく1つのウィンドウしか存在しない前提としてUIWindowSceneを保持しておき、新たにUIWindowを作る際には保持しておいたUIWindowSceneを参照する様にしています。
今後Multi Window対応する日が来るかは分からないですが、その時までにより良い方法で対応出来ると良いなと思います。

UIContextMenu

f:id:fromkk:20190827182655j:plain:w480

iPhone XRでは3D Touchが無くなったりと、最近のAppleはどんどん3D Touchの優先度を下げている様に感じていました。
そんな中WWDC 2019では新たにUIContextMenuが発表されました。
これはCatalystiPadアプリなど広い画面の中で細かい事が出来る様に隠されたメニュー(いわゆる右クリック)を表示する際に利用するものと思います。
Fammの中ではアルバム画面からフルスクリーン画面に遷移する間に3D Touchを利用してプレビューにいく前でもいくつかのアクションが出来る様になっていました。
この部分をiOS 13ではUIContextMenuに差し替えを行いました。

おまけ

その1(SwiftUI/Combine)

既存のアプリをiOS 13/iPad OS 13向けの対応をするとなると出来る事は限られてきます。
特に今年はSwiftUICombineの注目が大きかったのですが、それらを実際にプロダクトに投入するとなるとiOS 12以下を切ったタイミングでしか入れる事が出来ないので、会社によりますが2〜3年待つ必要が出てきます。
そんな中僕はFammの中にSwiftUIとCombineを入れる事に成功しました🎉

こちらどういうカラクリかと言うとタネを知ってしまうと単純な話なのですが、社内の人しか利用出来ないデバッグメニューが開発版アプリにはあるのですが、その一画面をSwiftUI/Combineを利用して書いたというだけです。
とはいえ、実際のアプリに入れるまでの2〜3年何もしないで待つだけなのは辛いので、既存アプリに投入出来る機会を自ら作っていく必要があるのかなと思います。
新たな技術を学習しながら社内向けに便利な物が作れるので、今後も小さい物から作っていけたらと思います。

その2(Test Plan)

こちらも直接ユーザーには影響は無いですがXcode 11から追加されたTest Planも追加しました。
まずはユニットテストで複数環境(言語/国の組み合わせ)でテストが実行出来る様にしてみました。

ローカライズの箇所で1件バグを見つけたので入れてテストを回してみて良かったです。
複雑な環境って用意するのが面倒なので設定ファイルを用意すれば常に自動でテストが回ってくれるのはとても良いですね。

まとめ

という事で2019年8月はひたすらiOS 13/iPadOS 13向けの対応を進める一ヶ月でした。
まだまだやりたい事としてはSignin With AppleやMulti Window, Catalystなどなどあるのですが、一旦ここまで対応しておけば最低限のiOS 13/iPadOS 13対応は出来たと言って良いかなと思います。
今後のFammの進化にも要注目ですね!

Fammのダウンロードはこちらから

積極採用中!!

子育て家族アプリFammを運営するTimers inc.では、現在エンジニアを積極採用中!
急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください!
採用HP: http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる