RareJob Tech Blog

レアジョブのエンジニア・デザイナーによる技術ブログです

毎年恒例の iOS メジャーアップデートで iOS 14 対応した話しを振り返ります

APP/UX チームの玉置(@tamappe)です。
今回は今年に入って iOS 版レアジョブ アプリの iOS 14 対応が完了しましたので、どんな風に変更したのかについてまとめてみました。 簡単に言えば、みんな大嫌いな iOS アプリのメジャーアップデート対応が完了した話です。

毎年恒例の iOS メジャーアップデート対応

iOS アプリエンジニアは毎年この iOS のメジャーアップデートに苦しめられています。 毎年というので去年の今頃もメジャーアップデートをしていました。 当時は墓穴を掘ってしまい、ブログ記事すら書けないぐらいにメンタルをやられました。 またレアジョブに入社して最初に行ったタスクも Swift 3 系からのアップデート作業でした。エモいですね。

rarejob-tech-dept.hatenablog.com

今までSwiftのバージョンアップデートで破壊的な変更が入るたびに iOS アプリエンジニアは悲鳴を上げてきました。 なぜかというと Swift のバージョンを上げるとだいたいビルドが通らないからです。 さらに使用しているライブラリが対応できていなかったなどの要因で、端末の OS によっては UI が変わるといった謎現象も多くエンジニアはその対応に終われます。 今回もご多分に漏れず苦しめられるかとヒヤヒヤしていましたが、なんとわずか1週間で完了できてしまいました。

主な変更点

主な変更点はこちらになります。

差分内容 変更前 変更後
Swift version Swift 5 Swift 5.3
iOS のサポートバージョン iOS 11 ~ 13 iOS 12 ~ 14
Xcode Xcode 11.5 Xcode 12.3
CocoaPods 1.6.0 1.10.0

(まだSwiftPM対応はできていません。 CocoaPods を使っているのか遅れてるなぁと思う方は、是非とも弊社に入社してレアジョブアプリに SwiftPM を導入していただけると助かります。)

それでは、実際に対応した作業と苦しめられたことについてお話していきます。

移転先の Xcode のダウンロードバージョンを確定させる

iOS のメジャーアップデートをする時にいつも腰が重くなりがちなのが、アップデートする Xcode のバージョンを何にするかということです。

メジャーアップデートするたびに頭を悩ませるのはアップデート後の Xcode のバージョンです。 僕はいつも Appleアーカイブから「 Safari 上で」 Xcode をダウンロードしますが、このタスクの度に検証のためにダウンロードする Xcode のアプリケーションの数が増えてしまい Mac PC のストレージにダメージを蓄積していきます。

https://developer.apple.com/download/more/

複数の XcodeMac のローカルに保存して共存させるには Xcode アプリのリネームが必要になりますね。 なので、「Xcode_xxx.app」のアプリケーションがダウンロードするバージョン数だけ増えることになります。「xxx」はバージョンの数字を入れています。

そして、 Google Chrome から上記のアーカイブページでダウンロードするといつも解凍に失敗します。 そのため、いつも Safari からダウンロードしています。

Xcodeは10GB近くあるめちゃでかアプリケーションなので、2つほどダウンロードが完了する頃には半日が終わっていることになります。 今回はこの当時の最新版の Xcode 12.3 と 12.1 に狙いを定めてダウンロードしてみました。

結果的には Xcode 12.3 で大きなエラーが起きずにビルドが成功しましたので Xcode 12.3 で確定しました。 あまり頻繁に Xcode のバージョン上げをすることは宜しくないと思っておりますので、できるだけ最新にして長持ちできる方針を貫いています。

iOS Deployment Target の minimumを iOS 12 以降に変更する(iOS 11 サポートを切る)

無事 Xcode のダウンロードが完了したら、だいたい次に行うのが iOS のサポートバージョンを変更する作業です。 業界の定石は特にありませんが、サポートする iOS のメジャーバージョンは (最新メジャーバージョン - 2)で計算しています。 iOS 14 が最新版なら iOS 12 ~ 14 という感じです。 もっと比較的余裕のあるアプリでしたら (最新メジャーバージョン - 1)でいいかもしれません。 iOS 11 は今ではユーザーが2%ほどです。 サポートバージョンを狭くすればするほど、当然ですが運用が楽になります。古いAPIを切ることができるためです。

レアジョブアプリは iOS 14 対応をリリースしてからは iOS 11 のサポートを切ることができました。

このバージョンを変更する方法はとても簡単で XcodeDeployment Target の項目を変更すれば可能です。

f:id:qed805:20210201154908p:plain
iOS suport version

これで iOS 12 以上からになります。

Swift 5.0 から 5.3 へアップデート

次に頑張りたかったことが、 Swift バージョンの変更でした。 Xcode 11.5の時は Swift 5.0 でしたが Xcode12.3 では Swift 5.3 が使えますのでこちらに変更しました。 また、レアジョブアプリはライブラリ管理ツールに CocoaPods を使っています。その関係で、 Pods の Swift バージョンも Swift 5.3 に変更する必要がありました。

そのため、 Podfile ファイルで次のように変更しました。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = "5.3"
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
    end
  end
end

これでターミナルから pod update でライブラリの Swift のバージョンが変わります。

CocoaPods のアップデート (1.6.0 から 1.10.0)

ですが、ここではそう上手いこといきませんでした。 使用しているライブラリによっては Pods のバージョンが足りないと言われてしまいました。

そのため、 CocoaPods のバージョンを上げる必要がありました。 レアジョブアプリは Pods のバージョン管理は Gem で行っていましたので、 Gemfile を修正してから

bundle install --path vendor/bundle

を実行して Pods のバージョンをあげました。 これで再度、 Pods の更新を行うと無事ライブラリのバージョンアップが完了しました。

一部 UI のレイアウト崩れの改修

これでビルドが成功してめでたしめでたしであれば非常に楽なのですが、 iOS のメジャーアップデートの作業の本番は大抵ここからスタートになります。 できるだけ UI のレイアウトが崩れていないことを願いながらシミュレーターなり実機で画面を確認していきますが、中には画面が開こうとするとアプリがクラッシュしたり UI がガッツリ崩れていたりします。

ここで予め用意しておいたテスト前に実施するテスト項目書を使ってマニュアルで全ての画面を表示させながらアプリを操作して挙動を確認しました。 今回は一画面だけ UI が崩れていましたのでその部分が治るように修正しました。

まさかの iOS 13 端末では UI が崩れず iOS 14 でのみ崩れる不具合で、改修後も複数のシミュレーターを起動してみたりと確認作業にかなり時間を取られました。

総括

そんな感じでレアジョブアプリは無事に iOS 14 対応が完了しました。 レッスンルームも綺麗になりましたし、前回の投稿からユーザーが劇的に増えましたので是非レアジョブアプリを使っていただければと思います。