앱에서 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
클래스에 모듈을 설정하지 마세요. 없음으로 표시되어야 합니다.
참고: 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가 만료 날짜를 연장하여 토큰을 새로 고침한 경우). 따라서 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 }