こんにちは。きんくまです。
Habit Keeperでリマインダーをつけて欲しいというご要望が結構前から何件かいただいておりまして、前から開発者用の仕様書を読んだり、プログラムの実験してまして、それについて考えてることを書き出してみます。
リマインダーをつける方法は2つ
iOS6の現在リマインダーやアラームのようなものを実現するには大きく分けて2つの方法があります。
1. Event Kit を利用する
>> Calendar and Reminders Programming Guide
2. Notificationを使う
>> Local and Push Notification Programming Guide
1. Event Kit を利用する
Event Kitを利用すると
1) iOS標準のCalendar.app(カレンダーアプリ), Reminder.app(リマインダーアプリ)で表示されるイベントを読み書き・追加・削除できる
2) リマインダーを自分のアプリから操作できるのはiOS6以上
3) リマインダーのリピート間隔はかなり柔軟にできる。複数曜日を組み合わせたり、月の日付で○日と×日ととか。
4) 個数に制限はない(たぶん)
5) アラームが出た場合は、自分のアプリではなく標準のカレンダーアプリからか、リマインダーアプリからでないと出せない。(アラートが表示されたときに出るアイコンだったり、アイコンをスライドして起動するアプリです)
6) 自分のアプリからイベントを追加した場合は、必ずカレンダーやリマインダーなどに表示される。
Habit Keeperでは3種類のリピートタイプがあります。
曜日、○にちごと、月の特定の日付 です。
次のNotificationの項目でも説明するのですが、リピートタイプが柔軟になっています。
なので、このリマインダーを使えばたぶん指定時間で鳴らすことが可能だと思います。
ただ、不安なのがアラームが出た場合に、アラームをタップすると表示されるのが標準のリマインダーなんですよね。
さらに、そのリマインダーアプリ内で自分のアプリで設定したリマインダーイベントを操作することが可能なんです。
標準リマインダーアプリ内で編集されちゃうと、自分のアプリからは見失っちゃうことがありえるということなんです。
注意書きで「リマインダー内アプリでは触らないで下さい」みたいのをつけたって触ってしまうのが基本なので、意味がないのです。
もしリマインダーアプリ内では非表示設定ができるか(セキュリティ的にたぶん無理)、アラームをタップして飛ぶ先が選べるんだったらこちらを選んだと思うのですが、ちょっと決めかねる感じです。
2. Notificationを使う
Notificationは2種類あります。Push NotificationとLocal Notificationです。
まずPush Notificationは、開発者がサーバーをたててそこからAppleのサーバーにメッセージを送ると、Appleのサーバー経由でインストールしたアプリ全てにメッセージが配信できる仕組みです。
ソフトバンクなどのキャリアから割引情報なんてのがプッシュ配信でたまに来たりしますけど、あれと同じようなものを開発者それぞれが実装できる仕組みですね。ネットワークを使うので、ネットワークがつながらない場所にある端末には遅れて配信されたりします。
これは大量に同じ情報をプッシュ配信する仕組みなので、今回検討しているリマインダーには向きません。
次にLocal Notificationは、ネットワークを使わずに端末だけで完結する仕組みです。アラームのようなものです。
1) アラーム時刻や日付を指定できる
2) リピート間隔を設定できる(後述)
3) 1つのアプリで設定できるのは64個まで
4) アラートがなって、タップして表示されるアプリはそのアプリ(標準のカレンダーやリマインダーアプリではない)
2について補足すると、リピート間隔は 時間 / 日 / 週 / 月 / 年 など(秒や分でもできるかも)。
例えば2013/03/24 17:00にアラームを設定してリピートを日にすると、2013/03/25 17:00にリピートしてくれる。
一見よさそうなのですが、Event Kitと違ってリピート間隔が柔軟でないんですよね。例えば平日(月から金)だけリピートしたくても、そういう機能がないために、アラートを基準の月から金曜日までの5つ作って、週でリピートする必要があるんです。
それで、だったら大量に作ればいいじゃんって話なんですが、条件3に書いたようにひとつのアプリでは最大64個までしか作れないのです。うわー。
今Habit Keeperではアプリのバッジ機能のために、すでに31個のLocal Notificationを使用する場合があります。
アプリを起動しないでも、自動でその日の日課の数がバッジに表示される仕組みを作るためです。
例えば最高で1ヶ月先まではアプリを全く起動しなくてもバッジが更新され続けるというわけです。
直近の10日分だけでも良さそうなのですが、リピートタイプで月のうち特定の日付というのがあるので、1ヶ月は絶対に確保しておきたかったという。
さて、残されたNotificationは差し引き33個となります。
どうしましょう?
まず個別の日課にひもづけてそれぞれでアラートをつけるのはやめました。
リピート間隔がそもそも全く同じにできないし、個数に制限があるため全ての日課に必ずしもつけられるとは限らないからです。中途半端にひもづけてしまうと、わかりづらくなってしまう。
他の競合の日課アプリを見てみると、アプリ内で1つだけデイリー(毎日)のリマインダーを持っているものがありました。これはこれでアリだと思いました。何よりシンプルです。
ですが、もう一工夫できないかなと思いまして、自分としてはiOS標準の時計アプリにあるアラームのようなものを設ければ良いんじゃないかなと思っています。
・アラームを複数もつことができる(ただ個数の制限があるので最大で20個ぐらいまでにしようかと)
・リピート間隔は日 / 週 / 月で指定可能にする
・あらかじめ登録しておいたものでオン / オフを切り替えられるようにする
・アラートが表示されてタップした先が自分のアプリにできる
というふうにすれば、ユーザーそれぞれが工夫して使うことができるかなと。
理想をいえば、日課のリピートタイプに完全に一致するリマインダー(アラーム)を設定できれば良いのですが、今まで書いてきたように、いろいろと制限があるためこんな仕様になりました。
あとはこれを実装して公開したときに、ユーザー側からどんな反応があるかですね。
「なんか違う。」とか「思ったよりも便利。」とか「これならまあいいかも!」とかいろいろあると思うので、来た反応に応じてまた対策を練る感じですかね。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