🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1605閲覧

【Swift】ブロックユーザーを非表示にする方法

Shimura_Keita

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/01/12 14:45

編集2021/01/13 10:02

前提・実現したいこと

#####掲示版、トーク、通知のスクショ
Twitterのようなアプリを作っています。

ブロックしたユーザーを「掲示板、トーク、お知らせ」に表示させないようにする方法をご教授いただきたいです。
なお、データはFirebaseで管理しております。

トーク画面 掲示板画面 お知らせ画面

現在の状況

現在、プロフィール画面のブロックボタンが押されると、
Firebaseの[user-blocking]に保存されるようにしてあります。
また、もう一度タップするとブロック解除されます。
イメージ説明
#####Firebase
イメージ説明

ブロックユーザーをFirebaseに追加するコード

Swift

1func blockUser(uid: String, completion: @escaping(DatabaseCompletion)) { 2 guard let currentUid = Auth.auth().currentUser?.uid else { return } 3 4 REF_USER_BLOCKING.child(currentUid).updateChildValues([uid: 1]) { (err, ref) in 5 REF_USER_BLOCKERS.child(uid).updateChildValues([currentUid: 1], withCompletionBlock: completion) 6 } 7 }

##掲示板、トーク、お知らせのデータ取得状況
###掲示板
現在、掲示板はTwitterとは異なり、フォローしているユーザーの投稿だけではなく、全てのユーザーの投稿が表示されるようになっています。

なので、ユーザーごとに取得する投稿を分けておりません。
#####Firebase
イメージ説明
#####投稿を取得するコード

Swift

1func fetchPosts(completion: @escaping([Post]) -> Void) { 2 var posts = [Post]() 3 4 REF_POSTS.observe(.childAdded) { snapshot in 5 guard let dictionary = snapshot.value as? [String: Any] else { return } 6 guard let uid = dictionary["uid"] as? String else { return } 7 let postID = snapshot.key 8 9 UserService.shared.fetchUser(uid: uid) { user in 10 let post = Post(user: user, postID: postID, dictionary: dictionary) 11 posts.append(post) 12 completion(posts) 13 } 14 } 15 }

###トーク
トークは自分とやりとりしているユーザーとのトークのみを取得し、表示するようにしています。
#####Firebase
イメージ説明
#####トークを取得するコード

Swift

1func fetchConversations(completion: @escaping([Conversation]) -> Void) { 2 var conversations = [Conversation]() 3 guard let uid = Auth.auth().currentUser?.uid else { return } 4 5 REF_USER_MESSAGES.child(uid).observe(.childAdded) { snapshot in 6 let uid = snapshot.key 7 guard let last = snapshot.children.allObjects.last as? DataSnapshot else { return } 8 9 self.fetchMessage(messageID: last.key) { message in 10 UserService.shared.fetchUser(uid: uid) { user in 11 let conversation = Conversation(user: user, message: message) 12 conversations.append(conversation) 13 completion(conversations) 14 } 15 } 16 } 17 }

###お知らせ
通知に関しても、トークと同様に自分に対するものだけを取得し、表示するようにしています。
#####Firebase
イメージ説明
#####お知らせを取得するコード

Swift

1fileprivate func fetchNotifications(uid: String, completion: @escaping([Notification]) -> Void) { 2 var notifications = [Notification]() 3 4 REF_NOTIFICATIONS.child(uid).observe(.childAdded) { snapshot in 5 guard let dictionary = snapshot.value as? [String: AnyObject] else { return } 6 guard let uid = dictionary["uid"] as? String else { return } 7 8 UserService.shared.fetchUser(uid: uid) { user in 9 let notification = Notification(user: user, dictionary: dictionary) 10 notifications.append(notification) 11 completion(notifications) 12 } 13 } 14 } 15 16 func fetchNotifications(completion: @escaping([Notification]) -> Void) { 17 let notifications = [Notification]() 18 guard let uid = Auth.auth().currentUser?.uid else { return } 19 20 REF_NOTIFICATIONS.child(uid).observeSingleEvent(of: .value) { snapshot in 21 if !snapshot.exists() { 22 completion(notifications) 23 } else { 24 self.fetchNotifications(uid: uid, completion: completion) 25 } 26 } 27 }

現在、このような状況なのですが、
ブロックしたユーザーをはじき、表示させないようにする方法をご教授いただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

『ブロックしたユーザーをはじき、表示させないようにする方法』はswiftではなく
CloudFirestoreのセキュリティルール側で設定するかと思います。

https://firebase.google.com/docs/firestore/security/rules-conditions?hl=ja#access_other_documents

allow read; // 全員読み取り可 allow read: if request.auth.uid != null; // 認証済みユーザーのみ読み取り可 allow read: if request.auth.uid == allowUsers; // (allowUsersに登録された=)許可したのみ読み取り可

多分、、

allow read: if !exists(/databases/$(database)/documents/user-blocking/$(request.auth.uid))

みたいにしてしてuser-blockingに(uidが)入っていないことを条件にするかと思います。
実際は認証済みかどうかとか色々条件あるかと思います。。
パスは適当なのでご自身のものに変更してみてください。

投稿2021/01/23 07:39

sunglass

総合スコア303

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shimura_Keita

2021/01/26 14:25

返信遅れてしまい、大変申し訳ございません。 ご回答ありがとうございます! なるほど!Swiftで設定するのではないんですね! それは盲点でした???? Realtime Databaseでデータを管理しているのですが、 CloudFirestoreのセキュリティルールに記載した方が良いのでしょうか? 恐れ入りますが、ご教授いただけたら幸いです????‍♂️
sunglass

2021/01/26 15:45 編集

すいません。 『ブロック』と書いてあったので自分のコンテンツをブロックして相手に見せないようにするにはセキュリティルールだと思います。 ただ質問内容(をよく読むと)『ミュート』な気もします。 ちゃんと全体像を掴んでいないので正確な回答になっていないかも知れないですが、、 自分ならuser-blockingのcreate権限を全員(認証済みユーザー)に許可してブロックボタンを押下すると『相手のuser-blockingリストに自分の名前を入れる』方法を検討するかも、です。 そうすれば上記のセキュリティルールに照らし合わせると自分の名前(ユーザーAとします。)が ブロックした相手(ユーザーBの)user-blockingリストに載るのでreadは出来なくなります。 (結果タイムライン?にはブロックした相手が表示されません。) // ここに名前が入っていない場合はread出来る allow read: if !exists(/databases/$(database)/documents/user-blocking/$(request.auth.uid)) セキュリティルール自体はCloudFirestore→ルールから記述できます。 コンソール上でテストも出来ます。 // ブロック解除もdelete権限をcreateと一緒に与えれば良いです。 match /サブコレクションのパス/ { allow create, delete : if request.auth.uid != null; } user-blockingから名前を削除すれば再度タイムラインに表示されます。 セキュリティルールはネスト出来ますのでうまく使いつつ注意してください。 ただ全体像をちゃんと把握はしていないので間違っていたらご容赦ください。 よろしくお願いします。 ※全部セキュリティルールの話になります。
Shimura_Keita

2021/01/27 03:39

丁寧なご解答ありがとうございます???? 自分が実装したかったのは、『ブロック』ではなく、『ミュート』でした。 誤解を生んでしまい、大変申し訳ございません????‍♂️ なので、「コンテンツをブロックして相手に見せないようにする」ではなく、 「ブロックしたアカウントのコンテンツを自分のスマホに表示しない」ようにしたかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問