Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义Facebook登录按钮-集成后_Ios_Swift_Facebook - Fatal编程技术网

Ios 自定义Facebook登录按钮-集成后

Ios 自定义Facebook登录按钮-集成后,ios,swift,facebook,Ios,Swift,Facebook,我正在尝试自定义Facebook登录按钮后,以下。一切都集成正确,我可以登录到Facebook,并顺利注销 现在,我的下一个目标是使屏幕看起来像我的模型,这包括将登录按钮正确放置在故事板上,但唯一的问题是它不会显示在故事板上,它只是在我运行模拟时出现。我查看了其他溢出问题的答案,但它们并没有真正起到帮助作用,因为它们面向的是早期版本的swift/Xcode,并且没有按照评论所说的那样工作。我的代码与指南完全相同,因为这是我尝试实现的第一个屏幕 非常感谢您的帮助。欢迎来到StackOverflow

我正在尝试自定义Facebook登录按钮后,以下。一切都集成正确,我可以登录到Facebook,并顺利注销

现在,我的下一个目标是使屏幕看起来像我的模型,这包括将登录按钮正确放置在故事板上,但唯一的问题是它不会显示在故事板上,它只是在我运行模拟时出现。我查看了其他溢出问题的答案,但它们并没有真正起到帮助作用,因为它们面向的是早期版本的swift/Xcode,并且没有按照评论所说的那样工作。我的代码与指南完全相同,因为这是我尝试实现的第一个屏幕


非常感谢您的帮助。

欢迎来到StackOverflow,Shika!该教程向您展示了如何添加Facebook作为SDK一部分提供的按钮。本教程告诉您将按钮置于设备屏幕中央。如果你愿意,Facebook允许你创建自己的按钮。在我看来,我更喜欢它,因为你可以在情节提要中使用它,而不是在Swift中以编程方式创建的按钮。您可以使用Facebook文档并向下滚动至“自定义登录按钮”。你的代码会改变,但不会改变太多!如果选择此路线,请确保删除复制和粘贴的代码,以添加位于viewDidLoad中的按钮。此外,您还可以删除您在Swift文件顶部添加的FBSDKloginButtoneLegate。

如果您想使用自定义facebook SDK按钮,您可以在情节提要中创建任何自定义按钮,并在viewcontroller中提供如下操作

顶端导入

import FBSDKCoreKit
import FBSDKLoginKit
Swift 3:

  @IBAction func loginFacebookAction(sender: AnyObject) {//action of the custom button in the storyboard
    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
    fbLoginManager.logIn(withReadPermissions: ["email"], from: self) { (result, error) -> Void in
      if (error == nil){
        let fbloginresult : FBSDKLoginManagerLoginResult = result!
        // if user cancel the login 
        if (result?.isCancelled)!{
                return
        }
        if(fbloginresult.grantedPermissions.contains("email"))
        {
          self.getFBUserData()
        }
      }
    }
  }

  func getFBUserData(){
    if((FBSDKAccessToken.current()) != nil){
      FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
        if (error == nil){
          //everything works print the user data
          print(result)
        }
      })
    }
  }
较旧的Swift版本:

 @IBAction func loginFacebookAction(sender: AnyObject) {//action of the custom button in the storyboard
        let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
        fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self) { (result, error) -> Void in
            if (error == nil){
                let fbloginresult : FBSDKLoginManagerLoginResult = result
                if(fbloginresult.grantedPermissions.contains("email"))
                {
                    self.getFBUserData()
                }
            }
        }
    }

    func getFBUserData(){
        if((FBSDKAccessToken.currentAccessToken()) != nil){
            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).startWithCompletionHandler({ (connection, result, error) -> Void in
                if (error == nil){
                    //everything works print the user data
                    print(result)
                }
            })
        }
    }


如果您想要默认facebook登录按钮,您可以在Identity Inspector中查看并设置自定义类**部分的Class*字段,我们必须设置
FBLoginValue

参考:默认SDK登录按钮教程:

参考:参数和更多信息的自定义SDK登录按钮:

POD安装

AppDelegate.swift

ViewController.swift

Info.plist

Info.plist-->右键单击->OpenAs-->源代码-->添加

