2016-10-06 36 views
8

Tôi đã cài đặt Swift SDK của Facebook qua Cocoapods:Facebook SDK đăng nhập với Swift 3 iOS 10

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

Tôi đã theo các hướng dẫn đăng nhập từ Swift SDK của Facebook (https://developers.facebook.com/docs/swift/login) nhưng không thể làm cho nó làm việc.

Bên trong điều khiển điểm của tôi tôi có như sau:

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

"quản lý Login: etc." in khi tôi nhấp vào nút và chế độ xem web sẽ mở ra. Tôi có thể đăng nhập qua Facebook và sau đó chế độ xem web bị trống và không có gì xảy ra. Ứng dụng hiển thị trong ứng dụng Facebook của tôi, do đó, một số ủy quyền đã diễn ra, nhưng nếu tôi nhấp vào nút "Xong" trong chế độ xem web, kết quả của cuộc gọi lại là .cancelled và "Người dùng đã hủy đăng nhập". được in.

Tôi đã thêm Sharing Keychain để quyền lợi của tôi, và tôi đã cập nhật info.plist của tôi:

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

Tôi thậm chí đã thay đổi NSAppTransportSecurity xác lập cá nhân.

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

Tôi biết đây là một bản sao của iOS 9 Facebook login simulator -canOpenURL: failed for URL: "fbauth2:///" - error: "(null)"How to use Facebook iOS SDK on iOS 10 nhưng không ai trong số các giải pháp có vẻ làm việc cho tôi, trừ khi tôi đã bỏ lỡ một cái gì đó? Mọi đề xuất đều được đánh giá cao.

Một số lỗi được in thêm:

[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' 

Và khi tôi không có ứng dụng FB được cài đặt trên điện thoại của tôi, tôi nhận được:

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

Trả lời

17

Bạn cần phải thay thế didfinishlaunching và OpenURL appdelegate các phương thức có bên dưới:

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

Tôi phải thay đổi 'SDKApplicationDelegate' thành' FBSDKApplicationDelegate' –

+2

@ifedapoolarewaju Trong trường hợp đó, bạn nên thay đổi việc nhập của mình thành FacebookCore và FacebookLogin từ các mô-đun có tiền tố FBSDK. Đó là những cái cũ theo như tôi hiểu, nhưng các mô-đun Swift phụ thuộc vào chúng, chúng được kéo xuống bằng Pod. – nickdnk

14

Swift 3Swift 4

thêm video này vào AppDelegate.swift bạn

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

@erdemgc Bạn không nên bỏ lỡ để nhập FBSDKCoreKit – LKM

7

Các Libraries FBSDK đang bị phản đối. Bạn có thể tìm thấy các thư viện mới hơn trong Facebook's Github repository.

Đối với lỗi cụ thể này, hãy triển khai các phương pháp ứng dụng sau.

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) 

} 
5

Swift 3,0

trên AppDelete của bạn.nhanh chóng:

import FBSDKCoreKit 
import FBSDKLoginKit 

bên trong của bạn:

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

add:

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

sau đó tạo ra một func mới như sau:

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

Sử dụng Cocoapods trong Swift 3,0

Install cocoapods

pod 'FacebookCore' 
pod 'FacebookLogin' 

trong AppDelegate.swift

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

và ghi giảm Callback phương pháp

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

trong viewController bạn

01.
import FacebookCore 
import FacebookLogin 
import FBSDKLoginKit 

sau đó nút fblogin bạn viết ra mã này

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

và một điều quan trọng hơn thêm facebookid của bạn vào dự án của bạn Trong Project> Target> Thông tin> phần loại URL, thiết lập thích hợp Facebook ID và vào Lược đồ URL.

0

cập nhật cho nhanh 3:

// Trong appdelegate của bạn():

// Bước - 1:

import FacebookCore 

// Bước - 2: Trong didFinishLaunchingWithOptions()

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

// Instance 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

Answers đây khuyên bạn nên sử dụng thực hiện sau đây application(_,didFinishLaunchingWithOptions:):

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

Tuy nhiên, lưu ý rằng official documentation không sử dụng giá trị trả về của

SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) 

làm giá trị trả lại là application(_,didFinishLaunchingWithOptions:).

Bây giờ trong khi điều này có vẻ như không quan trọng, tôi đã có vấn đề lớn trong khi tích hợp facebook SDK với chi nhánh sâu liên kết, bởi vì chính xác dòng này gây ra cho tôi vấn đề.Do đó, nếu bạn muốn ngăn chặn một số vấn đề không cần thiết sau này, hãy sử dụng giải pháp sau:

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

Điều đầu tiên bạn cần tạo một ứng dụng để sử dụng đăng nhập Facebook trong ứng dụng của bạn. Bạn có thể tạo một ứng dụng trên facebook từ here

bạn cần phải thiết lập URL types, FacebookAppID, FacebookDisplayNameLSApplicationQueriesSchemes vào info.plist của bạn.

  1. thủ thêm khung đăng nhập Facebook hoặc bạn có thể sử dụng vỏ cacao như sau ...

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

    và sau đó pod install lệnh để cài đặt chậu cho ứng dụng của bạn.

  2. import FacebookCore trong đại biểu ứng dụng của bạn để sử dụng Facebook đăng nhập

  3. Thiết lập điều sau đây trong AppDelegate.swift file:

    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 
    
    } 
    

Và bây giờ bạn được cấu hình thành công Facebook đăng nhập vào ứng dụng của bạn.

Trong điều khiển xem của bạn, bạn cần phải làm như sau:

import FacebookLoginKit 

Trong Phương pháp IBAction bạn làm như sau:

@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] { 
            debugPrint("User details from FB: \(data)") 
           } 
          } 
         }) 

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

      } else { 
       self.showAlert(msg: "Fail to login using facebook.") 
      } 

     } else { 
      self.showAlert(msg: "Error in facebook login") 
     } 
    } 
} 

Bằng cách đó, bạn sẽ có thể đăng nhập vào Facebook.

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