## SNSネイティブアプリ開発
### 概要
悪口や意見を投稿し、反論を受けて「いいね」の数で実質的な勝敗が決まる議論型SNSネイティブアプリ。
他のアプリやサイトで蔓延る悪口やアンチコメントをこのアプリに限定したいと考え、作成に至った。
悪口を言われている人が見える範囲から隔離することで、傷つく人を減らすことができる。
見たい人だけがインストールし、見たくない人は避けることで、無意識に傷つくことを避けられる。
### 開発期間
2024年 7月〜2025年2月
### 役割
担当工程: 企画・要件定義・設計・コーディング・テスト
### 使用技術
ー Kotlin, Jetpack Compose, Coil, Dagger Hilt, Firebase Firestore, Cloud Storage, Firebase Authentication, Cloud Functions, Cloud Messaging, Jetpack Navigation
### メイン機能の使い方
|悪口を投稿する|悪口に反論する|討論を閲覧、コメントする|
|---|---|---|
|<img width="230" alt="VenTal GIF 2025年2月26日.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913183/60d31b91-3a44-4aab-8c19-8d2481845844.gif">|<img width="230" alt="VenTal GIF Feb 26 2025 (2) (1).gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913183/cd7d5c58-f876-46c0-8bfc-852a22c7359e.gif">|<img width="230" alt="VenTal Video Feb 27 2025.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913183/2e6b095a-a08f-4854-bf2d-90e848f93d62.gif">|
|まず下の+ボタンを押して、作成画面へ。ストレスが溜まっていることや普通に悪口を記入して送信ボタンを押す|他人の悪口はボトムバーの左から2つ目の画面で閲覧可能。右にスライドでいいね。左にスライドで反論作成画面へ。記入して送信すればVSがスタート|VSはタイムラインに流れる。いいねは2人のうちどちらしかいいねできない。VSにメッセージを送れるのは参加者の2人のみ。コメントは全員できる。|
![]()
## 設計
#### 要件定義
#### モデリング
・ユースケース図
・状態遷移図(未使用)
・アクティビティ図
・ドメインモデル
#### 基本設計
・機能設計(画面遷移図と画面詳細)
・ER図(NoSQLに変更のため途中からyamlで設計)
・データフローダイアグラム
#### 詳細設計
・機能一覧
・ロバストネス図
・シーケンス図
#### インフラ構成図

## 開発・実装内容
### プッシュ通知機能
#### 概要
イベントに対してユーザーの通知設定がオンの場合端末にプッシュ通知を送信する
#### 課題
・通知先情報はサーバーのみが扱いたい
・通知情報の格納以外はサーバー側で行いたい。
・ユーザーのプロフィール画像を通知に使いたい。
#### 機能の実施方法
送信機能
1.通知を送りたいユーザーのFirestoreの通知コレクションに通知内容を格納
2.Cloud FunctionsにデプロイしたFunctionがコレクションへの追加を確認する。
3.Functionが通知先ユーザーの通知設定を確認する。
4.もし設定がONなら、通知の種類に応じて通知内容を補完して、通知設定に格納されているdevice token を使用してCloud Messagingからプッシュ通知を送信。
受信機能
1.受信すると表示する情報を指定。
2.指定された URL から画像を取得し Bitmap に変換。
3.HttpURLConnection を利用してネットワーク接続し、BitmapFactory.decodeStream(input) で画像をデコード。
4.通知を表示
#### 工夫した点
クライアント側で通知を送る処理をするとなると他ユーザーの端末情報や設定情報を扱うことになってしまうしそもそも責務があっていない。そこでCloud Functionを用いることで責務を分離することができた。
通知の種類を今後追加する予定があるため追加しやすい形で実装したかった。enumクラスで通知の種類を管理して、そこに追加すれば通知の種類を増やせるようにした。
### フォロー機能
#### 概要
フォローという名のサブスクライブのような機能。
#### 課題
・フォロー状態に応じてUI、メソッドの変更させなければいけない。
・フォローしている人だけの投稿をページングでき、かつ新着順で表示する必要がある
#### 機能の実施方法
フォロー機能
・フォローは各ユーザーコレクションがフォローリストを保持。
・フォロワーが誰かを知る機能は予定していないので、フォロワーはカウントのみ。
・そのフォローリストをリアルタイムでリッスンして、状態に応じてUiを変更。
フォローしているユーザーの投稿のみ表示する
・フォローリストを10個ずつに分割し、開始日と終了日で絞って取得。(Firestoreではinに10個しかいれれないから)
・取得したものを一覧にしてソートする。
・ページングは開始日と終了日をずらすことで実現。
#### 工夫した点
10個ずつをクエリのinに入れていくが、そのクエリの段階でソートしてしまうと全てを一つにした時にページングすることが難しくなってしまう。そこで投稿数を想定して、期間を絞って各クエリで取得しまとめた後にソートすることで期間をずらせばページングすることができるようになった。