web-dev-qa-db-ja.com

Facebook SDKサインインSwift 3 iOS 10

FacebookのSwift SDKをCocoapods経由でインストールしました:

pod 'FacebookCore', :git => "https://github.com/facebook/facebook-sdk-Swift"
pod 'FacebookLogin', :git => "https://github.com/facebook/facebook-sdk-Swift"

FacebookのSwift SDK( https://developers.facebook.com/docs/Swift/login )からのログイン手順に従いましたが、機能しません。

View Controllerの内部には次のものがあります。

@objc fileprivate func facebookSignIn() {
    let loginManager = LoginManager()
    print("LOGIN MANAGER: \(loginManager)")
    loginManager.logIn([ .publicProfile, .email ], viewController: self) { loginResult in
        print("LOGIN RESULT! \(loginResult)")
        switch loginResult {
        case .failed(let error):
            print("FACEBOOK LOGIN FAILED: \(error)")
        case .cancelled:
            print("User cancelled login.")
        case .success(let grantedPermissions, let declinedPermissions, let accessToken):
            print("Logged in!")
            print("GRANTED PERMISSIONS: \(grantedPermissions)")
            print("DECLINED PERMISSIONS: \(declinedPermissions)")
            print("ACCESS TOKEN \(accessToken)")
        }
    }
}

「ログインマネージャー:など」ボタンをクリックするとWebビューが開き、印刷されます。 Facebook経由でサインインすると、Webビューが空白になり、何も起こりません。 Facebookアプリにアプリが表示されるため、承認が行われましたが、Webビューで[完了]ボタンをクリックすると、コールバックの結果は.cancelledおよび「ユーザーがログインをキャンセルしました。」印刷されます。

キーチェーン共有を資格に追加し、info.plistを更新しました。

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string> [ FB STRING ] </string>
        </array>
    </dict>
</array>
<key>FacebookAppID</key>
<string>[ APP ID ]</string>
<key>FacebookDisplayName</key>
<string>[ APP NAME ]</string>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>

NSAppTransportSecurity設定も変更しました。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

これが iOS 9 Facebookログインシミュレーター-canOpenURL:URLの失敗: "fbauth2:///"-エラー: "(null)" および Facebookの使用方法iOS 10上のiOS SDK しかし、私が何かを見逃していない限り、そこにある解決策はどれもうまくいかないようです?どんな提案も大歓迎です。

いくつかのエラーも出力されます:

[App] if we're in the real pre-commit handler we can't actually add any new fences due to CA restriction


[error] error: (6922) I/O error for database at /var/mobile/Containers/Data/Application/F3D8E126-B0CC-4C06-81A5-D7A7F849B3BD/Documents/OfflineModel2.sqlite.  SQLite error code:6922, 'disk I/O error'

デバイスにFBアプリがインストールされていない場合、次のメッセージが表示されます。

-canOpenURL: failed for URL: "fbauth2:/" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"
10
robertbabington

Didfinishlaunchingおよびopenurl AppDelegateメソッドを以下に置き換える必要があります。

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

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

SwiftおよびSwift 4

これをAppDelegate.Swiftに追加します

import FBSDKCoreKit
import FBSDKLoginKit

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
   return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
   return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)
}
21
Pan Mluvčí

FBSDKライブラリは非推奨です。新しいライブラリは FacebookのGithubリポジトリ にあります。

この特定のエラーについては、次のアプリケーションメソッドを実装します。

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return SDKApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}

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

}
9
Thomas Oropeza

Swift 3.0

appDelete.Swiftで:

import FBSDKCoreKit
import FBSDKLoginKit

あなたの中に:

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

追加:

FBSDKApplicationDelegate .sharedInstance() .application(application, didFinishLaunchingWithOptions: launchOptions)

次に、次のように新しいfuncを作成します。

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)
}
5
David Sanford

ココアポッド in Swift 3.を使用

ココアポッドをインストールする

pod 'FacebookCore'
pod 'FacebookLogin'

appDelegate.Swiftで

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

およびwritedown Callbackメソッド

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, open: url as URL!, sourceApplication: sourceApplication, annotation: annotation)return FBSDKApplicationDelegate.sharedInstance().application(application, open: url as URL!, sourceApplication: sourceApplication, annotation: annotation)
}

あなたのviewControllerで

import FacebookCore
import FacebookLogin
import FBSDKLoginKit

その後、fbloginボタンにこのコードを書き留めます

