登入審查

除了 public_profileemail 以外,若您的應用程式還要求其他權限,在您發佈應用程式之前,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")
            }
        }
    }
}

    

使用 Interface Builder

這些是 Facebook iOS SDK 12.0.0 和以上版本的必要步驟。若未完成此步驟,使用 Interface Builder 的應用程式可能會當機。

若要在 Interface Builder 中加入登入按鈕圖像:

  1. 在版面中新增一個 UIButton 物件。設定其位置限制。
  2. 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_typererequest。若不想要求之前曾經遭拒的權限,請將 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
}