关于准则 1.2 - 安全 - 用户生成的内容

Regarding Guideline 1.2 - Safety - User Generated Content

根据 AppStore 指南 1.2 - 安全 - 用户生成的内容 为了点 - 过滤不良内容的方法

在App中实现"A method for filtering objectionable content"的方法有哪些?

我的应用包含视频上传、视频评论、上线功能

另外请建议任何第三方库来实现过滤令人反感的内容

通过引用苹果doc

  1. A method for filtering objectionable material from being posted to the app

喜欢instagram,你可以添加一个按钮不要再给我看这个post你可以根据这个过滤那个用户的数据。

  1. A mechanism to report offensive content and timely responses to concerns

为每个 post 添加报告选项,这样如果有人举报该 post,您就可以提醒其他用户,因为 它是敏感的 post,您是否肯定想看这个。或者,如果有骚扰行为,请从您的应用中删除 post。

instagram 示例图片。

  1. The ability to block abusive users from the service

如果有人不断违反您的应用隐私和协议,请暂时停用该帐户。

  1. Published contact information so users can easily reach you.

添加联系页面,用户可以在其中报告某些 post 或用户或任何查询(如果他们有)。

点 1、3、4 的示例图像


这些是每个社交应用程序都遵循的基本协议,因此您可以从任何应用程序中获取参考。

@dahiya_boy excellent answer 的基础上再接再厉。这是我在我的应用程序中做的方式,我得到了批准。

  1. A method for filtering objectionable material from being posted to the app

您不需要在 posted 之前过滤内容。例如,如果有人 post 拍摄裸照,您不需要 AI 在 post 编辑照片之前找出照片中的内容。有太多不同的事情可以被认为是令人反感的,也不能被认为是令人反感的,以至于人工智能会出错。 Apple 希望您做的是过滤来自被阻止用户的所有内容。例如:

您的应用有 2 个选项卡,在第一个选项卡上用户可以查看其他用户的照片,在第二个选项卡上用户可以查看其他用户的消息。在这两个选项卡中,照片和消息将被视为 用户生成的内容

如果用户 A 在 tab1 中,并且看到他们认为用户 B 冒犯的内容,则用户 A 可以阻止用户 B。一旦该阻止机制到位,用户 A 将不再在选项卡 1 中看到来自用户 B 的任何照片,也不会在选项卡 2 中看到来自用户 B 的任何消息。

在那种情况下,用户 B 的照片和消息被过滤,因此用户 A 看不到它们。这就是 Apple 正在寻找的(我实际上刚刚获得批准,因为我使用了那种方法)。他们想要它,以便阻止某人的用户将不再能够从他们阻止的用户那里看到任何令人反感的。我不确定这是否必须是来自其他用户的特定 post(令人反感的)或来自其他用户的所有 post。为了安全起见,我所做的是阻止所有 post。下面的代码示例概述了我是如何做到的。

对于这两个选项卡的示例,此阻止机制需要适用于这两个选项卡,这样如果用户 A 阻止用户 B 的消息,则用户 A 也将无法使用用户 B 的照片。

我添加的另一件事是,一旦 userA 阻止了 userB,那么 userB 就无法看到来自 userA 的任何照片或消息,我不确定这是否是强制性的,但我就是这样做的。它基本上是一条双向街道,但这可能并不重要。

  1. The ability to block abusive users from the service

一旦按下“阻止”按钮,一个用户就可以阻止另一个用户,这样第一个用户就不会再看到第二个用户的任何信息。基本上就是我上面描述的。

  1. A mechanism to report offensive content and timely responses to concerns

一个举报按钮。在任何 用户生成的内容 上,例如 post 视频、照片或消息,都需要有一个按钮来报告它。你必须让用户知道它会在 24 小时内得到审查,如果不合适,它会在那个时间段内被删除,你将对 post 编辑它的用户采取一些行动(Apple 希望你从应用程序中禁止他们,但这最终取决于您。

我的审稿人非常细致。最初按钮只是说“报告”。当你按下它时,会出现一个警告,上面写着“这是不合适的吗”,带有一个是按钮和一个取消按钮。

我收到了 2 条拒绝,内容大致是“这并不表示他们报告了任何令人反感的事情”和“这并没有说它将在 24 小时内被删除”。

我不得不更改它,以便报告按钮显示“报告不当”,按下它后警报标题和消息显示(标题)“报告不当”和(消息)这 post 不当吗?我们将在 24 小时内审核此报告,如果认为不合适,post 将在该期限内删除。我们也会对其作者采取行动。

  1. Published contact information so users can easily reach you.

您不需要在操作中包含联系我们按钮 sheet。

只要应用程序内的任何地方都可以让用户联系到您就足够了。在“设置”中,我有一个显示“联系我们”的单元格,在联系我们视图控制器中,我有公司地址和电子邮件地址。

这些是我用来让我的应用程序通过的 4 种方法。

附带说明一下,实现阻止功能的最佳方法是使用 blockedUsers ref,如果用户将某人添加到其中,那么该人的 userId 将在该 ref 中。每当发起阻止的用户位于正在提取消息或 posts 等数据的选项卡中时,您需要在被阻止的 ref 中进行检查并过滤掉他们阻止的任何人的任何 posts .

例如

@-blockedUsers
     |
     @----userA_userID
             |
             @----userB_userId: true

使用下面的 过滤 方法,用户 B 的 post 将永远不会出现在用户 A 的“帖子”选项卡中。

let currentUserID = Auth.auth().currentUser!.uid

Database.database().reference().child("posts")
  .queryOrderedByKey()
  .queryLimited(toLast: 10)
  .observeSingleEvent(of: .value) { (snapshot) in

     if !snapshot.exists() { return }

     guard let firstChild = snapshot.children.allObjects.first as? DataSnapshot else { return }

     for child in snapshot.children.allObjects as! [DataSnapshot] {

         if let postDict = child.value as? [String: Any] {

            let post = Post(dict: postDict)
            let userBsUserID = post.userId // UserB is really every user who created a post. I just used UserB for demo purposes. A more accurate term would be “otherUsersID” or “posterID”

            let blockedUsersRef = Database.database().reference().child("blockedUsers").child(currentUserID)
            blockedUsersRef.observeSingleEvent(of: .value) { (snapshot) in

                // if the currentUser isn't inside this blockedUsersRef then neither is userB
                if !snapshot.exists() {

                     self.dataSource.append(post)
                     self.collectionView.reloadData()

                     // *** OR now use this same method to check this currentUserID against userB to make sure it isn't in their blockedUsersRef either before adding their post to the datasource ***
                     return
                }

                // if the currentUserID does exist then check if userB is inside their blockedUsersRef
                for child in snapshot.children {
                    let snap = child as! DataSnapshot
                
                    if snap.key == userBsUserID {
                        // userB IS inside the currentUserId's blockedUsersRef so DON't ADD their post to the datasource
                        return
                    }
                }

                // userB ISN'T inside the currentUser's blockedUsersRef so ADD the post to the datasource
                self.dataSource.append(post)
                self.collectionView.reloadData()

                // *** OR now use this same method to check this currentUserID against userB to make sure it isn't in their blockedUsersRef either before adding their post to the datasource ***
            })
         }
     }
})

如果您想过滤其他用户,您只需在将 post 添加到数据源之前再次反向执行相同的操作。

看起来步骤很多,但是当审稿人针对它进行测试时我通过了