はじめに
技術的な内容のみをご覧になりたい方はこちらからどうぞ
先日、App Storeにて**「メディット」**を正式リリースしました!これは高齢者の見守りを目的としたコミュニケーションアプリです。年に数回しか帰省できない、そんなとき家族の安否を知る手助けになります。今回はその機能とそれを支える技術をご紹介します。
メディットについて
開発のきっかけ
核家族化が進み、一人暮らしのお年寄りが増えています。家族が帰ってくるのは帰省のときだけ。このような状況では、家族間のコミニュケーションは少なくなってしまいます。
見守りサービスなるものは以前から多くありました。しかしどれもお年寄り側の情報を一方的に伝えるだけ。これでは良くも悪くも安否確認しかできません。
単なる報告だけでなく、日々の過ごし方がわかるようなアプリをつくる。それがメディットのコンセプトです。
機能と特色
本アプリでは以下の内容をフォロワー全員に知らせることができます。
・毎日やることを達成したかどうか
・今の気分、心の状態
・散歩や買い物をしたなど、1日の過ごし方
・簡単なメッセージ
これらはお年寄り側だけでなく家族がお互いに共有し合うデータです。一方通行でない、相互的なコミュニケーションを目指しています。また、更新日時も表示されるので頻度が下がったら電話するといった使い方もできます。
技術的なポイント
SwiftUI
本アプリは全面SwiftUIで構築しています。これはマルチプラットフォームでの開発を念頭に置いた、Appleの最新アプリ開発フレームワークです。
開発にあたっては従来のアプリでよく使われていたUIKitという選択肢もあります。しかし、将来性と拡張性を期待してこちらを選びました。
Apple Watchなどへの対応はもちろん、これからの新技術もどんどん取り入れられるというメリットは大きいものです。メディットもアップデートで機能を拡充していく予定です。
Sign with Apple
AppleIDを使用した認証機能です。メディットではログイン機構としてこれを採用しています。
採用の理由のひとつはセキュリティです。メールアドレスを通知せずにログインすることが可能なので、高い匿名性を確保することができます。
また利便性にも優れています。メールアドレスやパスワードは忘れることがあります。お年寄りの方々に利用していただくならこの点は見過ごせません。
その点AppleIDなら、iPhoneを使っているならほぼ必ずログイン済みですからスムーズに認証を行うことができます。
Firebase
ユーザー管理にはデータ送受信にはFirebaseを利用しています。特にFireStoreはオフラインキャッシュもあるので通信状態の悪化にも対応できます。
MVVMパターンでの設計にも適しているといえます。一般的な方法として、以下のようなクラスを用意しておけば送受信どちらの時にも対応することができます。
class UserInfoModel: ObservableObject, Codable, Identifiable {
@Published var name: String = ""
@Published var loginID: String = ""
@Published var followers: [String] = []
var updateTime = Date() //更新日時を取得
enum CodingKeys: CodingKey {
case name
case loginID
case follow
case updateTime
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
loginID = try container.decode(String.self, forKey: .loginID)
followers = try container.decode([String].self, forKey: .follow)
updateTime = try container.decode(Date.self, forKey: .updateTime)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(loginID, forKey: .loginID)
try container.encode(followers, forKey: .follow)
try container.encode(updateTime, forKey: .updateTime)
}
}
今後の展望
ヘルスケアなどと連携し、より詳細なデータをやりとりできるようにしていきたいと考えています。またUIについては使いやすいものになるように考慮していきたいと思っています。
LGTMや共有等していただけると励みになります☺️
まだまだ至らない点はありますが、より多くの人の役に立てるよう運営を続けていくのでよろしくお願いします。
よかったらこちらもどうぞ!
・その他作成したアプリ:ミュート
・各種お知らせ:Twitter
・作成途中のアプリなどについて:note