<key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>YOUR APP ID</string>
            </array>
        </dict>
    </array>
    <key>FacebookAppID</key>
    <string>YOUR APP ID</string>
    <key>FacebookDisplayName</key>
    <string>YOUR APP NAME</string>
CbundleUrlTypes
循环流化床锅炉方案
你的应用程序ID
FacebookAppID
你的应用程序ID
FacebookDisplayName
你的应用程序名称
@iAction func buttonLogin(u发件人:任意){


如果你能通过
我的模型
提供你想要实现的东西,那就好了。唯一的问题是它在obj-c中:(.但非常感谢您提供了此资源,我想我会尝试转换它。因此我添加了此资源,并尝试将其连接到按钮,但现在我得到了一个未声明类型的se“loginFacebookAction”"错误。有没有想过为什么会出现这种情况?那么,当您尝试将IBAction连接到UIButton时,您会遇到此错误?也许我当时试图错误地添加按钮?我已经像您一样将其添加到故事板中,但当我尝试将其放入我的//MARK:Actions时,通过控件将其拖动到视图控制器中,就像每个指南告诉我的那样到目前为止,它发出了错误。我将它的类设置为LoginFaceBokaAction,但这也没有解决问题:(.这是我第一次用swift编码,所以我有点迷茫。我知道我做错了什么。我试图创建另一个按钮,但它被嵌套在按钮内,所以我删除了您提供的iAction,创建了我自己的,并将您的iAction代码放入其中,现在它可以工作了。所以我只是装傻了,用正确。它现在工作得很好,非常感谢。如果用户“取消”,此方法将使应用程序崩溃ed login.hello,我如何观察用户是否在注册前注册?例如,如果用户是新用户,我应该设置一些信息。如果用户不是新用户,我只需要转到另一个视图控制器。请您再解释一下您的问题好吗?此代码用于Facebook登录并获取用户电子邮件、访问令牌、id、此代码的名称很好您保存了mE
import FacebookLogin
import FBSDKLoginKit
import FacebookCore

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    return true
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}
import UIKit
import FacebookLogin
import FBSDKLoginKit
import FacebookCore

class ViewController: UIViewController {

override func viewDidLoad() {
    if(FBSDKAccessToken.current() == nil){
        print("Not logged in ")
    }else{
        print("Logged in already")
        getFacebookUserInfo()
    }
}

@IBAction func CustomButton_Click(_ sender: Any) {
    getFacebookUserInfo()
}

func getFacebookUserInfo(){
    let loginManager = LoginManager()
    loginManager.logIn([.publicProfile, .email ], viewController: self) { (result) in
        switch result{
        case .cancelled:
            print("Cancel button click")
        case .success:
            let params = ["fields" : "id, name, first_name, last_name, picture.type(large), email "]
            let graphRequest = FBSDKGraphRequest.init(graphPath: "/me", parameters: params)
            let Connection = FBSDKGraphRequestConnection()
            Connection.add(graphRequest) { (Connection, result, error) in
                let info = result as! [String : AnyObject]
                print(info["name"] as! String)
            }
            Connection.start()
        default:
            print("??")
        }
    }
}
}
<key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>YOUR APP ID</string>
            </array>
        </dict>
    </array>
    <key>FacebookAppID</key>
    <string>YOUR APP ID</string>
    <key>FacebookDisplayName</key>
    <string>YOUR APP NAME</string>
    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()

    fbLoginManager.logIn(withReadPermissions: ["public_profile","email"], from: self) { (result, error) in

        if (error == nil){
            let fbloginresult : FBSDKLoginManagerLoginResult = result!
            if fbloginresult.grantedPermissions != nil {
                if(fbloginresult.grantedPermissions.contains("email")) {
                    if((FBSDKAccessToken.current()) != nil){
                        FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
                            if (error == nil){
                               let dict: 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 = dict.object(forKey:"name") as! NSString? {
                                    print("user: \(user)")
                                }
                                if let id : NSString = dict.object(forKey:"id") as? NSString {
                                    print("id: \(id)")
                                }
                                if let email : NSString = (result! as AnyObject).value(forKey: "email") as? NSString {
                                    print("email: \(email)")
                                }
                            }
                        })
                    }
                }
            }
        }
    }
 }