私は、既存の解析ユーザーを Facebook にリンクするために多くのことを試みました。
Swift3を使用しています。
しかし、私は解決策を見つけることができません
私のステータスは
私はすでに Facebook にリンクされていないアカウントを持っています。
facebookUtils 経由でアカウントをリンクしたい
私のアプリには「サインインまたはFacebookにサインアップ」ボタンがあります
以下のように動作します
私の問題は
- Facebookのログインボタンをタップしてもログインできませんでした。それは私が PFUser.current() を持っていないことを意味します
これが私がやろうとしていることです
facebookGraph API を介してメール アドレスを取得し、メールのクエリを介して isUser かどうかを確認します
私はこのようにログインしようとしました
試す!PFUser.logIn(withUsername: userObj.username!、パスワード: userObj.password!)
しかし、パスワードを取得できないため、機能していません。それは常にnilを返しました
1つのクエリ結果を介して取得したPFUserオブジェクトをリンクしようとしました
私もこのようなクラウド機能を試しました
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()
}
}
}
})
//
})
}