2016-05-14 93 views
8

我在我的Facebook應用程序登錄中使用Facebook SDK v4.8.0 for iOS。 (iPhone OS 9.3版本)Facebook瀏覽器登錄重定向到應用程序後,處理程序不會被調用

以下是整合一些相關代碼:

AppDelegate.swift

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

func applicationDidBecomeActive(application: UIApplication) { 
    FBSDKAppEvents.activateApp() 
} 

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

func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool { 
     return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, 
                    sourceApplication: "UIApplicationOpenURLOptionsSourceApplicationKey", 
                    annotation: "UIApplicationOpenURLOptionsAnnotationKey") 
} 

Login.Swift

@IBAction func btnFacebook(sender: UIButton) { 

    self.loginToFacebookWithSuccess({ (response) -> Void in 
     print("Success") 
    }) { (error) -> Void in 
     print("failure") 
    } 

func loginToFacebookWithSuccess(successBlock:() ->(), andFailure failureBlock: (NSError?) ->()) { 

    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager() 
    fbLoginManager.loginBehavior = .SystemAccount 

    FBSDKLoginManager().logInWithReadPermissions(["public_profile", "email", "user_friends"], fromViewController: self, handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in 

     if error != nil { 
      print("error") 
     } else if result.isCancelled { 
      print("cancelled") 
     } else { 
      print("worked fine") // get Facebook user data here 
     } 
    }) 
} 

當用戶有未在設備中配置Facebook帳戶,該應用程序將轉到瀏覽器並提供Face書籍登錄界面。一旦用戶完成登錄,瀏覽器將重定向到應用程序。直到這一點一切工作正常。

問題

當瀏覽器將用戶重定向到應用程序,沒有任何反應。 (沒有處理程序成功或失敗被稱爲)。只要用戶點擊瀏覽器中的「完成」,日誌中將打印「取消」。但是,對於「取消」或「好的」(或者說「繼續作爲用戶名」)重定向後沒有任何反應。

任何線索?

讓我知道,如果我錯過了任何信息。

+0

FB應用程序正在開發或生產?您正在使用的用戶是作爲測試人員添加的?你在所有委託方法上放置斷點? – Wain

+0

@Wain它正在開發中。我將其用作開發人員(設備上的XCode調試)。是的,嘗試在所有委託方法上放置斷點。處理程序沒有在「取消」或「好」的情況下被調用。當我點擊「完成」(設備Safari窗口左上角的按鈕)時,代表被調用。 = result.isCancelled – viral

回答

3

我覺得你打開網址方法需要以下更改:

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

    let isFBURL = ((url.scheme?.hasPrefix("fb\(FBSDKSettings.appID()!)"))! && url.host == "authorize") 

    if isFBURL == true { 

     return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, 
                    sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, 
                    annotation: options[UIApplicationOpenURLOptionsKey.annotation] as? String) 
    } 
} 

讓我知道,如果它的工作原理。

+0

我會在一會兒讓你知道。讓我試試看。 – viral

+0

是的,這工作。謝謝。 – viral

2

application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject])方法中,您傳遞的參數爲sourceApplicationannotation硬編碼字符串。

我認爲這是問題。嘗試使用靜態鍵UIApplicationOpenURLOptionsSourceApplicationKeyUIApplicationOpenURLOptionsAnnotationKey傳遞options字典中的值。

你也應該需要在方法聲明之前添加@available(iOS 9.0, *),因爲它是唯一可用的iOS從9

最終的功能應該是這樣的:

@available(iOS 9.0, *) 
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 
    return FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey]) 
} 
+1

按照您提及的方式進行了更改。問題仍然存在。 – viral

3

我建議你使用Facebook的方式和實施他們的FBSDKLoginButton。將讀取權限設置爲按鈕facebookButton.readPermissions = ["email", "user_birthday", "public_profile"]。並委託給viewController。

//MARK:- FBSDKLogin Button Delegate 
extension LoginViewController: FBSDKLoginButtonDelegate { 

    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 

     guard let response = result, let _ = response.token else { 
      createAlertController("Error", message: "There was a problem with the Facebook login. Please try again.") 
      return 
     } 

     //Do what ever you need here 
    } 

    func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { 
     //Required method, we don't need it at login screen 
    } 
} 

確保你關注了所有的Facebook plist設置信息。和App傳輸安全性爲iOS 9+

+0

我需要使用客戶端提供的自定義按鈕圖像,如果我使用'FBSDKLoginButton',則不能在那裏。因此,這不會解決我的問題。 – viral

+0

謝謝你。在SO上有很多結果,這是從標準FB登錄返回的最佳方法。 – AndyDunn

相關問題