【Swift5】アラームアプリって実際簡単そうに見えるけどバリ難しいって話【Xcode12】

2022/03/29に公開

競争相手が少ないブルー・オーシャンかと思ったら、
強敵がいて、かつ実装もバカ難しかったって話です。

アラームアプリを作ろうとした

話は変わりますが、現在Pixel3a(Android)を使っているのですが、iPhoneXSが安く買えるので乗り換えたのです。

しかしながら、Androidで強烈で気に入っている機能がございまして。。

アラームの解除機能です。簡単に説明すると、毎朝8時30分にアラームは設定しているけれど、今日は早起きして朝活しているからアラームは不要だから今日だけはアラーム鳴らさなくていいよという機能です。

iPhoneでは同様の機能が用意されていないので、都度アラームをオフにして、アラームの時間が過ぎてから再設定(オン)するという処理を行っていました。

この行為の何が危ないっていうと、オフ→オンにする処理を思い出さないと、次の日の朝のアラームが設定されていないので鳴らないんですよね…。考えるだけでも恐ろしい。

その点でAndroidアプリのアラームが優れていると思っていました。

AndroidライクなアラームアプリをAppStoreに出せば良いのでは?

そして広告収益化を狙えば、ブルーオーシャンなので良いのかなと思っていました。そして、すぐにアプリ開発を着手してから、「アラームアプリは難しい」という事がわかりました。

アラームアプリ開発は難しい。

もちろん個人開発のレベルの「ただ通知する」みたいなアプリなら簡単です。
僕は0から画面込みで3時間程度で作れました。

しかしながら、実際にユーザーに使われて気に入られるレベルに仕上げるのは相当難しいという話です。

要因として考えられるのが下記の点になります。

  • ローカル通知に依存せざるを得なく、ローカル通知がアラームに完全に適した仕様ではない。

https://qiita.com/K_Kenty/items/d589a0f0e1949e167aab#最大の落とし穴

こちらの記事がかなり分かりやすいです。

サイレントな動画を録画してバックグラウンドで動作を保証する方法などありますが、
アラートアプリが動作している間RECマークが出てしまうなど現実的ではありません。(ユーザーが不審に思う)

記事内ではNever sleep methodが最善と言われていますが、アプリキルされたら動作しないのはアラームアプリとして心理的なストレスを与えると思うので自分は賛同しませんでした。

なので実際はローカル通知によるアラームを行うのがベストと言えますが、ローカル通知は30秒しか設定できません。そこに目を瞑る必要があります。

次のアラームだけ無効化するのが難しい

let content = UNMutableNotificationContent()
       content.title = "AndroidLikeAlerm"
       content.body = "22:30"
       content.sound = UNNotificationSound.default
                
       let notificationCenter = UNUserNotificationCenter.current()
        
       var dateComponentsDay = DateComponents()
       dateComponentsDay.hour = alertModel.alermTime
       dateComponentsDay.minute = alertModel.alermMinute
        
       let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponentsDay, repeats: false)
        
       let request = UNNotificationRequest(identifier: alertModel.alermId, content: content, trigger: trigger)
        
       notificationCenter.add(request) { (error) in
           if error != nil {
               print(error.debugDescription)
           }
       }

こんな感じでアラーム追加画面で設定した内容をUNCalendarNotificationTriggerに設定することができますが、
1:特定の日時時刻
2:毎週○曜日の決まった時間

しかできないっぽいんですよね。

つまり、1-2の複合の明日のn時から繰り返し動作させるというローカル通知
の仕方がどうすればいいか分からないんですよ。

アプリ内部でアラーム設定のn時+1分の時間帯にはじめて「アラーム」を設定するという処理であれば次回アラームのスキップ機能は実装できそうですが、仮にアラームが8時間後であれば8時間1分までアプリの処理を動作させておく必要があり、バックグラウンドもしくはアプリがkillされた時点でその予約しておいた処理は行われないことになります。

ここらへんの実装が大変過ぎる気がしたので技術的にはかなり難しいと感じました。なんとか出来そうですが、情報も少なく、内部のコード見ていても出来そうな感じが正直しなかったです。

そもそもAndroidライクな機能のアラームアプリがあった

冒頭に述べた強敵がいたってやつです。

僕に1銭も入らないですが、かなり良い機能なので貼っておきます。

シンプルなアプリを望む僕からすると、機能が付与されすぎて胃もたれしますが、それでもAndroidライクな次回アラームスキップ機能は実装されているので暫くはこちらを利用しようと思います。

広告収益ビジョンについて

自分なり考える収益化に必要な3本柱のうち、アラームアプリに関しては3つのうち2つは条件を満たしていたのですよ。

しかしながら、広告モデルに関しては少し違うのかなと思いました。

冷静に考えると、アラームを設定するたびに全画面広告(インタースティシャル広告)はきっついですよね…

アラーム機能自体について

さきほどご紹介したアプリに関しても、マナーモード中でアプリをキルするとバイブレーションしか鳴らないという仕様で動作していました。

なので、寝る時はアプリを落としちゃダメなんですよね。

やっぱり公式アプリ以外では何かしらの制約が付いてしまうのがアラームアプリで、その欠点を許容してもらえるほどアプリに魅力がないと勝てないレッド・オーシャンだと思いました。

こういう障壁があるのならばiPhone/iPad公式の時計アプリもっと充実させてほしいのですが…

まとめ

・アプリを作る時は強みとなる機能が被っていないか事前調査を行おう
・アプリの機能が実装するのが難しくないか事前調査を行おう
・競合アプリのレビューは不満など多く書かれていて参考になるので自分のアプリに活かそう!

Discussion