見出し画像

【Swift5】既存リリース済アプリにテーマカラー変更というアプリ全体に影響する変更を行った話

Qiitaにあるエピソードみたいな大それた話ではないですが、実際に運用開発を行っていく上でこういうこともやっていくよ、というのを書きたくて書きました。

みなさん、個人開発で新規開発とかは行っていると思いますが、運用開発は経験なかったりするので。

アプリの変更内容

表題の通り、もともとテーマカラー機能を実装していないアプリにテーマカラー変更を適用しました。デザインの変更範囲は全画面に及びます。

iPhone_12_と_ポケカデッキ管理_と_PokecaDecukRecipe_xcodeproj

実際に開発を進めていった手順なども紹介します。

はじめに考えること

既存ユーザーがアップデート後に起動した場合にも不具合が起きないようにすること、これが大前提です。でなければver移行が一切出来ませんので最重要の気にするポイントです。

次に考えることですが、アプリを開くと前回起動時に選択したテーマカラーが適用されているのが正しい仕様だと思われます。

なので、UserDefaultsでアプリ使用後もデータを保持する必要があります。

実際に実装したこと

・UserDefaultsで保存されたカラーを読み込む。
・読み込んだ値をシングルトンクラスに格納する。
・画面を描画する際にシングルトンクラスのカラーを参照する。
・テーマ変更が行われたらUserDefaultsでカラーを保存する。

UserDefaultsで保存されたカラーを読み込む。

アプリ起動時に読み込みたいので、AppDelegate.swiftにてUserDefaults(key:ThemeColor)を読み込みます。

アプリを一番最初に起動した時、もしくはアップデート後に最初に起動した際はデータがないので、その場合はデフォルトカラーにあたるレッドカラーを後述のシングルトンクラスにセットします。(後述)

読み込んだ値をシングルトンクラスに格納する。

先程読み込んだ値をシングルトンクラスのUIColorの変数を宣言してください。そこに読み込んだ値を格納します。

先程のように読み取れない場合は、読み取れた場合と同じように値をセットしても良いのですが、実際はシングルトンクラスのUIColor変数の初期値でデフォルトカラーを指定して、(読み込み時エラー時)上書きしないという処理でも同じ挙動ができます。

上記はどちらでもいいのですが、コードの可読性や理解のしやすさを考えると第三者がみてもわかるのは、読み込み時エラーでも上書きする方が好ましい気がします。

画面を描画する際にシングルトンクラスのカラーを参照する。

各画面にてシングルトンクラスを参照して常に最新の値を取得して描画する必要があります。

たいていの画面はviewDidLoad(:)とかでも問題ないと思います。

しかしながら、テーマカラーを変更する機能を実装している画面はchangeColor()みたいなメソッドを用意しておいて、「viewDidLoad(:)時」「テーマカラー変更時」に呼び出してあげるみたいなのがスマートだと思います。

テーマ変更が行われたらUserDefaultsでカラーを保存する。

テーマカラーを変更される都度、UserDefaultsにカラーを保存してあげればOKです。特に難しいことはないです。

まとめ

実際は行うべき機能や実装の手順など整理すれば難しいことはないです。
ぜひ臆せず頑張ってみましょう。

以前の記事も運用としての開発としてなかなか難易度高い内容だったので記事紹介しておきます。


いいなと思ったら応援しよう!