我們建議您設計自訂版面配置和行為,以此取代使用 Facebook 品牌登入按鈕(如 iOS 版 Facebook 登入:快速入門所述)。以下代碼範例使用 Login Manager 類別(LoginManager
)和自訂按鈕(UIButton
)來觸發登入對話框。您可以使用任何其他自訂用戶介面或事件處理代碼來觸發登入對話框。
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Add a custom login button to your app let loginButton = UIButton(type: .custom) loginButton.backgroundColor = .darkGray loginButton.frame = CGRect(x: 0, y: 0, width: 180, height: 40) loginButton.center = view.center loginButton.setTitle("My Login Button", for: .normal) // Handle clicks on the button loginButton.addTarget(self, action: #selector(loginButtonClicked), for: .touchUpInside) view.addSubview(loginButton) } // Once the button is clicked, show the login dialog func loginButtonClicked() { let loginManager = LoginManager() loginManager.logIn(permissions: ["public_profile"], from: self) { result, error in if let error = error { print("Encountered Erorr: \(error)") } else if let result = result, result.isCancelled { print("Cancelled") } else { print("Logged In") } } } }
若為 12.0.0 及以上版本的 Facebook iOS SDK,則須採取以下步驟。如果未完成此步驟,使用 Interface Builder
的應用程式可能會當機。
以圖像方式在 Interface Builder
中新增登入按鈕:
UIButton
物件。設定限制條件以確定有關位置。Identity inspector
中,將 Class
屬性變更為 FBSDKLoginButton
。版面現在會類似以下畫面:
注意:請勿為 FBSDKLoginButton
類別設定模組。模組應顯示為 None:
注意:由於 XCFramework 存在某個已知問題,您可能會看到 Xcode 記錄中出現以下錯誤:
[Storyboard] Unknown class FBSDKLoginButton in Interface Builder file.
您可以在 application:didFinishLaunchingWithOptions:
方法中新增以下代碼,使系統在載入故事板之前「預先載入」FBSDKLoginButton 類別,從而修正此錯誤:
// For Swift _ = FBLoginButton.self // For Objective-C [FBSDKLoginButton class];
您可使用 NotificationCenter
中的 .AccessTokenDidChange
通知來追蹤 AccessToken.current
的變更。這樣您就能回應用戶登入狀態的變化:
NotificationCenter.default.addObserver( forName: .AccessTokenDidChange, object: nil, queue: .main ) { notification in if notification.userInfo?[AccessTokenDidChangeUserIDKey] != nil { // Handle user change } }
iOS SDK 可隨時間更新 AccessToken.current
,例如當 SDK 重新整理到期日更長的憑證時便會更新。因此,您應該檢查 AccessTokenDidChangeUserIDKey
通知中的 userInfo
字典,判斷用戶是否已變更。
Profile
內含公開個人檔案資料,可供您根據用戶姓名和個人資料相片個人化應用程式。您可以使用 loadCurrentProfile(completion:)
載入已登入用戶的個人檔案。
Profile.loadCurrentProfile { profile, error in if let firstName = profile?.firstName { print("Hello, \(firstName)") } }
您可以將 enableUpdatesOnAccessTokenChange
屬性設為 true
,以便自動將個人檔案載入至 Profile.current
。這樣也可以讓您觀察 .ProfileDidChange
通知來回應個人檔案變化:
Profile.enableUpdatesOnAccessTokenChange(true) NotificationCenter.default.addObserver( forName: .ProfileDidChange, object: nil, queue: .main ) { notification in if let currentProfile = Profile.current { // Update for new user profile } }
FBProfilePictureView
類別提供了輕鬆顯示用戶 Facebook 個人資料相片的方式。只需設定執行個體的 profileID
屬性即可。您可將其設定為 AccessToken.current.userID
值,以便顯示目前已登入用戶的個人資料相片。
let profilePictureView = FBProfilePictureView() profilePictureView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) profilePictureView.profileID = AccessToken.current!.userID view.addSubview(profilePictureView)
在 iOS 版 Facebook SDK 中,Facebook 登入按鈕的預設 auth_type
為重新要求。如要避免要求取得先前遭拒的權限,請將 auth_type
設為 nil
。您也可以將其設為重新授權,以便在用戶的資料存取權過期時顯示資料重新授權對話框。
以下範例展示了如何在 Swift 中設定 auth_type
。
let loginButton = FBLoginButton() // Set to nil for no auth_type button.authType = nil // Or set to reauthorize button.authType = .reauthorize
以下範例展示了如何使用帶有登入管理工具的登入配置設定 auth_type
。
let config = LoginConfiguration( permissions: [], tracking: .enabled, messengerPageId: nil, authType: nil ) let loginManager = LoginManager() loginManager.logIn(viewController: self, configuration: config!) { loginResult in // Do something with loginResult }