Swift 在Firebase中建立用户数据库模型

Swift 在Firebase中建立用户数据库模型,swift,xcode,firebase,firebase-realtime-database,backend,Swift,Xcode,Firebase,Firebase Realtime Database,Backend,所以我已经完成了所有的实际应用程序。我只需要设置后端。我认为Firebase是最好的解决方案,因为解析不再是一件事。我想要的是: 具有配置文件的用户-这些配置文件可以由添加的朋友查看,但只能由实际的配置文件所有者编辑(写入) 因此,我通读了Firebase文档,但仍然不知道如何做到这一点。他们只有一个Swift应用程序示例,没有做任何类似的事情,而一个Obj C twitter示例甚至不会构建。他们所有的文档仍然有Swift的println,这让我觉得它没有经常更新 有人有这方面的好例子/教

所以我已经完成了所有的实际应用程序。我只需要设置后端。我认为Firebase是最好的解决方案,因为解析不再是一件事。我想要的是:

具有配置文件的用户-这些配置文件可以由添加的朋友查看,但只能由实际的配置文件所有者编辑(写入)


因此,我通读了Firebase文档,但仍然不知道如何做到这一点。他们只有一个Swift应用程序示例,没有做任何类似的事情,而一个Obj C twitter示例甚至不会构建。他们所有的文档仍然有Swift的println,这让我觉得它没有经常更新



有人有这方面的好例子/教程吗?我一直在努力寻找东西,但没有什么东西和我想要的足够相似。我更关注的是如何为每个用户设置数据库并访问它,而不是实际使用Swift中的Firebase

正如我在对你的问题的评论中所写,这个答案是基于我们使用
Swift
+
Firebase
在真实的社交应用程序中所做的工作

数据结构 假设您希望为单个用户存储以下信息:

  • 电子邮件
  • 用户名
  • 名称
  • 关注者-关注特定用户的人数
  • 跟踪-特定用户跟踪的人数
  • 头像url-他们头像的url
  • bio-一些附加文本
由于在Firebase中,所有内容都存储在JSON对象下,因此您可以将上述结构存储在节点下,路径类似于
users/$userId
,其中
$userId
是Firebase用户UID,如果您使用简单的电子邮件/密码Firebase授权,则为每个注册用户创建该UID

Firebase电子邮件/密码授权在其文档中有说明:

请注意,Obj-C和Swift代码段都有。我发现Firebase文档非常棒,因为它在我构建应用程序时帮了我很多

为了回答这个问题,我们假设用户的用户名为
jack
,Firebase用户UID等于
jack\u UID
(实际上这是Firebase生成的字符串)

然后,此用户的示例数据将存储在路径
users/jack\u uid
下,如下所示:

{
  "email" : "jack@example.com",
  "username" : "jack",
  "name" : "Jack",
  "followers" : 8,
  "following" : 11,
  "avatar_url" : "http://yourstoragesystem.com/avatars/jack.jpg",
  "bio" : "Blogger, YouTuber",
}
{ 
   "sample_username_1": "firebase_generated_userid_1",
   "sample_username_2": "firebase_generated_userid_2",
   ...
   "jack": "jack_uid",
   "sample_username_123": "firebase_generated_userid_123"
}
{
   "firebase_generated_userid_4": true,
   "firebase_generated_userid_14": true
}
Firebase电子邮件/密码授权非常有效,但老实说,如果用户想登录应用程序,使用用户名比注册帐户时发送的电子邮件要好得多

为了做到这一点,我们决定存储从用户名到用户ID的映射。我们的想法是,如果用户在登录表单中输入用户名和密码,我们将使用该映射检索他的用户id,然后尝试使用他的用户id和提供的密码让他登录

例如,映射可以存储在路径
username\u to\u uid
下,如下所示:

{
  "email" : "jack@example.com",
  "username" : "jack",
  "name" : "Jack",
  "followers" : 8,
  "following" : 11,
  "avatar_url" : "http://yourstoragesystem.com/avatars/jack.jpg",
  "bio" : "Blogger, YouTuber",
}
{ 
   "sample_username_1": "firebase_generated_userid_1",
   "sample_username_2": "firebase_generated_userid_2",
   ...
   "jack": "jack_uid",
   "sample_username_123": "firebase_generated_userid_123"
}
{
   "firebase_generated_userid_4": true,
   "firebase_generated_userid_14": true
}
然后创建一个概要文件可能看起来像这样,并且在注册一个新帐户成功后就完成了(这个片段非常接近我们在生产中使用的确切代码):

