swift 3 Facebook 整合

swift 3 facebook integration

尝试从 swift 项目中获取 Facebook 连接。

一直在尝试关注以下 youtube 视频:https://www.youtube.com/watch?v=I6rTmfLp9aY

不幸的是,对我来说是德语。

这就是我目前所拥有的:

  1. 我的 Facebook 应用程序启用了 IOS,我在那里设置了我的 bundleID。

  2. 已下载最新的 iOS 框架并添加到项目中

我添加到 AppDelegate 文件中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FBSDKApplicationDelegate.sharedInstance()
    return true
}

func applicationDidBecomeActive(_ application: UIApplication) {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    FBSDKAppEvents.activateApp()
}

这是 ViewController 文件

import UIKit
import FBSDKCoreKit
import FBSDKLoginKit
import FBSDKShareKit




class ViewController: UIViewController, FBSDKAppInviteDialogDelegate, FBSDKLoginButtonDelegate{

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

              if (FBSDKAccessToken.current() != nil)
        {
            let content = FBSDKAppInviteContent()
            content.appLinkURL = NSURL(string: "{Facebook link to app}") as URL!
            FBSDKAppInviteDialog.show(from: self, with: content, delegate: self)
        }
        else
        {
            let loginView : FBSDKLoginButton = FBSDKLoginButton()
            self.view.addSubview(loginView)
            loginView.center = CGPoint(x: self.view.frame.midX, y: self.view.frame.midY + 100)
            loginView.readPermissions = ["public_profile", "email"]
        }


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}




func appInviteDialog (_ appInviteDialog: FBSDKAppInviteDialog!, didCompleteWithResults results: [AnyHashable : Any]!)
{

}


func appInviteDialog (_ appInviteDialog: FBSDKAppInviteDialog!, didFailWithError  error: Error!) {
    print("Error took place in appInviteDialog \(error)")
}


func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {

    if ((error) != nil)
    {
        //process error
    }
    else if result.isCancelled {
        //handle cancelation
    }
    else {

        let content = FBSDKAppInviteContent()
        content.appLinkURL = NSURL(string: "{Facebook link to app}") as URL!
        FBSDKAppInviteDialog.show(from: self, with: content, delegate: self)

        if result.grantedPermissions.contains("email")
        {
            //do work
        }
    }
}

func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {

}


}

没有错误也没有警报。当我 运行 模拟器时,我得到一个空屏幕。一定是做对了,因为我收到以下消息:

SystemGroup/systemgroup.com.apple.configurationprofiles 2017-06-04 00:42:02.351876+0300 facebook_login[4569:144075] [MC] 从私有有效用户设置中读取。

此外,如果我只是在 viewDidLoad 中粘贴以下代码行:

            let loginView : FBSDKLoginButton = FBSDKLoginButton()
            self.view.addSubview(loginView)
            loginView.center = CGPoint(x: self.view.frame.midX, y: self.view.frame.midY + 100)
            loginView.readPermissions = ["public_profile", "email"]

我在模拟器中得到一个漂亮的 Facebook 按钮,当我按下它时当然会崩溃。

任何对工作的帮助将不胜感激

Facebook 有一个 Swift SDK,您可能会发现它比 Objective-C SDK(他们称之为 iOS)更容易使用。尝试在此处查看文档:

https://developers.facebook.com/docs/swift

此外,请按照(其他)iOS SDK 中描述的步骤开始:

https://developers.facebook.com/docs/ios/getting-started/

这是我可以开始工作的最小应用程序委托(注意 Swift SDK 缺少 iOS SDK 中存在的 FB 前缀):

import UIKit
import FacebookCore

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
        SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
        return true
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        return SDKApplicationDelegate.shared.application(app, open: url, options: options)
    }

}

并确保在您的 Info.plist 中添加所有必需的密钥,否则您根本无法进行身份验证。

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith 
 result:FBSDKLoginManagerLoginResult!, error: Error!) {

if ((error) != nil) {
    // Process error
    print("Error! : \(error.localizedDescription)")
    return

} else if result.isCancelled {
    // Handle cancellations
    print("Success! : user cancel login request")
    return
} else {
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "id, email, name,picture.type(large)"])
    graphRequest.start(completionHandler: { (connection, result, error) -> Void in
        if ((error) != nil) {
            print("Error: \(error)")
        } else {
            // Do work in app.
            let dataDict:NSDictionary = result as! NSDictionary
            if let token = FBSDKAccessToken.current().tokenString {
                print("tocken: \(token)")

                let userDefult = UserDefaults.standard
                userDefult.setValue(token, forKey: "access_tocken")
                userDefult.synchronize()
            }
            if let user : NSString = dataDict.object(forKey: "name") as! NSString? {
                print("user: \(user)")
            }
            if let id : NSString = dataDict.object(forKey: "id") as? NSString {
                print("id: \(id)")
            }
            if let email : NSString = (result! as AnyObject).value(forKey: "email") as? NSString {
                print("email: \(email)")
            }

                                if let pictureData:NSDictionary = dataDict.object(forKey: "picture") as? NSDictionary{

                                    if let data:NSDictionary = pictureData.object(forKey: "data") as? NSDictionary{

                                        if let strPictureURL: String = data.object(forKey: "url") as? String{

                                            self.imageviewUser.image = UIImage(data: NSData(contentsOf: NSURL(string: strPictureURL)! as URL)! as Data)
                           }
                        }
                    }
               }
          })
      }

   }

func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) 
 {
 FBSDKAccessToken.setCurrent(nil)
 FBSDKProfile.setCurrent(nil)
 let manager = FBSDKLoginManager()
 manager.logOut()

}