@IBAction func faceBookLoginBtnAction(_ sender: Any) {
    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
    fbLoginManager.logIn(withReadPermissions: ["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){
                                self.dict = result as! [String : AnyObject]
                                print(result!)
                                print(self.dict)
                            }
                        })
                    }   
                }
            }
        }
    }
}

もう1つ重要なことは、facebookidをプロジェクトに追加する[プロジェクト]> [ターゲット]> [情報]> [URLタイプ]セクションで、適切なFacebook IDとURLスキームを設定することです。

2
User558

アプリケーションでFacebookログインを使用するには、まずアプリケーションを作成する必要があります。 here からFacebookでアプリを作成できます

URL typesFacebookAppIDFacebookDisplayName、およびLSApplicationQueriesSchemesinfo.plistに設定する必要があります。

  1. Facebookログインフレームワークを手動で追加するか、次のようにココアポッドを使用できます...

     pod 'FacebookCore' //latest one
     pod 'FacebookLogin' // for fb login
     pod 'FacebookShare' //for sharing on fb
    

    次にpod installコマンドを使用して、アプリケーションのポッドをインストールします。

  2. Facebookログインを使用するアプリケーションデリゲートのimport FacebookCore

  3. AppDelegate.Swiftファイルに次のものを設定します。

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
      return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    
       if url.absoluteString.contains(<Your FBAppID>) {
          return SDKApplicationDelegate.shared.application(app, open: url, options: options)
        } else {
           debugPrint("Error in openURL from AppDelegate Facebook Sign in")
        }
    
        return true
    
     }
    

これで、アプリへのFacebookログインが正常に構成されました。

View Controllerで、次のことを行う必要があります。

import FacebookLoginKit

IBActionメソッドで次を実行します。

@IBAction func btnFacebookSignInTapped(_ sender: UIButton) {

    let fbManager = FBSDKLoginManager()
    fbManager.logIn(withReadPermissions: ["public_profile", "email"], from: self) { (result, error) in

        if let loginResult = result, error == nil {

            if let permissions = loginResult.grantedPermissions {

                if permissions.contains("email") || permissions.contains("public_profile")  {

                    if FBSDKAccessToken.current() != nil {

                        FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email"]).start(completionHandler: { (connection, graphResult, error) in

                            if error == nil {
                                debugPrint("Result: \(graphResult!)")
                                if let data = graphResult as? [String: Any] {
                                    print("User details from FB: \(data)")
                                }
                            }
                        })

                    } else {
                        print("Invalid FB access token");
                    }
                }

            } else {
                print("Fail to login using facebook.")
            }

        } else {
            print("Error in facebook login")
        }
    }
}

そうすることで、Facebookにログインできるようになります。

1
Mahendra

ここの回答では、次のapplication(_,didFinishLaunchingWithOptions:)の実装を使用することをお勧めします。

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

ただし、 公式ドキュメント は戻り値を使用しないことに注意してください

_SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
_

application(_,didFinishLaunchingWithOptions:)の戻り値として。

これは重要ではないように思えるかもしれませんが、facebook SDKとブランチディープリンクを統合するときに大きな問題が発生しました。まさにこの行が問題を引き起こすからです。したがって、不要な問題を後で防止する場合は、次の解決策を使用してください。

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

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

Swift 3の場合:

// AppDelegate()で:

// ステップ1:

import FacebookCore

//ステップ-2:didFinishLaunchingWithOptions()内

 // FB Settings
 SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)

//インスタンスMethod():

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

    print("URL AbsoluteString = \(url.absoluteString)")

   if url.absoluteString.contains("fb1279300242197274") {
        return SDKApplicationDelegate.shared.application(app,
                                                         open: url,
                                                         options: options)

    }
    else {
        //return PDKClient.sharedInstance().handleCallbackURL(url)
        print("Error while open URL from app delegate facebook sign in")
    }

    return true
}
0
Kiran jadhav

他の方法。この動画がお役に立てば幸いです https://youtu.be/bOS4jqRc8Io

このビデオの内容:Swift lastest 2018 Xcode new project setup Swift FacebookアプリでのiOSアプリログインチュートリアルiOSアプリでのFacebookログイン機能Facebookの追加to Swift iOSアプリFacebookアプリでのiOSログイン

手順:1.新しいシンプルなSwift Xcodeプロジェクト2を作成します。facebook開発ページにログインして同じ名前のAPPを作成します。 、C用のブリッジングヘッダーの作成、AppDelegateの構成、5-アプリケーションの実行とシミュレーターでのテスト

0
David Ta