2016-09-27 4 views
0

Swift 3を使用してiOS 10のFacebookログイン用のカスタムボタンを作成しています。残念ながらFacebookログインはUIButtonを押すまでSafariViewControllerを表示しません2回目。ブレークポイントのおかげで、私はloginManager.logIn()を呼び出すことがわかりますが、UIButtonを2回押すまでコールバックに入ることはありません。私のカスタムと一緒にFacebookLoginButton()を使用しても、すべてが機能します。私は本当に何が問題なのか分かりません。あなたが私を助けてくれることを願います。ありがとう!FacebookログインiOS 10は、ボタンを2回押すまで動作します。

ここに私のViewControllerです:

import UIKit 
import FacebookCore 
import FacebookLogin 

class ViewController: UIViewController { 

override func viewDidLoad() { 

    self.view.backgroundColor = .blue 

    // Add a custom login button to your app 
    let myLoginButton = UIButton(type: .system) 
    myLoginButton.backgroundColor = .red 
    myLoginButton.frame = CGRect(x: 0, y: 0, width: 180, height: 40) 
    myLoginButton.center = view.center; 
    myLoginButton.setTitle("My Button", for: .normal) 

    // Handle clicks on the button 
    myLoginButton.addTarget(self, action: #selector(self.loginButtonClicked), for: .touchUpInside) 

    // Add the button to the view 
    view.addSubview(myLoginButton) 
} 

// Once the button is clicked, show the login dialog 
func loginButtonClicked() { 
    let loginManager = LoginManager() 
    loginManager.logIn([.publicProfile], viewController: self) { (loginResult) in 
     switch loginResult { 
     case .failed(let error): 
      print(error) 
     case .cancelled: 
      print("User cancelled login.") 
     case .success(let grantedPermissions, let declinedPermissions, let accessToken): 
      print("Logged in!") 
     } 
    } 
} 

そして、私のInfo.plist(変更のみが私のアプリの名前とidのプレースホルダです:

<?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>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>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>CFBundleURLTypes</key> 
<array> 
    <dict> 
     <key>CFBundleURLSchemes</key> 
     <array> 
      <string>fb[A Number]</string> 
     </array> 
    </dict> 
</array> 
<key>FacebookAppID</key> 
<string>[My Facebook App ID]</string> 
<key>FacebookDisplayName</key> 
<string>[My App Name]</string> 
<key>LSApplicationQueriesSchemes</key> 
<array> 
    <string>fbapi</string> 
    <string>fb-messenger-api</string> 
    <string>fbauth2</string> 
    <string>fbshareextension</string> 
</array> 

更新:これは持っていますFacebookのバグとして確認済みhttps://developers.facebook.com/bugs/622990254549819/is

+0

これを試してみてください.FBSDKLoginManager = FBSDKLoginManager() loginView.loginBehavior = FBSDKLoginBehavior.Web –

+0

ありがとうございますが、それでもwebViewを開くには2つのボタンが必要でした。 – Lalo

答えて

1

の問題は、あなたが、理由LoginManagerの初期化を含め、あなたのボタンのコールバックでビューで何ログインを取得しません

- (void)logInWithBehavior:(FBSDKLoginBehavior)loginBehavior 
{ 
    __weak __typeof__(self) weakSelf = self; 
    [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *loadError) { 
    [weakSelf logInWithBehavior:loginBehavior serverConfiguration:serverConfiguration serverConfigurationLoadError:loadError]; 
    }]; 
} 

FacebookのSDKに存在する方法に関連して、FBSDKServerConfigurationManagerはを押す1回目のnullですログインボタンではなく、2度目のinitです。

私は非常に似た問題を解決しました。単にマネージャをグローバル変数として宣言し、viewDidLoadでLoginManagerのinitを作成するだけです。

+0

私は同じ問題と同じ解決策を見つけました。 – cybergen

+0

これは解決策ですが、Facebookによるとこれはバグだと私は確信しています。 https://developers.facebook.com/bugs/622990254549819/ – Lalo