如果不想使用 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") } } } }
这些步骤的完成需要 12.0.0 或以上版本的 iOS 版 Facebook SDK。如果您还未完成此步骤,则使用 Interface Builder
的应用可能会崩溃。
在 Interface Builder
中添加“登录”按钮图形:
UIButton
对象。设置约束条件进行定位。Identity inspector
中将 Class
属性改为 FBSDKLoginButton
。布局现在看起来是这样:
请注意:请不要为 FBSDKLoginButton
类设置模块。应该显示无:
请注意:由于 XCFrameworks 的已知问题,您可能在 Xcode 记录中查看到以下错误:
[Storyboard] Unknown class FBSDKLoginButton in Interface Builder file.
您可以通过“预加载”FBSDKLoginButton 类以解决此问题,然后将以下内容添加至您的 application:didFinishLaunchingWithOptions:
方法以加载故事板:
// 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 SDK 中,“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 }