除了 public_profile
和 email
以外,若您的應用程式還要求其他權限,在您發佈應用程式之前,Facebook 就必須進行審查。進一步瞭解審查程序,以及要符合哪些條件才能通過審查。
您可以設計自訂版面和行為,未必要使用 Facebook 品牌登入按鈕(請見 iOS 版 Facebook 登入 - 快速入門中的說明)。在下列程式碼範例中,我們使用登入管理員類別(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") } } } }
這些是 Facebook iOS SDK 12.0.0 和以上版本的必要步驟。若未完成此步驟,使用 Interface Builder
的應用程式可能會當機。
若要在 Interface Builder
中加入登入按鈕圖像:
UIButton
物件。設定其位置限制。Identity inspector
中的 Class
屬性變更為 FBSDKLoginButton
。現在您的版面如下所示:
備註:請勿為 FBSDKLoginButton
類別設定模組。其應顯示 None:
備註:因為 XCFrameworks 的已知問題,您可能會在 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 重新整理某個到期日較長的權杖時。因此,您應在通知中的 userInfo
字典中查詢 AccessTokenDidChangeUserIDKey
,用於判斷用戶是否已變更。
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 所用 Facebook 登入按鈕的預設 auth_type
是 rerequest。若不想要求之前曾經遭拒的權限,請將 auth_type
設為 nil
。若用戶的資料存取權限已經過期,您也可以將這一項設為 reauthorize,用於顯示資料重新授權對話方塊。
下列範例示範如何在 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 }