(dev)juginon-blog

勉強したこと、趣味のこと。

初めてSwiftでアプリ開発をした話(そしてアプデで却下された話)

お久しぶりです、じゅぎのんです。

就活が終わって新学期が始まり、そろそろ研究に本腰が入り始める時期になってしまいました。

7月からは実験も始まるので、内定者バイト・研究・部活の結構ハードスケジュールになってしまった…

どれも手を抜けない(抜きたくない)ので、気楽に頑張っております。

さて、今回はSwiftでアプリ開発をやってみたという記事で、せっかくなので詰まったところとかWebとの違いとか所感をかければいいなと思って書いています。

作ったもの

先に、今回Swiftで作ったものは音量ボタンで制御できるストップウォッチのアプリです。

Volume Watch

Volume Watch

  • Jun Ogino
  • ユーティリティ
  • ¥120
apps.apple.com

githubにコードがまるまる上がっているので、そちらもぜひ見てみてください。(Starくれると嬉しいな〜)

github.com

Swiftを勉強し始めたきっかけ

まず、時は2,3年前に戻ります。

僕がインターンを始めたばかりのときに当時マネージャーだった先輩から、「いい感じのストップウォッチのアプリがあったらよい」というだいぶふわっとした要望を受け、当時インターンで開発を始めたばかりの僕は成長(笑)のチャンスだ!と思いアプリの作成を決意しました。

今まで僕が学部生のころから触ってきた技術は、JavaScriptフレームワークであるReactを使ったネイティブアプリ用のライブラリ、React Nativeでした。

reactnative.dev

JavaScript(React)を知っていれば大体開発ができるということで、Webの技術を触りながら今ドキのアプリ開発ができるという体験はなかなかよく、スタートアップにはうってつけの技術だなぁという印象でした。

ただ、やっぱりiOSAndroid一緒に開発しているという部分もありAppleAPIを直接使うわけではないので、やれることには限界がありました。

今回作った音量ボタンで制御できるストップウォッチアプリというのも、音量ボタンでの制御がReact NativeではできないことからSwiftならではのものと言えます。

マネージャーにいろいろ話を聞いた結果、「物理ボタンでウォッチが制御できないと結局どのアプリ使っても同じ」ということがわかり、当時React Nativeの乏しい知識しかなかった僕は完全に挫折しました。

一応作ったやつはこれ。

GitHub - Ogijun2018/newStopWatch

しかし就活でその心にもう一度炎が宿ります。

就活に関しては別の記事で長々と書いたのでそちらを見ていただければわかりますが

ogijunchang.hatenablog.com

最終的に決めたのはアプリ開発者としての道でした。

ただ僕はアプリじゃなきゃ嫌というわけではなく、単純にこの会社ならアプリの開発が一番ユーザーに価値を提供できるかな、と思ったことが最大の理由です。

一次面接が終わった後にフィードバックの面談を受けた時に、こんなことを言われました。

多分じゅぎのんくんも一番の懸念点として思っている、今まで触ったことのない技術でこれから仕事をしていくというところに関しては会社側も懸念材料としてある。

じゅぎのんくんがこれからSwiftで仕事をしていっても大丈夫だ、って言えるような覚悟を見せてほしいです。

覚悟を見せるってなんやねん…って思っていろいろ考えましたが、やっぱりエンジニアである以上技術の習得が一番の覚悟になるよなぁということで、ここでSwiftでアプリ開発をすることを決意しました。

どんな勉強をしたか

その面談を受けた日の帰りにSwiftの参考書を買って1週間でとりあえず入門書を一周しました。

そのとき買った入門書がこれ。

やるなら一気に、でも最低限の内容はちゃんと学べるような本を選びました。

結構分厚い本ですが、最初の方はXcodeの使い方とか基本文法でバリバリ進めるので、そんなにやってないのにページがたくさん進んでなんかモチベーション爆上がりしてました。

本を読み終わった後は早速ストップウォッチの開発に取り掛かりました。

当たった壁

Swiftのバージョン違いによる体系の違い

開発するぞ!となったときに一番最初に当たった壁がSwiftのバージョンの違いによるコードの違いでした。

Swiftは現時点で5.4になっていますが、入門書はWWDC2019から登場したSwiftUIを使ったアプリ開発を紹介していました。

SwiftUI Overview - Xcode - Apple Developer

つまり、2019年以前に書かれたコードはすべて入門書とは違う書かれかたをしているため、結局ネットのコードを利用するとなったときには再度学び直しが必要であるということです。

結局SwiftUIの記事はありえんほど少なくて、Storyboardを使った開発に切り替えました。

さらに古い記事だと、Objective-Cのコードもあったりしてバージョンの違いによるコードの違いはReact Nativeにはない大変なところだなぁと正直に思いました。

レイアウトの仕方が独特すぎる

React Nativeではアプリの中の要素を並べたりするとき、FlexboxというWebでは割と一般的なstyleの手法で書いていました。

Layout with Flexbox · React Native

