サンプルサービスの要件について
- イベントサービスを作っていて、GoogleカレンダーやAppleのカレンダーアプリにそのイベントサービスのイベントの予定が同期されて、サービスサイトにアクセスしなくてもイベントがいつ開催されるかを確認できるようにしたい。
- 筆者が慣れているので、サンプルアプリケーションはRuby on Railsで記載するが、各技術仕様については参考になると思います。
では、この要件を実現するにはどうすればいいでしょうか?
少し調べてみると、iCalenderなる規格があり、これがGoogleカレンダーやMacのカレンダーアプリで対応しているようです。
https://ja.wikipedia.org/wiki/ICalendar
iCalenderについての詳しい説明はこの記事を見ればざっくり理解することができます。
https://qiita.com/TomOse/items/31b5fb4782f06d19af79
独自フォーマットで、新しいイマドキの情報がそこまであるわけではないんですが、実際に使う項目はそんなにないし、とてもシンプルです。
ライブラリも各言語であるだろうし、自前で書いたとしても実装難易度は低いと思います。
Rubyの場合は `icalender` Gemがあり、それが一番人気っぽいので、このGemで.ics形式のデータをRailsで配信しましょう。
https://github.com/icalendar/icalendar
下記のようにControllerのコードを書けば、icalender形式のデータをRailsで配信することができます。
class EventController < ApplicationController events = Event.where("started_at > ? ", Time.now) cal = Icalendar::Calendar.new events.each do |event| cal.event do |e| e.uid = event.id e.dtstart = Icalendar::Values::DateTime.new(event.started_at) e.dtend = Icalendar::Values::DateTime.new(event.ended_at) e.summary = "【SampleSite】#{event.name}" e.description = event.description e.url = event_url(event) end cal.publish end render text: cal.to_ical end
あとは、このControllerのURLをエンドユーザーに共有して、Macのカレンダーアプリなり、GoogleカレンダーなりにURLを入力してもらいましょう。
注意点
- このiCalender形式のデータをクロールするのはユーザーではなく、各カレンダーアプリなので、原則ログイン情報を持たすことはできない。従ってURLにトークンをつけてユーザー認証だったりを行う手段が一般的になるかと思うので、エンドユーザーに対して、URLを他人に共有しないように注意喚起をする必要がある。
- またクロール頻度も各アプリの仕様によって異なるとは思うが、Appleのカレンダーアプリの場合は、5分おきに同期する選択肢があったりするので、リクエスト数によってはレスポンスをキャッシュしておくことを検討しておいたほうがいいと思う。