知ったらアプリ開発も楽になる! iOSDC Japan 2019で得たiOS開発の課題と向き合い方

f:id:vasilyjp:20190913091534j:plain

こんにちは!
ZOZOTOWNやWEARのiOSアプリ開発をしている元と小野寺です。
先日、9/5から9/7まで3日間iOSDC Japan 2019が開催されました。今回ZOZOテクノロジーズでは12名のメンバーで参加し、弊社はスポンサーとして協賛しました。
この記事ではiOSDC Japan 2019にて発表されたセッションの一部を紹介すると共に、現場の盛り上がりの様子もお伝えします。

セッション

ライブラリのインポートとリンクの仕組み完全解説

最初に紹介するセッションは弊社の技術顧問をされている岸川さんのセッションです。

f:id:vasilyjp:20190918195305j:plain
iOSDC Japan

内容はライブラリを使うときに遭遇するimportエラーやlinkエラーに対してシステマチックに解決するために必要な知識についてです。 ライブラリやフレームワークのimportエラーやlinkエラーを解決するとき、このセッションの内容は非常に役に立ちます。
応用編ではこのセッションで紹介された知識を活用できる方法がいくつか紹介されました。 その中でアプリの起動時間短縮に有効な方法があり、効果があるならZOZOTOWNアプリにも導入しようと思ったので実際検証してみました。着目したのはスライドの以下の部分です。

ダイナミックフレームワークが増えてくると起動時間に影響を与える(dyld2の場合) そのため各フレームワークをスタティックリンクにして1つの大きなダイナミックフレームワークにする

この方法はWWDC 2016のセッション「Optimizing App Startup Time」にてアップルが紹介した方法でもあります。

具体的にはダイナミックフレームワークはアプリ起動時にコストの高いリンク処理が発生するので各フレームワークをスタティックフレームワークとしてビルドし、その全てを1つのダイナミックフレームワークにまとめることでリンク処理のコストを抑える方法です。 dyld2に関しては現状サードパーティのフレームワークで使われてるので効果ありだと思いました。 実際に1つのダイナミックフレームワークにまとめてから今回のセッションで学んだ具体的な設定方法を使い、サンプルアプリで検証した結果を共有します。

■ 検証内容
「複数のダイナミックフレームワークをそれぞれスタティックリンクにしてから1つのダイナミックフレームワークにまとめる」ことで起動時間が短くなるかを確認
■ 検証対象アプリ
テンプレのプロジェクトを生成してからフレームワークを11個追加したアプリ(フレームワークの選定基準はありません)
■ importしたフレームワーク
AFNetworking, Alamofire, CocoaLumberjack, CocoaLumberjackSwift, RxBlocking, RxCocoa, RxRelay, RxSwift, SDWebImage, SDWebImageMapKit, SnapKit
■ 端末
iPhone 6s、iOS 12.3.1
■ 結果
f:id:vasilyjp:20190912120842j:plain 赤い枠の中にある「Total pre-main time」が総計時間、「dylib loading time」がダイナミックフレームワークのロード時間です。両方とも短縮されているのでちゃんと起動時間が短縮されたのを確認できました。もし運用しているアプリの起動時間が長いのであれば試してみるといいかもしれません。

個人開発のアプリが輝くために
- アプリのDL数をあげる必殺技 -

弊社ZOZOテクノロジーズからLightning Talkで名取が登壇しました。

f:id:vasilyjp:20190918200258j:plain
iOSDC Japan

発表内容は、自身が作成した個人開発のアプリ「大人のなぞなぞ〜脳トレIQ謎解きアプリ〜」を約100万ダウンロードまで成長させた戦略についての解説です。
これからアプリを実際に公開してみようと考えている方、既に公開している方どちら側であっても参考になる発表内容でした。

個人で開発したアプリでは、プロモーションにお金をかけることは、難しいですよね。
そんな個人開発のアプリを約100万ダウンロードされるまでに成長させた際に行った戦略の紹介です。発表の中で、ASO対策としてキーワード検索で上位に表示させる為の工夫が紹介されました。
ASO対策としては、次のようなポイントに気をつけると良いようです。

  • タイトルには、何のアプリなのかを表す為のキーワードを取り入れること
  • サブタイトルには、どんなアプリなのかを伝えるワードを取り入れること
  • キーワードには、ひらがなやカタカナ、漢字などを含める

セッション内では、カメラアプリを例にしてわかり易く説明されていました。
他にもアプリの評価を上げるために、高評価をしてくれそうなユーザーにレビューを依頼する取り組みについて紹介がありました。
高評価が期待できるユーザーの例として、次のような具体例が紹介されました。

  • アプリを10回以上訪問してくれたユーザー
  • あるコンバージョンを達成したユーザー
  • 一定期間、毎日アプリを起動したユーザー

