アプリでpublic_profile
とemail
以外のものが必要な場合、アプリをリリースする前に、Facebookによる審査を受ける必要があります。審査プロセスと、審査にパスするための条件について詳しくは、次をご覧ください。
Facebookブランドのログインボタンを使用する(「iOS用Facebookログイン - クイックスタート」を参照)代わりに、カスタムレイアウトやカスタム動作を設計することが望ましい場合もあるかもしれません。以下のサンプルコードでは、ログインマネージャークラス(FBSDKLoginManager
)およびカスタムボタン(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
でグラフィカルな方法でログインボタンを追加するには、次のようにします。
View
オブジェクトをレイアウトに追加します。制限を設定して位置を指定します。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
通知により、track AccessToken.current
の変更内容をトラッキングできます。次のコードで、ユーザーのログイン状態に変更があった場合に対応できます。
NotificationCenter.default.addObserver( forName: .AccessTokenDidChange, object: nil, queue: .main ) { notification in if notification.userInfo?[AccessTokenDidChangeUserIDKey] != nil { // Handle user change } }
期間の長いトークンをSDKにより更新する場合など、iOS SDKが時間の経過とともに AccessToken.current
を更新する場合があります。したがって、通知の中のuserInfo
ディクショナリをチェックして、ユーザーが変更を加えたかどうか AccessTokenDidChangeUserIDKey
を調べなければなりません。
FBSDKProfile
には公開プロフィール情報が含まれるため、ユーザーの名前およびプロフィール写真を使用して該当アプリをパーソナライズすることができます。ログインしているユーザーのプロフィールは、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 } }
FBSDKProfilePictureView
クラスは、ある人物の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 }