10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[個人アプリ開発記]スクショ・画面録画がバレるトークアプリ

Last updated at Posted at 2020-10-10

##はじめに
こんにちは。先日2つ目となるアプリをリリースしましたので、その機能や流れについて書こうと思います。一つ目についてはこちら。ちなみにリジェクトは4回されました。匿名投稿ができるアプリが審査を通るために持たせなければならない機能についても書いています。
##アプリの紹介
機能としてはLINEのようなトークアプリなのですが、友達追加やアカウント登録という概念をなくし、ルーム名とパスワードさえお互い分かっていれば誰とでも話すことができるようにしました。
IMG_0344.PNG IMG_0347.PNG
トーク画面にはスクショ・画面録画を行うとメッセージが自動送信される仕組みになっています。
IMG_0351.PNG IMG_0390.PNG
審査を通るために追加した処理ですが、不適切な内容を投稿するユーザーをブロックすることや通報することもできます。

Simulator Screen Shot - iPhone SE (2nd generation) - 2020-07-08 at 02.40.48.png Simulator Screen Shot - iPhone SE (2nd generation) - 2020-07-08 at 02.30.14.png
報告された内容は開発者の元に届き、不適切な利用が確認された場合はユーザーの利用を停止させることもできます。
スクリーンショット 2020-07-08 2.32.10.jpg

##アプリを作ろうと思った理由
インスタでストーリをスクショすると相手にバレる?みたいな噂を聞き、そもそもスクショを検出することは可能なのか?と思ったことがきっかけです。この記事で可能であることを知り、LINEなどのトークアプリに実装したら面白そうだなと思ったのが制作を始めた理由です。その上で、LINEなど既存のトークアプリと差別化を図るために、メールアドレスや電話番号による会員登録不要ルーム名&パスワード入力によるチャットルームの製作・参加機能を取り入れることにしました。

##使用ライブラリ
Firebase
MessageKit
SVProgressHUD
##苦労したところ
###App Storeの審査がなかなか通らない
匿名投稿機能を持つアプリが審査をパスするためには利用規約への同意不適切な投稿の通報&ブロック機能危険なユーザーの利用停止機能管理者と直接コンタクトを取る手段の提供などの機能を持っている必要があります。以下は最初に出したリジェクトの一部です。

A method for filtering objectionable content
A mechanism for users to flag objectionable content
A mechanism for users to block abusive users
A mechanism for users to immediately remove posts from the feed
Developer must act on objectionable content reports within 24 hours by removing the content and ejecting the user who provided the offending content
Developer must provide contact information in the app itself, giving users the ability to report inappropriate activity

トーク機能よりもユーザーがブロックした内容を非表示にする機能や利用停止機能をつけるのに苦労しました。FireStoreから削除してしまうとブロックしていない他のユーザーの画面からも消えてしまうので、削除ではなく非表示にする必要があります。
###Cloud FireStoreの利用
Cloud Firestore(以下Firestore)とはFirebaseが提供しているデータベースの一つです。FirebaseはデータベースとしてRealtime Databse(古いほう)とFirestore(新しい方)の二つを提供しているのですが、どうやらFirebaseが推奨しているのはFirestoreの方っぽい。参考一応Realtime Databaseも使ってみたのですが、ブラウザ上でのデザインから管理しやすそうという印象を受けたのでFirestoreを利用することにしました。が、ネット上の記事はほとんどRealtime Databaseで書かれたものであったため製作において苦労しました。
Cloud Firestoreで具体的にどう使ったのかは後述します。

###NotificationCenterの管理
スクショ・画面録画の検出はNotificationCenterによって実装しています。また、別のアプリからマルチタスク画面(ホームボタンを2回押す)を利用してスクリーンショットを撮られると検出できません。それを防ぐためにNotificationCenterを利用しホームボタンを押すことでトーク画面から別の画面へ遷移するようにしました。NotificationCenterが望まないタイミングで発火することがあり、処理に苦労しました。

###ルーム名・パスワードの入力欄
ルーム名やパスワードに文字数の制限がないと、ユーザー同士に意図しない接触が発生してしまいます。ルーム名は1文字以上、パスワードには10文字以上という制限を加え、それらの自動作成ボタンを作ることで安全性と利便性を向上させました。ルーム名のTextFieldに文字が入力されており、かつパスワードのTextFieldに文字数が10文字以上入力されている時のみ(①)ボタンを押せるように、またそれぞれの自動作成ボタンを押されたときに押されていない方のTextFieldに①の条件が満たされている時のみボタンを押せるようにするという複雑な処理を実装するのに苦労しました。

##技術を得るために
###Qiitaでのアウトプット
調べればわかることでも、何度もそのサイトに訪れることは結構ストレスを感じます。例外的に自分の記事は何度訪れてもストレスを感じないので、些細なことや既出の内容でも記事にするようにしています。
Xcodeで画面遷移とともにデータを渡す
Notificationによる通知
複数のTextFieldにそれぞれ文字数の制限をつける
NotificationCenter.default.removeObserverの大切さを痛感した話
スクショ・画面録画されたことを通知する方法
NavigationControllerの下の色を変える方法
ラジオボタン(選択肢)を作る(xcode)
NavigationControllerからモーダル遷移をする時に出たエラーCould not cast value of type..
アプリを再審査に提出する際にYour package contains a file ..と出た
Firebase/Authenticationで匿名ログインにする方法
初回起動時のみ画面遷移する方法
UserDefaultsに配列を追加・リセット
メッセージに含まれる特定の単語を*で置き換える
実行した時刻を数字として取得することで時系列でソートできるようにする
###Teratailでの質問
調べても解決できない時はTeratailで質問しました。回答やコメントしてくださった方々にはとても感謝しています。
func applicationWillResignActiveが呼ばれない
Database.database().reference() と Firestore.firestore().collection().document()の違い
UI部品の重なりを解消したい
UIKitの中にSwiftUIを入れた時Buttonが反応しない
willTerminateNotificationでマルチタスクからアプリを消去した時に特定の処理ができない
Firestoreから取得したデータの順番を時系列にしたい
Could not cast value of type..というエラーが解決できない

##FireStoreの構造
Databaseには"Rooms"と"Reports"の二つのコレクションを持っています。アプリ内でルームが作成されると、コレクションRoomsには"ルーム名"+"パスワード"をドキュメント名に持つドキュメントが作成されます。
スクリーンショット 2020-07-08 8.50.51.jpg
そして、メッセージが送信されると"messages"コレクションにデータがセットされます。
ユーザーが通報を行った際には各ルームドキュメントに"report"コレクションが作成されると同時に、同じ内容が"Reports"ドキュメントにも追加されます。
スクリーンショット 2020-07-08 8.51.17.jpg
利用規約に同意することで匿名登録が行われます。アカウントはuidというユーザーが一意に定まる文字列を持つため、ブロック機能の際にはこのuidを利用しています。
スクリーンショット 2020-07-03 8.04.47.jpg

##終わりに
画像・動画を送れる機能やブデザインの向上などまだまだ実装したい内容はたくさんあります。これからも開発を継続していきます。
teratailで回答・コメントしてくださった方を始め様々な方のおかげでアプリを完成させることができました。ありがとうございました。

10
4
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?