Swift 项目的 Facebook 登录
Facebook login for Swift project
我正在提示我的用户通过 Facebook 登录以获取应用程序个人资料的个人资料图片。这是我请求 Facebook 登录的代码:
func facebookSignIn() {
//Current user that's logged in from sign up view
let currUser = PFUser.currentUser()
//Create a Facebook session
FBSession.openActiveSessionWithReadPermissions(permission, allowLoginUI: true, completionHandler: {
(session, status, error) -> Void in
FBRequestConnection.startForMeWithCompletionHandler {(connection, result, error) -> Void in
if error == nil {
if result != nil && result.objectID != nil {
//Create a column in Parse called "facebookID"
currUser!.setObject(result.objectID as String, forKey: "facebookID")
currUser!.saveInBackground()
}
}
}
}
在我将应用程序从开发模式切换到 Public 之前它运行良好。现在,每次我单击 "Sign in on Facebook" 按钮时,它都会带我到带有 Facebook 页面的 Safari 并显示 "Error. Not logged in: You are not logged in. Please login and try again"
有人知道这个问题是什么吗?登录页面不再提示。
也许您应该阅读有关 FBSDKLoginButton
here 的内容,因为当您想在您的应用程序中使用 Facebook 登录时,Facebook 会告诉您使用它,而不是 openActiveSessionWithReadPermissions
我看到您正在尝试使用 Facebook 和 Parse iOS SDK 实现 Facebook 登录。我不确定您是否真的有必要使用 FBSession 和 FBRequestConnection 进行登录。实际上有两种方法可以去。第一个是简单地使用 Parse Facebook Utils 来处理登录。或者您可以通过 Facebook iOS SDK 实现登录。您可以在下面找到第二个选项的代码以及用户注册。
override func viewDidLoad(){
FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "fb:", name: FBSDKProfileDidChangeNotification, object: nil) // hi! we have logged in! so we can get profile picture in "fb" function (since FBSDKProfile.currentProfile() which we loaded asynchronously is now fully downloaded)
}
@IBAction func loginWithFacebook(sender: AnyObject) { // button for login
let fbLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = FBSDKLoginBehavior.Web
fbLoginManager.logInWithReadPermissions(["email", "public_profile", "user_friends"], handler: {
(result: FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
if error == nil && result.token != nil {
// logged in
} else {
// process error
}
})
}
func fb(notif:NSNotification){ // access token has changed! We have logged in or logged out
if FBSDKAccessToken.currentAccessToken() != nil { // Are we logged in?
PFFacebookUtils.logInInBackgroundWithAccessToken(FBSDKAccessToken.currentAccessToken(), block: { // Let`s login the fb user with parse (using acquired fb access token)
(user: PFUser?, error: NSError?) -> Void in
if let user = user {
if user.isNew { // user is new? Then let`s register in Parse
let smallProfileImage = FBSDKProfile.currentProfile().imagePathForPictureMode(FBSDKProfilePictureMode.Normal, size: CGSizeMake(100, 100)) // // get user profile picture in a small size
let bigProfileImage = FBSDKProfile.currentProfile().imagePathForPictureMode(FBSDKProfilePictureMode.Normal, size: CGSizeMake(600, 600)) // get user profile picture in a big size
user.setObject("https://graph.facebook.com/\(smallProfileImage)", forKey: "smallProfileImage") // set user`s small image (link)
user.setObject("https://graph.facebook.com/\(bigProfileImage)", forKey: "bigProfileImage") // set user`s small image (link)
PFFacebookUtils.linkUserInBackground(user, withAccessToken: FBSDKAccessToken.currentAccessToken()) // save the user in Parse
}
} else {
print("Uh oh. There was an error logging in.")
}
})
}
}
UPDATE: 看来我已经想通了。转到 Facebook dev portal page 并选择您的应用。在左侧面板上,select "settings"。检查所有应用程序信息,尤其是 "Bundle ID"(如果正确,请将其替换为另一个,保存设置,然后将正确的信息放回原处)。如果问题仍然存在,请转到您的 Facebook 应用主页并阅读 "Get Started with the Facebook SDK" 指南(并在出现提示时检查包标识符是否正确)。此外,在 "Client OAuth Settings"(顶部的高级选项卡)中,我唯一启用的是 Client OAuth Login
我正在提示我的用户通过 Facebook 登录以获取应用程序个人资料的个人资料图片。这是我请求 Facebook 登录的代码:
func facebookSignIn() {
//Current user that's logged in from sign up view
let currUser = PFUser.currentUser()
//Create a Facebook session
FBSession.openActiveSessionWithReadPermissions(permission, allowLoginUI: true, completionHandler: {
(session, status, error) -> Void in
FBRequestConnection.startForMeWithCompletionHandler {(connection, result, error) -> Void in
if error == nil {
if result != nil && result.objectID != nil {
//Create a column in Parse called "facebookID"
currUser!.setObject(result.objectID as String, forKey: "facebookID")
currUser!.saveInBackground()
}
}
}
}
在我将应用程序从开发模式切换到 Public 之前它运行良好。现在,每次我单击 "Sign in on Facebook" 按钮时,它都会带我到带有 Facebook 页面的 Safari 并显示 "Error. Not logged in: You are not logged in. Please login and try again"
有人知道这个问题是什么吗?登录页面不再提示。
也许您应该阅读有关 FBSDKLoginButton
here 的内容,因为当您想在您的应用程序中使用 Facebook 登录时,Facebook 会告诉您使用它,而不是 openActiveSessionWithReadPermissions
我看到您正在尝试使用 Facebook 和 Parse iOS SDK 实现 Facebook 登录。我不确定您是否真的有必要使用 FBSession 和 FBRequestConnection 进行登录。实际上有两种方法可以去。第一个是简单地使用 Parse Facebook Utils 来处理登录。或者您可以通过 Facebook iOS SDK 实现登录。您可以在下面找到第二个选项的代码以及用户注册。
override func viewDidLoad(){
FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "fb:", name: FBSDKProfileDidChangeNotification, object: nil) // hi! we have logged in! so we can get profile picture in "fb" function (since FBSDKProfile.currentProfile() which we loaded asynchronously is now fully downloaded)
}
@IBAction func loginWithFacebook(sender: AnyObject) { // button for login
let fbLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = FBSDKLoginBehavior.Web
fbLoginManager.logInWithReadPermissions(["email", "public_profile", "user_friends"], handler: {
(result: FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
if error == nil && result.token != nil {
// logged in
} else {
// process error
}
})
}
func fb(notif:NSNotification){ // access token has changed! We have logged in or logged out
if FBSDKAccessToken.currentAccessToken() != nil { // Are we logged in?
PFFacebookUtils.logInInBackgroundWithAccessToken(FBSDKAccessToken.currentAccessToken(), block: { // Let`s login the fb user with parse (using acquired fb access token)
(user: PFUser?, error: NSError?) -> Void in
if let user = user {
if user.isNew { // user is new? Then let`s register in Parse
let smallProfileImage = FBSDKProfile.currentProfile().imagePathForPictureMode(FBSDKProfilePictureMode.Normal, size: CGSizeMake(100, 100)) // // get user profile picture in a small size
let bigProfileImage = FBSDKProfile.currentProfile().imagePathForPictureMode(FBSDKProfilePictureMode.Normal, size: CGSizeMake(600, 600)) // get user profile picture in a big size
user.setObject("https://graph.facebook.com/\(smallProfileImage)", forKey: "smallProfileImage") // set user`s small image (link)
user.setObject("https://graph.facebook.com/\(bigProfileImage)", forKey: "bigProfileImage") // set user`s small image (link)
PFFacebookUtils.linkUserInBackground(user, withAccessToken: FBSDKAccessToken.currentAccessToken()) // save the user in Parse
}
} else {
print("Uh oh. There was an error logging in.")
}
})
}
}
UPDATE: 看来我已经想通了。转到 Facebook dev portal page 并选择您的应用。在左侧面板上,select "settings"。检查所有应用程序信息,尤其是 "Bundle ID"(如果正确,请将其替换为另一个,保存设置,然后将正确的信息放回原处)。如果问题仍然存在,请转到您的 Facebook 应用主页并阅读 "Get Started with the Facebook SDK" 指南(并在出现提示时检查包标识符是否正确)。此外,在 "Client OAuth Settings"(顶部的高级选项卡)中,我唯一启用的是 Client OAuth Login