はじめに
この度、「WidgetQiita」というQiitaの記事をWidgetで見れるアプリをリリースしました
Widgetに表示された記事をタップするとSafariなどのデフォルトのブラウザでタップした記事を見ることができます。
また、Widgetからタップした記事は閲覧履歴として後から確認することも可能です。
Widget | 閲覧履歴 | よく見るユーザーとタグ |
---|---|---|
iOSのWidgetのサイズはsystemSmall
, systemMedium
, systemLarge
の3種類です。
systemSmall | systemMedium | systemLarge |
---|---|---|
iPadOS15.0以降なら上記に追加でextraLarge
にも対応しています。
(今年発売のiPad mini可愛すぎませんか?)
気になった方、勉強になると思った方はこちらからインストールしてみてください🙏🏻
本題
実はWidgetQiitaがリリースするまでに2年以上の歳月がかかっております。
WidgetはiOS14からの機能でして2年前には存在していない機能です。
どうしてWidgetをメインにしたアプリになったのかappleのレビュワーとの二年間に及ぶ戦いの日々を書き連ねていきたいと思います。
なぜ作ろうと思ったのか
iOSエンジニア歴が半年もない状態で新卒として配属されたチームでの開発体制は"テスト駆動開発"で"ペアプログラミング"を実施しており、アーキテクチャは"Clearn Architecture" + "AppCoordinator"パターンという当時の自分は触ったことも聞いたこともないといった状況でした。
学生の頃、Unityでクソゲーを量産してきた経験?から、自分は何事も手を動かさないと身につけることができないということを理解していたのでとりあえず愚直に
「TDDでCleanArchitectureで個人アプリを作ろう!」
となりました。
そこでどんなアプリにしようかと悩んでたところ、Qiita APIができる機能が多くドキュメントが日本語のためハードルが低く、かつ実際にAPIを使って記事を書いている人が多いためQiitaのクライアントアプリを作ろうと決めました!
以下のように機能をホワイトボードに書き出して毎日仕事から帰ってきたら
1回目のリジェクト
そんなわけで、毎日仕事終わりにコツコツ作り3ヶ月ぐらいで以下の全ての要件を実装し終わり、
自分で考えた要件は、全部実装した!
— tsuzuki (@tsuzuki817) September 16, 2019
とりあえずファーストリリースはこれで、継続的インテグレーションを忘れずに、、#Qiita #Qiitable #個人開発 pic.twitter.com/ItWupqQ7Nq
2019/9/22 に1回目の申請をしました。
QiitaクライアントアプリAppleさんに申請した(n=1) pic.twitter.com/MLnszobA5B
— tsuzuki (@tsuzuki817) September 22, 2019
ここで1回目のリジェクトをくらいました。
理由は、appleストアに同じようなアプリが既にあるためダメです的なものでした...orz
しかも、何回も同じようなアプリを提出してきたらスパムとみなします、的な文言まで添えられていてかなりビビりました
そこで既にストアにあるアプリとの差別化を図るためにメモ機能の追加や細かい機能の追加を行いました。
2回目のリジェクト
なんとか実装を加えてリリースしました。
しかし、またしても同じ理由でリジェクトされてしまいました。
UIKitよりSwiftUIの開発にハマっていた自分は、このアプリをリリースすることを諦めてしまいました
Appleさんにリジェクトされてたアプリをいろいろ改良して再提出した!
— tsuzuki (@tsuzuki817) November 30, 2019
レビュワーの方といいアプリ作ってるみたいで燃えました🔥
3回目のリジェクト
2020年の12月ごろ、たまたま自分が作っていたQiitaアプリの話をしたことをきっかけにもう一回申請頑張ってみようかなと考えまして、記事の閲覧数によって自分のステータスがアップするミニゲーム要素をくわえることにしました。
これなら似たようなアプリはあるまいと意気込み申請しました。
そしてリジェクトです。
2020年6月末からログイン機能を提供しているすべてのiOSアプリでApple Sign In
が必須になりました。
Apple Sign In
というのは、AppleIDでアプリやサイトに登録できるようなるというユーザーにとってはとても親切な機能です。
しかしQiitaにはApple Sign In
機能がないため、華麗にリジェクトを食らいました。
Qiita APIはログインしていないと、APIの叩ける回数やLGTMやストック、コメント、フォローなどできなくなるので絶望的です。
なんとかレビュワーの方に、頼みましたが儚く終わりました... orz
4回目のリジェクト
3回目のリジェクトのあたりから、副業をするようになり個人アプリ開発の優先順位が下がってきておりました。
しかし、iOS14から登場するWidget機能が個人的にはとてもお気に入りの機能でして、簡単なWidgetアプリをリリースして、とても満足していましたが、
心の奥底にはQiitaアプリがこちらをちらちらと見ており、Widget機能をつけてQiitaアプリをリリースしたい!
という強い思いが込み上げてきました!
(2021/06ぐらい)
そこで前回してきされたApple Sign InはQiitaのログイン機能としては提供されていないため、あきらめログインに関係しそうな機能を全て削除しました;;
そして、削除したあとに今回リリースしたアプリの元となるWidgetを作って申請しました!
そしてもちろんリジェクトです。
今回の理由はちゃんとメールが残っていました。
Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
で簡単にいうと、このアプリはCOVID-19関連のアプリだから政府関係じゃないとだめだよ
的なことでした。
最初は意味がわからず混乱したのですが、レビュワーの方は親切にもアプリの検索機能を使いCOVID-19
と検索し出てきた記事をスクリーンショットに貼ってくださっていました。
COVID-19の話題が上がっていると全く相手にしてもらえない様子でした。
5回目のリジェクト
COVID-19と検索されるとリジェクト対象の記事が出てきてしまうので、検索機能を消してしまえば問題ないだろうということで検索機能を消して再度申請しました。
しかしリジェクト。
レビュワー云く「検索機能を消してもこのアプリはCOVID-19関連のアプリって認識したからだめだよ」
的なことでした... orz
しかし、Widget機能だけでもちゃんとリリースしたいと強く思っていたのでどうにかしてアプリをリリースする方法を考えました。
「アプリにCOVID-19関連の情報が表示されてはいけない」
この用件を満たす解決策が現在のアプリです。
基本的には、Widgetで記事名を表示するだけなのでCOVID-19関連の情報が表示されることはありません。
また記事を閲覧するのはアプリではなく、Safariで開くようにしました。
これでいけると思い、WidgetQiitaの作成に取り掛かります!
WidgetからSafariに遷移させる方法
この記事を書いている段階では、少なくとも自分の知る範囲でWidgetから直接Safariを起動する方法がわかりませんでした。
そこで、一度本体アプリを経由してからSafariに遷移するといった方法をとっています。
仕組み的には
- Widgetで記事をタップ
- URLスキームをつけて本体アプリを開く
- URLスキームに付けられたパラメータをもとに記事のリンクを作成してSafariを開く
といった流れになっています。
基本的にはタップした時に、Linkをつかってアプリ本体のURLスキームを叩いて遷移させています。
struct Link<Label> where Label : View
ただし、smallサイズのWidgetにはLinkが効かないので、widgetURL
メソッドを使って開くURLを指定します。
func widgetURL(_ url: URL?) -> some View
次に、アプリ側でURLスキームを開けるように設定をしておきます。
大元のViewでonOpenURL
をセットしておきます。
このようにすることで、WidgetがURLスキームを開いた時のURLをonOpenURL内でキャッチすることができます。
func onOpenURL(perform action: @escaping (URL) -> ()) -> some View
なお、一度Widget側で一度URLに変更するときには、URLComponentsを使って一度URLに変更しています。
こんな感じで今のようなアプリ申請しました!
6回目のリジェクト
今回のアプリには実は課金することによって広告を非表示にすることができるという機能を入れたのですが、それ関連でリジェクトされてしました... orz
Guideline 3.1.2 - Business - Payments - Subscriptions
で、アプリの課金するページにもちゃんと利用規約とプライバシーポリシーのリンクをちゃんと置いておいてくださいてきなことだったのですぐに対応しました!
ついにリリース
こうして2年以上に及ぶ奮闘の末アプリをリリースすることができました!
大きく6回のリジェクトに分けて紹介しましたが、本当はスクリーンショットやminimum functionなど細かい理由で倍以上リジェクトは食らっていますが、あまり書くこともないので割愛しました
appleは常に時代にあった変化をし続けていくので、開発者も常に一緒に進化し続けないと行けないということがよくわかりました。
このアプリを使って、みなさんが面白い記事に出会えることを祈っています
また追加機能のご要望、バグの報告、アドバイス、感想もろもろありましたらこちらのTwitterアカウントによろしくお願いいたします