実際に100万近くダウンロードされたアプリでの取り組みということもあり、とても説得力がありました。
今後アプリを公開する際により多くのユーザーに使ってもらう為には、どんな事に気をつけたら良いかの指標となる内容でした。
タイトルの記載内容やレビューへ促す条件を、紹介された内容や他のアプリとの比較をしてみることで、自身のアプリでの対策を見返す良い機会にもなりそうです。

FatViewControllerを安全に書き換える方法が見つからなかったので、どういう痛みを許容するか考えた

テスト方針を決めるときは状況や環境を考慮する必要があるため、決まった対応パターンが存在しません。だからこそ他社の対応事例は「過去の対応方針を振り返るとき」や「これから決めるとき」参考になります。 このセッションではまさにそのテスト方針を決めるとき、何を考慮し、どう対応したかが事例として紹介されました。

「普段、テスト方針を決めるために自分がやっていることに問題はないか」、「他の人はどう決めてるか」はとても気になってたので自分の過去を振り返りながら、そして同じ状況なら自分はどうやるかを考えながら興味津々に発表内容を聞きました。
セッションで紹介された「再現可能なテストはないが安全に修正したい。だけどミスは許されない」状況で自分なら何を考慮するかを考えたときに思い浮かんだのは以下です。

  • 自動テストがあるか
  • サービス視点でテスト対象の重要度
  • 開発スケジュール的に使えるリソースはどれほどあるか(工数)
  • テストコードを書きやすい設計になっているか
  • テストしたいのは何か(ロジックか、表示か、挙動か)
  • 実装コスト
  • 実行コスト
  • テストの生存期間やメンテナンスコスト

セッションでも上記は考慮対象だったので大きくはズレてないと思い、少し安心しましたがUIテストを積極的に検討してる部分は印象的でした。今までUIテストは「手間がかかる」、「メンテコストがかかる」と単純に思い込んでいたのでもう一度UIテストに関して振り返ってみようと思います。他にはサービスの中の重要な価値について「認識を共有する」という項目も印象に残りました。確かにここをはっきりしておかないと暗黙的な基準で判断してしまうこともあるかもしれません。
このセッションはテストに関する自分のやり方を振り返るきっかけになったと思います。他社の事例を知ることは滅多にないのでテストに興味がある方は是非このセッションの資料を見ることをオススメします。

多言語対応と戦う 2019年版

こちらのセッションでは、多言語化が未対応のアプリでの対応の始め方から紹介されていました。
現在私が対応しているWEARアプリでは日本語や英語、繁体字、簡体字といった多言語の対応を行っていることもあり、このセッションを聞いてみることにしました。
WEARアプリでは文言もユーザーに伝わりやすいように、見やすいようにとデザイナーが試行錯誤して決めています。 実装の節目で私たちはデザインチェックを行うのですが、4つの言語の確認となりますとシステムの言語を都度切り替えて確認しなければならないという手間がありました。
そういった背景から私は、このセッションの中で紹介されたうちの1つ「アプリで言語を切り替えられるようにしよう」に興味を持ちました。
アプリの言語切り替えは、iOS 13以降からiOSの標準機能として盛り込まれる機能のようです。

Language selection per app

Use third‑party apps in a different language from your system language.

www.apple.com

こちらのセッションでは、これをiOS 12以前のバージョンで実現する方法が紹介されていました。

アプリ内で使用されている言語は、どこから取得されるのか?

UserDefault.standard.array(forKey: "AppleLanguages")にて[String]で定義されています。
ここで定義されている言語は、設定>一般>言語と地域の中で追加されてる言語です。 アプリ内では、UserDefault.standard.array(forKey: "AppleLanguages")から取得された配列の先頭の言語が使用されます。

どうやってアプリ内で言語を切り替えるのか?

例えば現在表示されている言語が、日本語の状態から英語に変える場合を考えます。
UserDefault.standard.array(forKey: "AppleLanguages")で取得される配列の順序を変更することで切り替えが可能なようです。
今回の場合、["ja-JP", "en"]を["en", "ja-JP"]と変更することで切り替えられます。
この他にも、設定アプリで追加されていない言語を追加する方法や、リセット方法なども含めてデモンストレーションを交えながら詳細に説明していただきました。

