こんにちは、モバイルクライアントグループの隅山です。 普段はAndroid開発を担当しています。最近ではiOS開発にも参加し始めたため、両OS開発についての難しさやメリットについて紹介します。
背景
自分のエンジニア目標としてAndroidとiOSの両方を開発できるスキルを身につけることがあり、スタディプラスのiOSアプリを開発する機会をいただきました。 iOS開発自体は初の試みというわけではなく、元々Objective-Cで簡単なiOSアプリ開発はやったことがありました。 しかし、簡単なアプリ開発と実際のプロダクトにおけるアプリ開発とでは大きな壁があり、そこでのつまづきと学びをここでは紹介します。
iOS開発
開発方針
iOS開発を進め方としていきなり新機能開発を行うとわからないことが多すぎるので、初めにAPIまわりの開発を数件行い、慣れてきた後Viewまわりの開発を行う方針にしました。
まずAPIまわりの開発は3件行い、Swiftコードの書き方など基本的な部分を学ぶことができました。 コードの書き方は調べればわかることが多いので特につまづくことはありませんでした。 APIまわりの開発をスムーズに終わらせることができたので、Viewまわりの開発に手を出そうとしたのですが、そこで多くのつまづきがありました。
内容
Viewまわりの開発として、ログイン画面を作り直す実装を行いました。
元のボタンなどは使い回すことができ、テキストを新たに追加するだけなので問題ないと思っていました。 ただ、対応前のログイン画面が数年前のコードからあまり改善されていなかったので下記の対応も追加で行いました。
- UIViewControllerからUITableViewControllerに変更
- Xibファイルを使ったレイアウトからコードレイアウトに変更
今回の対応で大きくコードが変わるため、既存画面をリファクタリングするのではなく、新しく画面を作り直して差し替える対応を行いました。 既存のリファクタリングであれば修正該当部分だけ直せばいいのですが、新しく作ったためiOSのViewの作り方を学ぶきっかけにもなりました。
つまづき:ヘッダー・フッターの存在
UITableViewControllerでViewを作る際に、UITableViewのヘッダー・フッターの概念につまづきました。 AndroidではRecyclerViewを工夫して実装する必要があるため、標準で存在するiOSの実装に戸惑いました。 しかし、他のiOSアプリのリストにヘッダーで分類名を追加する場合やフッターで注意書きを追加する場合を見て、ヘッダーやフッターの用途を理解することができました。 どこまでをヘッダーとするかやどこまでをフッターにするかなどはこれからも開発する中で学ぶ必要はありそうです。
今回の画面の場合だとメールアドレスと外部アカウントで二層に分かれているため、2セクションのヘッダーやフッターに文字列を追加する形で実装しました。
つまづき:レイアウトの確認方法
Xibファイルからコードレイアウトでの画面パーツの生成へ変更する対応ではかなりの時間がかかりました。 AndroidではxmlファイルでViewやレイアウトをプレビュー画面で見ながら開発できますが、iOSではコードベースでViewを開発する場合、サイズや位置などを調整する度に毎回ビルドしてシミュレータで確認する必要がありました。 Viewについての知識がなかったので実際に微調整しながら開発していたため、学びながら開発するにはこの方法は向いていなかったようです。
また、Viewまわりで実装漏れが発生するとアプリが落ちるなどViewまわりのエラーはややわかりにくい印象でした。
開発を終えてみての感想
普段Android開発している人がiOS開発する際に身につけるべき知識も多いのは開発前から自明ではあったのですが、それにしてもOSによって結構違う点があるなと感じました。
iOS開発の最初の方は自分でできるだけ行うことを心掛けており、コードを触りながらわからないことは調べることを行っていました。 しかし、終わって振り返ってみると同じグループのiOSエンジニアとのペアプロが一番勉強になりました。 自分一人で開発すると堂々巡りで時間が取られたのですが、ペアプロではその場で気づいたことや疑問点をぶつけることができるので時間もかからず、非常に勉強になりました。
これから違うOSの開発を行う方にはペアプロを強くお勧めします。
両OS開発について
難しさ
両OS開発して感じた難しさを2点あります。
1点目は開発ツールの機能性です。 AndroidはAndroid StudioでiOSはXcodeで開発することが多く、各開発ツールによってできることとできないことを理解することが難しかったです。 例を出すと、自分はAndroid Studioを普段から使っているためメソッドやクラスの呼び出し元に移動するのにCommand+クリックで処理を追うことができましたが、Xcodeではそのような機能がありませんでした。
2点目はOSごとの違いの考慮です。 例を出すと、Androidではマテリアルデザインに従ってレイアウトのマージンを決めますが、iOSではlayoutMarginsGuideなどを用いて読みやすい幅を設定するなどOSごとに推奨のやり方がありました。 また、iOS開発でファイル追加や削除の場合にファイル管理しているproject.pbxprojが変更されるのですが、他の方とコンフリクトが起きた場合の解消方法はかなり難しく感じました。
メリット
上記では難しさを書きましたが、両OS開発によるメリットも多くあります。
- OSによって仕様の認識ズレがない
- チームとして開発リソースを削減できる
- 仕様検討段階で両OSのことを考えられるようになる
まずは二人の開発者でそれぞれ開発するといくらコミュニケーションを取れていようと仕様の認識ズレが生じることはあります。 しかし、一人で開発することによって仕様がOSごとにずれることを防げます。
次に開発リソースを削減することができます。 単純計算すると半分のリソースで新機能開発することができるのでチームとしてはアウトプットを増やせます。
また、各OSの書ける人が増えるということはレビューできる人数も増えるということなので相談できる人が増え、レビューによる指摘も増えるので不具合をより抑えることができます。
まとめ
両OS開発を実現するためには勉強することも多いですしつまづくことも多いと思いますが、メリットも大きいと感じているためこれからもAndroid開発だけでなくiOS開発を続けていきたいと思います。
まず直近やることとしてはプレビューがなく開発時間が取られてしまったためXcode Previewsを導入していきたいと思っております。