除此之外,您可能还希望为每个用户存储一个追随者列表和一个单独的用户列表。这可以通过将用户ID存储在类似于
followers/jack\u uid
的路径来实现,例如,它可以如下所示:

{
  "email" : "jack@example.com",
  "username" : "jack",
  "name" : "Jack",
  "followers" : 8,
  "following" : 11,
  "avatar_url" : "http://yourstoragesystem.com/avatars/jack.jpg",
  "bio" : "Blogger, YouTuber",
}
{ 
   "sample_username_1": "firebase_generated_userid_1",
   "sample_username_2": "firebase_generated_userid_2",
   ...
   "jack": "jack_uid",
   "sample_username_123": "firebase_generated_userid_123"
}
{
   "firebase_generated_userid_4": true,
   "firebase_generated_userid_14": true
}
这就是我们在应用程序中存储值集的方式。它非常方便,因为更新它并检查是否有一些值是用户真正需要的

为了计算跟随者的数量,我们将这个计数器直接放入用户的数据中。这使得读取计数器非常有效。但是,更新此计数器需要使用事务写入,其思想与我在这里的回答几乎完全相同:

读/写权限 问题的一部分是如何处理对存储的数据的权限。好消息是Firebase在这里非常好。如果您转到Firebase仪表板,则会有一个名为
安全与规则
的选项卡,您可以在这里控制对数据的权限

Firebase规则的优点在于它们是声明性的,这使得它们非常易于使用和维护。然而,用纯JSON编写规则并不是最好的主意,因为当您想要将一些原子规则组合成一个更大的规则,或者您的应用程序越来越简单,并且您在Firebase数据库中存储的不同数据越来越多时,很难控制它们。幸运的是,Firebase团队编写了Bolt,这是一种可以轻松编写所有规则的语言

首先,我建议阅读Firebase关于安全性的文档,特别是对节点的权限如何影响其子节点的权限。然后,您可以在此处查看螺栓:

例如,我们使用与以下类似的规则来管理用户数据:

//global helpers
isCurrentUser(userId) {
    auth != null && auth.uid == userId;
}

isLogged() {
    auth != null;
}

//custom types, you can extend them
//if you want to
type UserId extends String;
type Username extends String;
type AvatarUrl extends String;
type Email extends String;

type User {
    avatar_url: AvatarUrl,
    bio: String,
    email: Email,
    followers: Number,
    following: Number,
    name: String,
    username: Username,
}

//user data rules
path /users/{$userId} is User {
    write() { isCurrentUser($userId) }
    read() { isLogged() }
}

//user's followers rules
//rules for users a particular
//user follows are similar
path /followers/{$userId} {
    read() { isLogged() }
}

path /followers/{$userId}/{$followerId} is Boolean {
    create() { isCurrentUser($followerId) && this == true }
    delete() { isCurrentUser($followerId) }
}

//username to uid rules
path /username_to_uid {
    read() { true }
}

path /username_to_uid/{$username} is UserId {
    create() { isCurrentUser(this) }
}
底线是,您可以使用
Bolt
编写所需的规则,然后使用Bolt编译器将它们编译成JSON,然后使用命令行工具或通过将它们粘贴到仪表板将它们部署到Firebase中,但命令行的效率要高得多。一个很好的附加功能是,您可以使用仪表板中的
Simulator
选项卡中的工具来测试规则

总结 对我来说,Firebase是实现您想要的系统的绝佳工具。但是,我建议从简单的功能开始,首先学习如何使用Firebase。使用Instagram等功能实现社交应用程序是一个相当大的挑战,特别是如果你想做得好的话:)很快就可以将所有功能放在那里,Firebase使其相对容易实现,但我建议在这里耐心等待

此外,慢慢来,投资于写作工具。例如,我们有两个分开的F