次に興味を持ったのは、「翻訳SaaSの導入で翻訳者にプルリクを出してもらおう」です。
この項目では、エンジニアでない方も翻訳変更に対するプルリクが発行できるような仕組みについて紹介されました。
ここではCrowdinというSaaSを例に説明されました。CrowdinとGitHubの連携時に、管理したいLocalizable.stringファイルを連携すると翻訳リストを管理するUI上で翻訳の変更が可能になります。
変更することで、プルリクが発行されるという仕組みになっているようです。
WEARアプリでは、英語と中国語の翻訳をそれぞれ別の方が担当して対応しています。私たちは、翻訳が必要な文言のやり取りをConfluenceやSlackを使ってやり取りして対応してきました。
現状の運用方法ですと翻訳依頼の取りこぼしや反映漏れなどが稀に発生していたこともあり、改善策を考えていました。そんな中で、今回のような具体的な運用例をあげての紹介はとても参考になるお話でした。
その他にも、翻訳ネームスペースを使った翻訳文言の管理方法や文字装飾のローカライズの方法などが紹介されていて、今後迷った時に参考になる発表内容でした。

会場の様子

思いやりが詰まったセッション会場

選出された登壇者によるセッションは、いくつかのテーマを同時進行でそれぞれの講義室で行われます。
セッション会場は、写真のように席がぎゅうぎゅうになることもあり、セッションに対する参加者の注目度の高さが伺えます。

f:id:vasilyjp:20190918200335j:plain
iOSDC Japan

弊社の名取や技術顧問の岸川さんのセッションの際も、席は参加者で埋め尽くされてました。
運営の方々の1人でも多く参加者がセッションを聞けるようにという想いから「機械的席詰め」というシステムが度々施行されました。
これは、三人掛けの席で右側が空いていたら機械的に右に詰めるシステムという仕組みのものです。
会場の思いやりによって生まれた、この理想的なゾーンディフェンスのように美しいシステムに、私は感動を覚えました。
セッションは今後プロダクトに関わっていく上でどれも興味深く、勉強になりました。 各登壇者が発表の中にデモンストレーションを組み込んでいたり、笑いどころを入れるなどの工夫も見られ楽しく発表を聞くことができました。

活気にあふれたブース会場

iOSDC Japan 2019ではトークセッションの他にも、様々な企業が軒を連ねるブース会場があります。
セッションの合間や、お昼休憩などセッションのない時間帯は特に参加者の方々で会場はとても活気付いていました。

f:id:vasilyjp:20190918200411j:plain
iOSDC Japan

この会場ではイベントのスポンサーとして協賛している企業がブースを出展して、参加者とのコミュニケーションを図っていました。
私たちZOZOテクノロジーズのブースを少し覗いてみましょう。

f:id:vasilyjp:20190918200510j:plain
iOSDC Japan

今回ZOZOテクノロジーズでは、以下のテーマでアンケートを用意しました。

  • アプリのサポートiOS
  • アプリのSwift率
  • アプリの対応デバイス
  • アプリのレイアウト実装の割合

f:id:vasilyjp:20190918200539j:plain
iOSDC Japan

参加者の方々のアンケートへの協力もあって、たくさんの方々と交流することができました。
実際にアプリを開発しているエンジニアや広報担当が参加者の皆さんの質問に答えるといった、お話もさせていただきました。参加者の皆さんと接する機会をいただけたことで、私たちもとても楽しい時間が過ごせました。
アンケート結果は、Twitterの公式アカウント上でハッシュタグ#iosdc #zozotechにて載せております。是非ご覧になってください。

1日目

2日目

食事は行列の先に

f:id:vasilyjp:20190918200611j:plain
iOSDC Japan

午前中のセッションが終わると参加者の行列が。その先には、参加者分のお弁当とお茶の用意がありました。

f:id:vasilyjp:20190918200631j:plain
iOSDC Japan

私が食べたのは、野菜を豚肉でぐるりと巻いた豚肉巻きとシャケの切り身に明太子のソースが絡み合ったおかずのお弁当。
副菜には、ゴーヤやゆで卵といった色とりどりの食材を使ったサラダが添えられており、セッションの合間の休憩時間を彩ってくれました。

After iOSDC Japan 2019について

9/24(火)弊社オフィスにてSansan様、JapanTaxi様、弊社ZOZOテクノロジーズの3社による合同イベント「After iOSDC Japan 2019」が行われます。 iOSDC Japan 2019を振り返りたい方や感じたことを共有したい方は是非お越しください! zozotech-inc.connpass.com

最後に

ZOZOテクノロジーズは、ファッションを技術の力で変えていくというミッション達成のため一緒に働く仲間を募集しています。気になる方は是非応募してください!
tech.zozo.com

カテゴリー