2016-10-11 9 views
0

私のアプリにFacebookのログインを実装しようとしていますが、ログインしようとするとFacebookのアプリに戻り、ゲームに戻りますが、ログインボタンはログアウトしません。アクセストークン、許可されたアクセス許可、または拒否されたアクセス許可などの情報を取得します。これは私が持っているコードです:Facebook login is swift

import Foundation 
class IntroScene: SKScene, FBSDKLoginButtonDelegate { 
let loginButton: FBSDKLoginButton = { 
    let button = FBSDKLoginButton() 
    button.readPermissions = ["email"] 
    return button 
}() 

override func didMove(to view: SKView) { 
    self.backgroundColor = UIColor.black 

    view.addSubview(loginButton) 
    loginButton.center = (self.view?.center)! 
    loginButton.delegate = self 
} 

func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { 

} 

func loginButtonWillLogin(loginButton: FBSDKLoginButton!) -> Bool { 
    return true 
} 

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { 
    if(error == nil) 
    { 
     print("login complete") 
     //print(FBSDKAccessToken.current()) -> crashes because its nil 
     //print(result.grantedPermissions) -> crashes its nil 
    } 
    else{ 
     print(error.localizedDescription) 
    } 
} 
} 

私のInfo.plistファイルには、次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>UIViewControllerBasedStatusBarAppearance</key> 
    <false/> 
    <key>LSApplicationQueriesSchemes</key> 
    <array> 
     <string>fbapi</string> 
     <string>fb-messenger-api</string> 
     <string>fbauth2</string> 
     <string>fbshareextension</string> 
    </array> 
    <key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSExceptionDomains</key> 
     <dict> 
      <key>facebook.com</key> 
      <dict> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
       <false/> 
      </dict> 
      <key>fbcdn.net</key> 
      <dict> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
       <false/> 
      </dict> 
      <key>akamaihd.net</key> 
      <dict> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
       <false/> 
      </dict> 
     </dict> 
    </dict> 
    <key>CFBundleURLTypes</key> 
    <array> 
     <dict> 
      <key>CFBundleURLSchemes</key> 
      <array> 
      <string>//fbmyid</string> 
     </array> 
    </dict> 
</array> 
<key>FacebookAppID</key> 
<string>//myid</string> 
<key>FacebookDisplayName</key> 
<string>Crazy Traffic Saga</string> 
<key>CFBundleDevelopmentRegion</key> 
<string>en</string> 
<key>CFBundleExecutable</key> 
<string>$(EXECUTABLE_NAME)</string> 
<key>CFBundleIdentifier</key> 
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> 
<key>CFBundleInfoDictionaryVersion</key> 
<string>6.0</string> 
<key>CFBundleName</key> 
<string>$(PRODUCT_NAME)</string> 
<key>CFBundlePackageType</key> 
<string>APPL</string> 
<key>CFBundleShortVersionString</key> 
<string>1.0</string> 
<key>CFBundleSignature</key> 
<string>????</string> 
<key>CFBundleVersion</key> 
<string>1</string> 
<key>LSRequiresIPhoneOS</key> 
<true/> 
<key>UILaunchStoryboardName</key> 
<string>LaunchScreen</string> 
<key>UIMainStoryboardFile</key> 
<string>Main</string> 
<key>UIRequiredDeviceCapabilities</key> 
<array> 
    <string>armv7</string> 
</array> 
<key>UISupportedInterfaceOrientations</key> 
<array> 
    <string>UIInterfaceOrientationPortrait</string> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
</array> 
<key>UISupportedInterfaceOrientations~ipad</key> 
<array> 
    <string>UIInterfaceOrientationPortrait</string> 
    <string>UIInterfaceOrientationPortraitUpsideDown</string> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
</array> 

+0

をお持ちですか? –

+0

ソリューション全体を提供するには十分ではありません。だからここにあります。試してみてください。https://edbinx.com/apple/ios/use-facebook-fbsdk-swift-cocoapods-ios-9-13369.html – Fennec

+0

Swift 3 @HimanshuMoradiyaを使用しています – toiavalle

答えて

3

