1

ユーザーが自分のアプリにログインしたときに、Firebase Storageをチェックする際に問題が少しあります。ユーザがログインするとFirebaseデータベースとストレージに正常に保存されますが、ユーザがログアウトしてアプリにログインするたびに、(ファイルのURL文字列ではなく)profileImageファイルがFirebase Storageに新しい別のイメージファイル。新しいプロファイルを作成する前にFirebase Storageを確認するImage URL

ログイン時にappを使用して、profileImageファイルのFirebaseストレージを確認してください。存在する場合は、同じ画像をストレージに再作成しないでください。新しいイメージを作成するよりも、Firebaseにイメージが存在するかどうかを確認するロジックが分かります。私は構文にいくつか問題があります。事前に助けてくれてありがとう!

// login user with Facebook 
func loginWithFacebook() { 
    let accessToken = FBSDKAccessToken.current() 
    guard let accessTokenString = accessToken?.tokenString else { return } 

    let credentials = FIRFacebookAuthProvider.credential(withAccessToken: accessTokenString) 
    FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in 
     if error != nil { 
      print("Something went wrong with our FB user: ", error ?? "") 
      return 
     } 

     guard let uid = user?.uid else { 
      return 
     } 

     let imageName = NSUUID().uuidString 
     let storageRef = FIRStorage.storage().reference().child("profile_images").child("\(imageName).png") 
     let photoUrl = user?.photoURL 

     // check to see if current user already has stored image with URL 
     if FIRStorage.storage().reference().child("profile_images").child("\(imageName).png") == nil { 

      if let imageData = NSData(contentsOf: photoUrl!) { 
       storageRef.put(imageData as Data, metadata:nil) { 
        (metadata, error) in 

        if error != nil { 
         print(error!) 
         return 
        } else { 

         if let profileImageUrl = metadata?.downloadURL()?.absoluteString { 
          let values = ["name": user!.displayName!, "email": user!.email!, "profileImageUrl": profileImageUrl] 
          self.registerUserWithUID(uid: uid, values: values as [String : AnyObject]) 
         } 
        } 
       } 
      } 
     } else { 
      print("image already exists") 
     } 

     print("Successfully logged in with our user: ", user ?? "") 
     self.delegate?.finishLoggingIn() 

     }) 

private func registerUserWithUID(uid: String, values: [String: AnyObject]) { 
    // create items in database upon creating user --------------- 
    let ref = FIRDatabase.database().reference() 
    let usersReference = ref.child("users").child(uid) 
    usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in 
     if err != nil { 
      print(err!) 
      return 
     } 
     print("user has been saved to Firebase database") 
    }) 
} 

答えて

1

私は問題が "if"条件であると考えます。あなたはその場所を参照していますが、その場所の実際のデータでは確認していません。

.observerSingleEventOf()を使用して実装できます。

private func checkUser (imageName:String, _ completionHandler: @escaping(Bool) -> Void) 
    { 
    let userExists = FIRStorage.storage().reference().child("profile_images") 
    userExists.observeSingleEvent(of: .value, with:{(snapshot) in 
     if snapshot.hasChild(imageName){ 
     print ("Image already exists") 
     completionHandler(false) 
     } 
     else 
     { 
     print ("Image does not exist") 
     print ("store the image") 
     } 
    }) 
    } 

`

+0

おかげで - 理にかなっています。しかし、私はまだエラーが発生しています "タイプの値 'FIRStorageReference'のメンバーは 'observeSingleEvent'のメンバーはありません...理由についての考え? – user3708224

+0

@ user3708224申し訳ありませんがfirebaseデータベースのためだと思っています。http:// stackoverflow .com/questions/38184900/fire-base-storage-file-exists-how-do-i-detect-existsが存在します。 – vira

関連する問題