clave - firebase ios
¿Cómo leer/escribir desde una aplicación de IOS configurada con firebase, a otra base de datos de firebase contenida en otro proyecto de Firebase? Swift 3 (1)
Tengo una base de datos de Firebase conectada a mi aplicación IOS con GoogleService-Info.plist. En AppDelegate configuré la aplicación FIRApp.configure (). Pude leer / escribir datos.
Ahora, desde esta aplicación IOS, me gustaría acceder a otra base de datos de brevCustomer
. Por alguna razón let dbRef
de viewDidLoad
tiene una bandera en Xcode que dice que este ''valor dbRef
nunca se usó'' y la aplicación se cuelga en la primera línea en funcion startObserving () dbRef.observe(.value, with: { (snapshot: FIRDataSnapshot) in
.
¿Alguien podría mostrar cómo hacer la configuración para que pueda leer / escribir en la base de datos brevCustomer?
EDITAR
Por favor considere la siguiente situación:
Tengo dos aplicaciones de IOS, Cliente y Trabajador, y dos Proyectos de Firebase llamados CustomerFireBase y WorkerFirebase, y me gustaría que funcionen de la siguiente manera.
El cliente se registra con el correo electrónico y la contraseña, inicia sesión, realiza una reserva y los datos se guardan en CustomerFireBase.
- El trabajador se registra con el correo electrónico y la contraseña, registros es, observe WorkerFirebase para cambios de valor o agregado de niño
- leer de CustomerFireBase
- escribir a CustomerFireBase
- escribir a WorkerFirebase
- leer de CustomerFireBase
¿Cómo puedo conseguir esto? Básicamente, necesito obtener acceso de lectura / escritura desde una aplicación de IOS configurada de la manera habitual con Firebase, a otra base de datos de Firebase contenida en otro proyecto de 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
Respondiendo la pregunta y comentarios.
Como sabe, cuando un usuario se registra en Firebase, se crea una cuenta de usuario en el servidor de Firebase y se le proporciona al usuario una identificación de usuario (uid).
Un patrón de diseño típico es tener un nodo / users en Firebase que almacene otra información sobre el usuario, como un apodo, dirección o número de teléfono.
Podemos aprovechar ese nodo / users para indicar también qué tipo de usuario es; Trabajador o cliente, que se relacionaría con el resto de la aplicación y Firebase para que puedan obtener los datos correctos.
Por ejemplo
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"
Como puede ver, John, George y Ringo son todos trabajadores y Paul es un cliente.
Cuando el usuario inicia sesión, la función de inicio de sesión de Firebase devolverá los datos de autenticación del usuario, que contiene el uid.
Auth.auth().signIn(withEmail: "[email protected]", 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
}
})
Si los datos de la aplicación se dividen así
app
client_data
...
worker_data
...
Se podría configurar una regla simple que verifique que los usuarios user_type sea Worker para el nodo worker_data y Client para el nodo client_data. Aquí hay un pseudo ejemplo que permitirá a un usuario del Cliente acceder solo a los datos en el nodo client_data (conceptual)
rules
client_data
$user_id
".read": "auth != null && root.child(users)
.child($user_id)
.child("user_type") == ''Client''"