1

私は、既存の解析ユーザーを Facebook にリンクするために多くのことを試みました。

Swift3を使用しています。

しかし、私は解決策を見つけることができません

私のステータスは

  1. 私はすでに Facebook にリンクされていないアカウントを持っています。

  2. facebookUtils 経由でアカウントをリンクしたい

  3. 私のアプリには「サインインまたはFacebookにサインアップ」ボタンがあります

  4. 以下のように動作します

私の問題は

  1. Facebookのログインボタンをタップしてもログインできませんでした。それは私が PFUser.current() を持っていないことを意味します

これが私がやろうとしていることです

  1. facebookGraph API を介してメール アドレスを取得し、メールのクエリを介して isUser かどうかを確認します

  2. 私はこのようにログインしようとしました

試す!PFUser.logIn(withUsername: userObj.username!、パスワード: userObj.password!)

しかし、パスワードを取得できないため、機能していません。それは常にnilを返しました

  1. 1つのクエリ結果を介して取得したPFUserオブジェクトをリンクしようとしました

  2. 私もこのようなクラウド機能を試しました

Parse.Cloud.define("fblink", function(リクエスト, レスポンス) {

var query = new Parse.Query(Parse.User);
query.equalTo("username", request.params.username);

query.first({
  success: function(object) {

       if (!Parse.FacebookUtils.isLinked(object)) {
              Parse.FacebookUtils.link(object, null, {
                success: function(user) {
                  alert("Woohoo, user logged in with Facebook!");
                    response.success(true);   
                },
                error: function(user, error) {
                  alert("User cancelled the Facebook login or did not fully authorize.");
                    response.success(false);   
                }
              });
            }
  },
  error: function(error) {
    console.log("Error: " + error.code + " " + error.message);
  }
});

});

しかし、それは機能していません...この場合、クラウド機能のアプローチは解決策ではないと思います。

既存のユーザーを Facebook authdata にマージすることに関連する多くの質問を見つけました。しかし、解決策が見つかりません。

私は一緒に良い方法を見つけることを願っています。

func fbBtnTapped() {

        //Show Activity indicator
        let spiningActivity = MBProgressHUD.showAdded(to: self.view, animated: true)
        spiningActivity?.labelText = "Loading"
        spiningActivity?.detailsLabelText = "Please Wait"


        let permissions = ["public_profile", "email"]


        PFFacebookUtils.logInInBackground(withReadPermissions: permissions, block: {(user:PFUser?, error:Error?) -> Void in

            if let user = user {
                if user.isNew {
                    print("User signed up and logged in through Facebook!")

                } else {
                    print("User logged in through Facebook!")
                }
            } else {
                print("Uh oh. The user cancelled the Facebook login.")

            }


            if(error != nil)
            {
                spiningActivity?.hide(true)

                print("in FBBUTTONTapped Error")
                // display an error message
                let userMessage = error!.localizedDescription
                let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert)

                let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)

                myAlert.addAction(okAction)

                self.present(myAlert, animated: true, completion: nil)
                return
            }

            // Load facebook details like userName, email address, profile picture.
            self.loadFacebookUserDetails()


        })



    }

これは、loadFacebookUserDetails で試したものです。

func loadFacebookUserDetails()
    {
        MBProgressHUD.hideAllHUDs(for: self.view, animated: true)

        //Show Activity indicator
        let spiningActivity = MBProgressHUD.showAdded(to: self.view, animated: true)
        spiningActivity?.labelText = "Loading"
        spiningActivity?.detailsLabelText = "Wait"


        //Define fields we would like to read from Facebook User Object
        let requestParameters = ["fields": "id, email, first_name, last_name"]
        // me
        let userDetails : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: requestParameters)

        userDetails.start(completionHandler: { (connection, result, error) -> Void in

            if error != nil {


                print("in FBDetailed Error")
                //Display error message
                spiningActivity?.hide(true)

                let userMessage = error!.localizedDescription
                let myAlert = UIAlertController(title:"Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert)

                let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)

                myAlert.addAction(okAction)

                self.present(myAlert, animated: true, completion: nil)

                PFUser.logOut()

                return

            }

            var userId = String()
            var userName = String()
            var userEmail = String()
            var userFirstName = String()
            var userLastName = String()
            var displayName = String()

            var userObj = PFUser()

            //Extract user fields
            if let dict = result as? [String: AnyObject]
            {
                userId = dict["id"] as! String
                print("User id=\(userId)")
                userEmail = (dict["email"] as? String)!
                print("User email=\(userEmail)")

                userFirstName = dict["first_name"] as! String
                print("User FirstName=\(userFirstName)")
                userLastName = dict["last_name"] as! String
                print("User LastName=\(userLastName)")
            }

            //get Username
            if !userEmail.isEmpty
            {
                PFUser.current()?.email = userEmail
                if let range = userEmail.range(of: "@") {

                    let username = userEmail.substring(to: range.lowerBound)
                    userName = username

                    PFUser.current()?.username = username
                }
            }

            PFFacebookUtils.linkUser(inBackground: PFUser.current()!, with: FBSDKAccessToken.current())


            //Get Facebook profile picture
            let userProfile = "https://graph.facebook.com/" + userId + "/picture?type=large"

            let profilePictureUrl = URL(string:userProfile)
            let profilePictureData = try? Data(contentsOf: profilePictureUrl!)

            //Prepare PFUser object
            if(profilePictureData != nil)
            {
                let profileFileObject = PFFile(data:profilePictureData!)

                //                userObj.setObject(profileFileObject!, forKey: "profileImg")

                if (PFUser.current()?.object(forKey: "profileImg")) == nil{

                    PFUser.current()?.setObject(profileFileObject!, forKey: "profileImg")
                }
            }

            displayName=userFirstName+userLastName
            PFUser.current()?.setObject(displayName, forKey: "displayname")



            //Check If user has already signedup or not
            let query = PFQuery(className: "_User")
            query.whereKey("username", equalTo: userName)
            try! userObj = query.getFirstObject() as! PFUser

//            if userObj.username != nil {
//                
//                print("already signed up")
//                return
//            }
//            print(FBSDKAccessToken.current())



//            try! PFUser.logIn(withUsername: userObj.username!, password: userObj.password!)

            PFFacebookUtils.linkUser(inBackground: PFUser.current()!, with: FBSDKAccessToken.current())


//            userObj.setObject(displayName, forKey: "displayname")

            PFUser.current()?.saveInBackground(block: { (success:Bool, error:Error?) in
                spiningActivity?.hide(true)

                if(error != nil)
                {
                    let userMessage = error!.localizedDescription
                    let myAlert = UIAlertController(title: "Alert2", message: userMessage, preferredStyle: UIAlertControllerStyle.alert)

                    let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)

                    myAlert.addAction(okAction)

                    self.present(myAlert, animated: true, completion: nil)

                    PFUser.logOut()
                    return
                }

                if(success)
                {
                    if !userId.isEmpty
                    {
                        print(userId)
                        //userId->userName
                        UserDefaults.standard.set(userName, forKey: "username")
                        UserDefaults.standard.synchronize()

                        DispatchQueue.main.async{
                            let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate

                            appDelegate.buildUserInterface()
                        }

                    }

                }
            })
//



        })



    }
4

1 に答える 1