ありがとう:FB Login using Swift 3 not returning any values and not get back the user to the App after successful login 私は問題を発見しました。 App Delegateに追加する必要がある関数がもう1つあります。ここで は私が

  • ダウンロードSDKを作業Facebookのログインを持って、

  • はFacebookのウェブサイトによるinfo.plistファイルを設定するプロジェクトに追加する方法です

    アプリデリゲートで
  • が追加さ:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 
    FIRApp.configure() 
    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) 
    
    return true 
    } 
    
    public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 
    
        return FBSDKApplicationDelegate.sharedInstance().application(
         app, 
         open: url as URL!, 
         sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, 
        annotation: options[UIApplicationOpenURLOptionsKey.annotation] 
    ) 
    } 
    
    public 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) 
    } 
    
  • SKSceneでは、ボタンを表示しています(ビューコントローラにもあります):

    class IntroScene: SKScene, FBSDKLoginButtonDelegate { 
        override func didMove(to view: SKView) { 
         self.backgroundColor = UIColor.black 
         let loginButton = FBSDKLoginButton() 
         loginButton.center = (self.view?.center)! 
         self.view?.addSubview(loginButton) 
         loginButton.frame = CGRect(x: 0, y: 0, width: 360, height: 60) // makes it bigger 
         loginButton.center = CGPoint(x: self.frame.midX, y: self.frame.midY + 90) 
         loginButton.delegate = self 
         loginButton.readPermissions = ["public_profile", "email"] 
         if let _ = FBSDKAccessToken.current(){ 
          //already logged in 
          fetchProfile() 
         } 
        } 
        func fetchProfile() { 
        let parameters = ["fields": "first_name, email, last_name, picture"] 
    
        FBSDKGraphRequest(graphPath: "me", parameters: parameters).start(completionHandler: { (connection, user, requestError) -> Void in 
    
         if requestError != nil { 
          print("----------ERROR-----------") 
          print(requestError) 
          return 
         } 
         let userData = user as! NSDictionary 
         let email = userData["email"] as? String 
         let firstName = userData["first_name"] as? String 
         let lastName = userData["last_name"] as? String 
         var pictureUrl = "" 
         if let picture = userData["picture"] as? NSDictionary, let data = picture["data"] as? NSDictionary, let url = data["url"] as? String { 
          pictureUrl = url 
          print(pictureUrl) 
         } 
        }) 
        } 
    
    } 
    
1

あなたAppDelegate.swift

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



func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { 
     return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) 
} 

チェックにこのコードを入れてくださいあなたのFacebookボタンのFacebookAccessToken ViewControllerをクリックします。

if FBSDKAccessToken.currentAccessToken() != nil { 
      FBSDKLoginManager().logOut() 
      return 
} 

let login:FBSDKLoginManager = FBSDKLoginManager() 
login.logInWithReadPermissions(["email"], handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in 
    if(error != nil){ 
      FBSDKLoginManager().logOut() 
    }else if(result.isCancelled){ 
      FBSDKLoginManager().logOut() 
    }else{ 
       //Handle login success 
      self.returnUserData() 
     } 
}) 

Get Response of FacebookData。この投稿への

func returnUserData() 
{ 
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "email"]) 
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in 
     if ((error) != nil) 
     { 
      // Process error 
      print("Error: \(error)") 
     } 
     else 
     { 
      print(result) 

     } 
    }) 
} 
+0

私はApp Delegateコードを既に持っています(申し訳ありませんが質問に含めるのを忘れてしまいました)。途中でコードをどこに置くべきですか? View Controllerが必要ですか?またはSKScene Imを使用できますか?どこに置くべきですか? viewDidLoad? FPSDKLoginManagerLoginResult !, NSError!) - > Void 'を予想される引数型' FBSDKLoginManagerRequestTokenHandlerに変換しようとすると、このエラーが発生します。' – toiavalle

+0

@toiavalle私はswift 3.0を使用していません。私はswift 2.0を使用していますので、あなたの側から可能ですので、このコードをswift 3.0でうまく動作するように変換してください。ありがとうございました。 –

1

今、Facebookのオファーをたどることができ Keychain Sharing status

ON>トグルスイッチ - >機能 - >キーホルダーの共有をあなたのiOSアプリのためのスウィフトSDK。 Swift sdk for Facebook

はそれをチェックアウトし、楽しくお使いの迅速なバージョン