2016-05-14 34 views
8

Tôi đang sử dụng SDK Facebook v4.8.0 cho iOS trong ứng dụng của tôi để đăng nhập bằng Facebook. (IPhone OS phiên bản 9.3)Trình xử lý không được gọi sau khi Đăng nhập Trình duyệt Facebook chuyển hướng đến Ứng dụng

Sau đây là một số mã có liên quan để tổng hợp:

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 
     } 
    }) 
} 

Khi người dùng có không được cấu hình tài khoản Facebook trên thiết bị, ứng dụng sẽ chuyển sang trình duyệt và cung cấp Khuôn mặt giao diện người dùng đăng nhập sách. Một lần, người dùng được thực hiện với đăng nhập Trình duyệt chuyển hướng đến Ứng dụng. Cho đến thời điểm này mọi thứ hoạt động tốt.

Vấn đề

Khi trình duyệt chuyển hướng người dùng đến ứng dụng, không có gì xảy ra. (Không xử lý cho sự thành công hoặc thất bại được gọi). Chỉ trong trường hợp người dùng chạm vào "Xong" trong trình duyệt, "đã hủy" được in trong nhật ký. Tuy nhiên, đối với "hủy" hoặc "không sao" (hoặc nói "Tiếp tục với tên người dùng"), không có gì xảy ra sau khi chuyển hướng.

Bất kỳ đầu mối nào?

Hãy cho tôi biết, nếu tôi đã bỏ sót bất kỳ thông tin nào.

+0

Ứng dụng FB đang trong quá trình phát triển hoặc sản xuất? Người dùng bạn đang sử dụng được thêm làm người thử nghiệm? Bạn đặt điểm phá vỡ trên tất cả các phương pháp đại biểu? – Wain

+0

@Wain Đang phát triển. Tôi đang sử dụng nó như một nhà phát triển (XCode gỡ lỗi trên thiết bị). Có, đã thử đặt điểm ngắt trên tất cả các phương thức đại biểu. Trình xử lý không được gọi trong trường hợp "Hủy" hoặc "OK". Khi tôi gõ vào "Done" (nút trên cùng bên trái trong cửa sổ safari thiết bị) các đại biểu được gọi. = result.isCancelled – viral

Trả lời

3

Tôi nghĩ rằng phương pháp url mở của bạn cần sau thay đổi:

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) 
    } 
} 

Hãy cho tôi biết, nếu nó hoạt động.

+0

Tôi sẽ cho bạn biết trong một thời gian. Hãy để tôi thử. – viral

+0

Vâng, điều này đã hiệu quả. Cảm ơn. – viral

2

Trong phương pháp application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) bạn đang chuyển trong các chuỗi mã hóa sourceApplicationannotation tham số.

Tôi nghĩ rằng đây là vấn đề. Hãy thử chuyển các giá trị có trong từ điển options bằng các phím tĩnh UIApplicationOpenURLOptionsSourceApplicationKeyUIApplicationOpenURLOptionsAnnotationKey.

Bạn cũng cần phải thêm @available(iOS 9.0, *) trước khi khai báo phương thức, vì nó chỉ có sẵn từ iOS 9.

Chức năng chính thức nên có một cái gì đó như thế này:

@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

Đã thực hiện các thay đổi như bạn đã đề cập chưa.Vẫn còn vấn đề vẫn còn đó. – viral

3

tôi khuyên bạn nên sử dụng Facebook tiếp cận và triển khai FBSDKLoginButton của họ. Đặt quyền đọc cho nút facebookButton.readPermissions = ["email", "user_birthday", "public_profile"]. Và ủy nhiệm cho 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 
    } 
} 

Đảm bảo bạn tuân thủ tất cả thông tin cài đặt plist của Facebook. Và App An ninh Giao thông vận tải cho iOS 9 +

+0

Tôi cần sử dụng hình ảnh nút tùy chỉnh do khách hàng cung cấp, không thể ở đó nếu tôi sử dụng 'FBSDKLoginButton'. Do đó, điều này sẽ không giải quyết được vấn đề của tôi. – viral

+0

Cảm ơn vì điều này. Trong số rất nhiều kết quả trên SO, đây là phương pháp tốt nhất để trở về từ đăng nhập FB tiêu chuẩn. – AndyDunn

Các vấn đề liên quan