如何从一个设置了 Firebase 的 IOS 应用程序读/写到另一个 Firebase 项目中包含的另一个 Fireb



我有一个Firebase数据库连接到我的IOS应用程序,使用GoogleService-Info.plist。在 AppDelegate 中,我配置了 App FIRApp.configure((。我可以读/写数据。

现在,从这个IOS应用程序中,我想访问另一个FireBase数据库brevCustomer。出于某种原因,viewDidLoadlet dbRef在 Xcode 中有一个标志,上面写着这个"从未使用过的不可变值dbRef",并且应用程序在有趣的 startObserving((dbRef.observe(.value, with: { (snapshot: FIRDataSnapshot) in的第一行崩溃。

谁能展示如何进行配置,以便我可以读/写到brevCustomer数据库?

编辑

请考虑以下情况:

  • 我有两个IOS应用程序CustomerandWorkers以及两个名为CustomerFireBaseWorkerFirebase的Firebase项目,我希望它们以以下方式工作。

  • 客户使用电子邮件和密码注册,登录,进行预订,数据保存在CustomerFireBase中。

  • 工作人员使用电子邮件和密码注册,日志是,观察工人Firebase的值更改或添加的孩子
    • 从 CustomerFireBase 读取
      • 写信给 CustomerFireBase
      • 写信给 WorkerFirebase

我怎样才能做到这一点?基本上,我需要从Firebase以通常方式配置的一个IOS应用程序获得读/写访问权限,以访问另一个Firebase项目中包含的另一个Firebase数据库。

Class Claim {
var dbRef:FIRDatabaseReference! //create a reference to Firebase database `brevCustomer`, not the one from .plist file
override func viewDidLoad() {
super.viewDidLoad()
let app = FIRApp(named: "brevCustomer")
let dbRef = FIRDatabase.database(app: app!).reference().child("Users")
startObservingDB() // observe the database for value changes
}
func startObservingDB() {
//it crashes on the line below
dbRef.observe(.value, with: { (snapshot: FIRDataSnapshot) in
//iterate over each user node child
for user_child in snapshot.children {
print(user_child)} 
}, withCancel: { (Error: Any) in
print(Error)
})
} // end of startObservingDB()
}//end of Claim class

class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Use Firebase library to configure APIs for the initial project with .plist file saved in Xcode
FIRApp.configure()

/** 1. create a Firebase options object to hold the configuration data for the second Firebase Project */
let secondaryOptions = FIROptions(googleAppID: "1:82424687545:ios:71df5d45218ad27",
bundleID: "com.vivvdaplar.Brev",
gcmSenderID: "8201647545",
apiKey: "AIzaSyCNtyUf2T3UunH6-ci_WyvOqCl_RzXI",
clientID: "8200687545-42vklp94reavi6li6bolhcraoofc6.apps.googleusercontent.com",
trackingID: nil,
androidClientID: nil,
databaseURL: "https://brev-72e10.firebaseio.com",
storageBucket: "com.vivvdaplar.Brev",
deepLinkURLScheme: nil)
// Configure the app
FIRApp.configure(withName: "brevCustomer", options: secondaryOptions!) 
return true
}
} //end of AppDelegate

回答问题和评论。

如您所知,当用户向 Firebase 注册时,系统会在 Firebase 服务器上创建一个用户帐号,并向用户提供用户 ID (uid(。

典型的设计模式是在 Firebase 中有一个/users 节点,用于存储有关用户的其他信息,例如昵称、地址或电话号码。

我们可以利用该/users 节点来指示它是哪种类型的用户;Worker 或 Client,它们将绑定到应用的其余部分和 Firebase,以便他们获得正确的数据。

例如

users
uid_0
nickname: "John"
user_type: "Worker"
uid_1
nickname: "Paul"
user_type: "Client"
uid_2
nickname: "George"
user_type: "Worker"
uid_3
nickname: "Ringo"
user_type: "Worker"

正如你所看到的,约翰、乔治和林戈都是工人,保罗是客户。

当用户登录时,Firebase 登录函数将返回用户身份验证数据,其中包含 uid。

Auth.auth().signIn(withEmail: "paul@harddaysnight.com", password: "dog",
completion: { (auth, error) in
if error != nil {
let err = error?.localizedDescription
print(err!)
} else {
print(auth!.uid)
//with the uid, we now lookup their user type from the
//users node, which tells the app if they are a client
//or worker
}
})

如果应用数据像这样划分

app
client_data
...
worker_data
...

可以设置一个简单的规则来验证用户user_type worker_data节点是工作线程,client_data节点是客户端。下面是一个伪示例,它允许客户端用户仅访问client_data节点中的数据(概念(

rules 
client_data
$user_id
".read": "auth != null && root.child(users)
.child($user_id)
.child("user_type") == 'Client'"

相关内容

  • 没有找到相关文章

最新更新