2017-08-12 12 views
0

私のXcodeプロジェクトには、すでに作成したユーザーのユーザー名とパスワードを使用するサインイン機能があります。今、私はFacebookのログインをプロジェクトに統合したいと思っていますが、これをどうやって行うのか完全にはわかりません。誰かが彼らの方法でアカウントを作ったときには、ユーザー名とパスワードを作成して保存し、再びサインインしたいときはいつでもPFUser.logIn(withUsername: ..., password: ...)で使用できます。FacebookのログインとParse Swiftの統合3

しかし、Facebookでは、自分のアカウントを保存するためにどのような固有の識別子を使用するか分かりません。私は抽出できるFacebookのIDがあることを知っていますが、これを取得した後にユーザーにログインするにはどうすればよいですか?私が前に言ったように、私は現在PFUser.logIn(withUsername: ..., password: ...)を使ってユーザーをログインさせています。そのユーザーに関連するすべてのデータを取得するには、PFUser.current()?.usernameを使用してください。 PFFacebookUtils.logInInBackgroundを使っていると聞いていましたが、すでに実装しようとしていましたが、「Facebookボタンを押し続ける」ボタンを押すと、アプリがクラッシュします(スクリーンショットのエラーと下部に配置されました)。私はこれまでに持っていたコードをコピーしました。 FacebookのユーザーIDを保存するFacebook機能とサインアップを統合するにはどうすればいいですか?ユーザーにログインする際にはどの方法を使用しますか(すなわちPFFacebookUtils.logInInBackground)?ここは、これまでに私のコードです:

@IBOutlet var facebookSignUpButton: FBSDKLoginButton! 
    var fullnameFB = String() 
    var idFB = String() 
    var emailFB = String() 
    var isFBSignUp = Bool() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     signUpWithFacebook() 
    } 
    func signUpWithFacebook() { 
     facebookSignUpButton.readPermissions = ["email", "public_profile"] 
     facebookSignUpButton.delegate = self 
     self.view.addSubview(facebookSignUpButton) 

    } 
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { 
     if error != nil { //if theres an error 
      print(error) 
     } else if result.isCancelled { // if user cancels the sign up request 
      print("user cancelled login") 
     } else { 
      PFFacebookUtils.logInInBackground(with: result!.token!) { (user, error) in 
       if error == nil { 

       if let user = user { 

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

        if result.grantedPermissions.contains("email") { 
         if let graphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "email, name"]) { 
          graphRequest.start(completionHandler: { (connection, result, error) in 
           if error != nil { 
            print(error?.localizedDescription ?? String()) 
           } else { 
            if let userDetails = result as? [String: String]{ 
             print(userDetails) 
             self.fullnameFB = userDetails["name"]! 
             self.idFB = userDetails["id"]! 
             self.emailFB = userDetails["email"]! 
             self.isFBSignUp = true 
            } 
           } 
          }) 
         } 
        } else { 
         print("didnt get email") 
         self.createAlert(title: "Facebook Sign Up", message: "To signup with Facebook, we need your email address") 
        } 

       } else { 
        print("Error while trying to login using Facebook: \(error?.localizedDescription ?? "---")") 
       } 
       } else { 
        print(error?.localizedDescription ?? String()) 
       } 
      } 
     } 
    } 

コンソール出力:

2017年8月12日14:14:33.223472から0700プロジェクト[2423:10] ***キャッチされない例外によりにアプリを終了します'NSInternalInconsistencyException'、理由:

***まずスローコールスタック 'あなたは+ initializeFacebookWithApplicationLaunchOptionsを呼び出してPFFacebookUtilsを初期化する必要があります': (0x188042fe0 0x186aa4538 0x188042f28 0x100b8f934 0x100b90020 0x100b9032c 0x10019eee8 0x1001a0a64 0x100867598 0X 10086e998 0x10086e4f0 0x100871a94 0x18b3610d4 0x101521a10 0x101526b78 0x187ff10c8 0x187feece4 0x187f1eda4 0x189989074 0x18e1dd364 0x1001ec288 0x186f2d59c) のlibC++ abi.dylib:ドキュメントに記載されているようにタイプNSException (lldb)

+0

アプリがクラッシュしたらログ出力を投稿できますか? 'PFFacebookUtils.logInInBackground'が動作するので、別の問題があるはずです。 – nathan

+0

さて、私はエラーのある投稿を編集しました。 – fphelp

+0

私はコンソール出力を意味しました(画像ではなくテキストとして)。これはXcodeの例外ブレークポイントです。 – nathan

答えて

0

のキャッチされない例外で終了し、あなたはPFFacebookUtilsを初期化する必要がありますそのように、それを使用する前に:

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

    // CODE... 

    PFFacebookUtils.initializeFacebook(applicationLaunchOptions: launchOptions) 
} 

重要:は、解析のセットアップParse.initialize...)の後に行う必要があります。

+0

うわー、それは今働いた! **ユーザーが自分のアカウントで物事を取得したいときに私は何を保存するのですか?**たとえば、ユーザーが通常の方法でサインアップした場合、私はそのユーザー名を使用して保存します。 – fphelp

+0

何もありません。 ParseのUserテーブルのユーザ行は、 'PFFacebookUtils'によって作成されます。 'PFFacebookUtils.logInInBackground'は初めてのユーザ(サインアップ)や既存のユーザ(ログイン)を扱います。 – nathan

+0

ああ、私はそれが私のUserクラスに新しい行を追加したことを理解しています。しかし、彼らは自動的にusername列にランダムな文字列を埋め込み、名前と電子メールの文字列は空になります。私はすでに自分のFacebookアカウントからユーザー名とメールアドレスを抽出しているので、最初に登録したときに自動的にそれらの列にそれらの名前を入れる方法はありますか?また、Facebookが割り当てたランダムなユーザー名を変更できるように、ユーザーがサインインしていることを初めて確認するにはどうすればいいですか?** – fphelp

関連する問題