iOS開発はAutoLayoutという様々な「制約(Constraint)」を加えることでオブジェクトの位置を決定する仕組みが使われています。

これぱっと見かなり独特で、最初は何言ってるか全然わからなくて絶対座標で指定してしまっていました。

それをシミュレーターで動かしてみると、iPhoneX系では真ん中に表示されるのに、iPhone5系だとめちゃくちゃズレて表示されるみたいな。

束縛方法はいろいろあり、Xcodeのなんかよくわからんアイコンをいろいろいじって設定します。

qiita.com

Xcodeがまずそもそも複雑っていうのも壁の一つではありました。

React Nativeを使っているとちょくちょく使うタイミングがあったので、それにだいぶ助けられた感じはします。

一からXcodeを使いこなせるようになるまではかなり時間かかるんじゃないかなぁ…

久しぶりの型あり言語、そしてOptional

僕が今まで開発で触ってきた言語はJavaScriptとかRubyとかPythonが主で、つまり動的型付け言語ばっかりでした。

最後に静的型付け言語をしっかり触ったのは学部3年のCの授業か、Javaとかかなぁという感じでかなり型に対しては食わず嫌いしていた面がありました。(TypeScriptも結局ちゃんとさわれてない)

Swiftをやるに当たってCとかの型の概念に加えて、Optionalという新しい概念についても勉強しました。

Optionalは予期せぬところでnilを参照してバグを生み出すことをなくすための仕組みって感じですが、変数に「?」とか「!」とか「??」とか「!!」とかよくわからん記号がついているのはなかなか不安になりました。

正直いまだにOptionalをすることによる恩恵を受けているか微妙ですが、もっと勉強して上手く使えるようになりたいです。

作ったアプリ

そして作ったアプリはこちらになります。

github.com

githubにgifがありますが、音量ボタンを押すのと同時にスタート/ストップが動いていることがわかると思います。

なんとか最終面接までに形にすることができて、これをアピールしたらかなり喜んでもらえました。(結果内定いただけたので、めでたしです)

さて作れたことだしアプリリリースしてみるか〜!と思いましたが、ここで最大の壁に当たりました。

音量ボタンの操作がAppleガイドラインに違反する

App Store Reviewガイドライン - Apple Developer

音量ボタンで制御するコードをいろいろ調べているうちに、なんとなくわかってしまったことだったのですが、Appleガイドラインには以下の文章が記載されています。

2.5.9 音量を上げる/下げる、サウンドオン/オフといった標準スイッチの機能、および他のネイティブユーザーインターフェイスの要素やその挙動を変更または無効にするAppは却下されます。たとえば、ユーザーがその動作を想定できる別のAppや機能に対するリンクをブロックすることはできません。

割と絶望しました。まあだからこそAppStoreに同様の機能がついたアプリがないのかもしれません。

AppStoreに上げないで他者にアプリを配布する仕組みとしては二つあり、AdHocとIn-Houseがあります。

AdHocはアプリのデバッグ用として、UDIDを登録している端末にだけアプリを入れられるような仕組みです。

これには一番面倒な制約があり、有効期限があって永久にアプリが使えるわけではありません

これじゃあ俺が卒業したらもう部活の人たちには使ってもらえないんか… そう思ってかなりしんどい気持ちになりました。僕はユーザーファーストな開発をモチベーションにしているので。

まあでも万が一の可能性もあるし、一応審査出してみるか…と思って審査を出した結果、なんかよくわからないけど通りました

ということで現在は1.3.0というバージョンのものが上がっていると思います。

Volume Watch

Volume Watch

  • Jun Ogino
  • ユーティリティ
  • ¥120
apps.apple.com

これで一件落着やん、ということで、部活の人には結構喜んでいただけました。

ただ機能としては本当に最小限で、ラップを自動で保存して呼び出せるメモリー機能があればいいな、というふうに思いながらリリースしていました。

そしてこの前、Realmというローカルデータベースを使ったラップメモリー機能を実装(v1.4.0)してアプリの審査を再度出した結果、審査から弾かれました。

f:id:ogijunchang:20210629003239p:plain
絶望の却下

翻訳すると、あんたのアプリ普通の音量ボタンの使い方してないからダメやで、ガイドライン準拠させてもっかい審査だしてくれやということですね。

音量ボタンで操作できなくなると僕のアプリのアイデンティティは消滅してしまうので、このアップデートはいまだにかけられていません;;

日にちをおいて再度審査をだしたら審査する人が変わってワンチャンあるんじゃないか!?と思ってやってみたりしましたがやっぱりダメでした。

Appleの審査工程謎ですね。そしていまだストアから消えない僕のガイドラインに違反したアプリはいつ消えるのか…神(Apple)のみぞ知る、です。

総括

ひとまず就活や部活で助けになるためにアプリを作成しましたという話でした。

これ以上追加開発をしてもストアにあげられない以上、今後の開発はどうしようかなぁ…という気持ちです。

カメラでシャッターボタンにしてるんだから別にええやん…

Appleさん、よろしくお願いします。

f:id:ogijunchang:20210629004038j:plain