Facebook的SDK为iOS提供了各种登录的经验,你的应用程序可以使用它来 ??验证一个人。这份文件包括了所有你需要知道,以落实Facebook登录在你的iOS应用程序的信息。如果您想了解更多关于Facebook登录一般而言,为什么你可能想使用它,你可以在我们这样做的登录门户。
有两种方式可以实现Facebook登录在你的iOS应用方法:使用Facebook的登录按钮,或者实现你使用API调用自定义登录界面。我们将介绍这两个步骤一步的教程,包括示例代码和示例应用程序,您可以从Github上下载。这些教程将帮助您的登录执行实际的一面。如果你想获得Facebook的会议是如何工作的一个更深入的了解,我们将介绍在一个单独的部分。
其中一个让人们使用Facebook的登录到您的应用程序的好处是,他们可以将权限授予您的应用程序使您可以检索信息或代其执行在Facebook的行动。该文件还提供了关于如何的信息管理权限绑在Facebook的会话。
Facebook的会话和权限存储在访问令牌,它会自动通过Facebook的SDK以便他们可当登录的用户返回到您的应用程序缓存。但是,如果你想这样做,我们将解释如何做到这一点,您可以管理自己的令牌缓存在这里。
在本节中:
Facebook的SDK为iOS提供了可以用来登录的人在你的应用程序的进出预构建UI组件。为了验证用户,这些控件拨打电话到用户的Facebook应用程式或将回落到使用网页对话框,如果用户没有安装一个Facebook应用程序。
FBLoginView
是在Facebook的SDK,可以处理大量的帮助用户登录和注销复杂的控件。它显示一个用户界面按钮意识到人的登录状态,并会自动显示相应的提示信息,“登录”或“退出”,这取决于使用它的人是否被认证与否,就像这样:
当人们点击注销按钮,它们被显示的动作片,让他们确认,他们想退出:
本教程介绍了如何使用Facebook的使用FBLoginView UI控件实现登录。此处显示的示例代码属于FBLoginUIControlSample应用程序。如果你想看到此示例的完整代码,你可以找到它github.com / fbsamples / IOS-HOWTO文档。然而,本教程是自包含的,你不需要检查出的应用程序代码,以便能够遵循它。
注意:如果您正在实施的Facebook登录在你的应用程序,你可能要检查是否有从以前的会话遗留下来的有效的访问令牌和他们无需触碰登录按钮会自动验证用户的身份。要了解更多关于如何记录你的用户在使用缓存的令牌作品您可以访问我们的理解会话向导。要找到一个示例实现,与代码,您可以参考我们的自定义UI登录教程。
在开始之前本教程中,您将需要:
如果你还没有这样做,需要帮助这样做,你可以按照我们的入门指南。
你可以通过编程方式或图形添加登录按钮。
首先,Facebook的适用于iOS的SDK头文件添加到您的控制器代码:
#进口<FacebookSDK/FacebookSDK.h>
然后,你可以创建一个登录按钮中的任何视图控制器用下面的代码:
FBLoginView * 的LoginView = [[ FBLoginView 的alloc ] 初始化]
[ 自我。视图addSubview :登录视图];
只要你喜欢你可以定位和大小的按钮。例如,下面的代码对准在中心水平的按钮:
FBLoginView * 的LoginView = [[ FBLoginView 的alloc ] 初始化]
/ /对齐按钮,在中心
addSubview :登录视图];
您可以添加图形采用了iOS界面生成器的登录UI控件。要添加的UI控件,请执行以下操作:
视图
对象来布局。如你愿意,你可以调整其大小。FBLoginView
更改后,你的布局应该类似这样:
注:在Facebook的SDK 3.7.x及更早的版本中,登录UI控件不支持使用自动布局约束。你将需要定义其布局的老办法,通过设置大小督察的自动尺寸调整掩码中的弹簧和支柱。
设置您的布局后,进行以下更改到的调用时,您的应用程序启动代码。这些变化请确保FBLoginView
类被加载的视图显示之前:
- (BOOL )应用:(的UIApplication *)的应用
didFinishLaunchingWithOptions :(NSDictionary中 *)launchOptions
{
。后启动应用程序/ /覆盖点进行定制
[ FBLoginView 类]
...
返回YES ;
}
注意:如果你已经添加了-ObjC的
标志,你的链接器选项,那么你就不必添加此代码。并称,标志会导致链接器加载在Facebook的SDK中所有的目标文件,包括FBLoginView
类。如果你想知道更多关于什么的,ObjC的
标志呢,你可以看看我们的故障排除指南。
处理您从与Facebook登录过程的互动得到响应,你需要重写应用程序:的OpenURL:sourceApplication:注释:
方法在你的应用程序委托中加入以下代码:
- (BOOL )应用:(的UIApplication *)的应用
的OpenURL :(NSURL *)网址
sourceApplication :(的NSString *)sourceApplication
注释:(ID )注释{
/ /调用FBAppCall的handleOpenURL:sourceApplication处理Facebook应用程序的响应
BOOL wasHandled = [ FBAppCall handleOpenURL :网址sourceApplication :sourceApplication ];
/ /如果需要,可以在这里添加你的应用程序特定的URL处理代码
返回wasHandled ;
}
当有人使用Facebook登录的应用程序进行连接时,应用程序可以访问任意要求读取数据的那个人可能已经加入到Facebook的一个子集。例如,包含在他们的信息的公众形象是可用的背后public_profile
许可。同样,所有其他部分的信息,有人增加了他们的Facebook的个人资料作抵押落后于其他的读取权限。例如,一个人的主电子邮件地址是通过访问电子邮件
的权限。
除了 ??读取数据,应用程序还需要独立的,以发布内容代表个人的发布权限。这些都是分开的,让你读一个人的信息的读取权限。人们常常对授予发布权限非常敏感的,所以你应该只要求对发布权限,一旦一个人已经准备好从发布你的应用程序和一些不能在初始登录过程。登录控制使得这个容易被分离的读取权限和发布权限。如果您想了解更多有关权限,你可以看看我们的权限一节。
下面是要求一个例子电子邮件
,public_profile
和user_friends
读取权限。如果您正在创建的控制编程这是有用的:
FBLoginView * loginView =
[[ FBLoginView alloc ] initWithReadPermissions :
@[@ "public_profile" , @ "email" , @ "user_friends" ]];
另外,如果您使用的是FBLoginView
通过界面生成器可以通过设置读取权限readPermissions
的物业FBLoginView
实例:
/ /在你看来头文件:
@财产 (弱,非原子) IBOutlet FBLoginView * 的LoginView ;
/ /在你的viewDidLoad方法:
自我。的LoginView 。readPermissions = @ [@ “public_profile” , @ “电子邮件” , @ “user_friends” ];
如果你的应用要求超过public_profile
,电子邮件
和user_friends
,那么它将不得不通过Facebook的审查可以提供给广大市民面前。请参阅我们的评论文档获取更多信息。
FBLoginView
保持认证状态。这意味着,该按钮会显示相应的标签并进行登录或注销时,它的挖掘。的另一个特点FBLoginView
是它获取的公众形象时,登录的公众形象取人登录后的典型要求的应用程序提出的,UI控件会自动执行此操作。
您可以对影响的事件接收通知FBLoginView
由符合FBLoginViewDelegate
协议并实施某些方法。那么你的代表将获得以下事件的通知:
FBLoginView
已提取的公众形象。如果你实现了你的应用程序被通知loginViewFetchedUserInfo:用户:
委托方法。loginViewShowingLoggedInUser:
方法。loginViewShowingLoggedOutUser:
委托方法。的LoginView:handleError的:
委托方法。为了向你展示如何将这些回调的工作,我们已经创建了一个例子,其中包含三个视图控制器网点
:一种用于显示人的个人资料图片时,该人已登录,第二个要显示自己的名字时,他们在已经登录,而第三个显示状态(“你的身份登录”或“你没有登录!”)。我们的应用程序的UI看起来像这样:
而我们的界面看起来像这样:
@interface LoginUIViewController ()
@property ( strong , nonatomic ) IBOutlet FBProfilePictureView * profilePictureView ;
@property ( strong , nonatomic ) IBOutlet UILabel * nameLabel ;
@property ( strong , nonatomic ) IBOutlet UILabel * statusLabel ;
@end
注意:如果你想看到这些例子的完整代码,或查看运行中的登录控件,您可以从检出FBLoginUIControlSample应用程序github.com / fbsamples / IOS-HOWTO文档。然而,本教程是自包含的,你不需要检查出的应用程序代码,以便能够遵循它。
要设置委托方法,首先添加FBLoginViewDelegate
你的类的协议列表。
@接口 LoginUIViewController : 的UIViewController < FBLoginViewDelegate >
接着,分配委托给你的视图控制器类。
如果以编程方式定义的登录UI控件,修改代码以执行以下操作:
FBLoginView * 的LoginView = [[ FBLoginView 的alloc ] 初始化];
LoginView控件。委托 = 自我;
...
如果你定义使用Interface Builder的登录UI控件:
视图
表示登录按钮。委托
出口到文件的所有者。然后,执行可选的委托方法。
实施loginViewFetchedUserInfo:用户:
委托方法可以让您个人触摸到你的应用程序。在这个例子中,在返回的用户数据??FBGraphUser
对象是用来设置用户的配置文件图像,并设置其名称:
/ /这个方法会被调用,当用户信息被取出
- (无效)loginViewFetchedUserInfo :(FBLoginView *)的LoginView
用户:(ID < FBGraphUser >)用户{
自我。profilePictureView 。配置文件ID = 用户。标识;
自我。nameLabel 。文字= 用户。名;
}
实施loginViewShowingLoggedInUser:
委托方法允许您修改您的应用程序的UI来显示记录中的经验。在下面的例子中,我们通知他们改变状态登录的用户:
/ /登录的用户体验
- (无效)loginViewShowingLoggedInUser :(FBLoginView *)的LoginView {
自我。statusLabel 。文字= @ “你的记录为” ;
}
实施loginViewShowingLoggedOutUser:
委托方法允许您修改您的应用程序的UI来显示记录的实践经验。在下面的例子中,用户的个人资料图片被删除,用户的名称设置为空白,且状态被改变,以反映不登录的用户:
/ /登出用户
没有登录!“ ;
}
最后,实施的LoginView:handleError的:
委托方法可以检测并优雅地应对错误。请参见API文档的错误就可能验证错误,并建议恢复策略的更多细节。
在这个例子中,使用您的应用程序的人被告知,如果:*他们需要你的应用程序之外执行一个动作,从错误中恢复(例如,如果登录尝试失败,因为用户的Facebook密码已更改,或他们的Facebook帐户未验证)*会话不再有效(例如是用户从Facebook的用户界面退出你的应用程序)*对于任何其他错误,但如果用户拒绝您的应用程序所要求的权限
/ /处理可能发生在登录过程中可能出现的错误
- (无效)的LoginView :(FBLoginView *)的LoginView handleError的:(NSError *)错误{
的NSString * alertMessage , * alertTitle ;
/ /如果用户要的你之外执行操作的应用程序恢复,
/ / SDK将提供给用户一个信息,你只需要浮出水面了。
/ /这个方便地处理像Facebook密码变更或未经核实的Facebook账户的情况。
如果 ([ FBErrorUtility shouldNotifyUserForError :错误]) {
alertTitle = @ “Facebook的错误” ;
alertMessage = [ FBErrorUtility userMessageForError :错误];
/ /此代码将处理发生在应用程序之外会话关闭
/ /你可以看看我们的错误处理指南,多了解
错误“ ;
alertMessage = @ “你的当前会话不再有效。请重新登录“。;
/ /如果用户已经取消了登录,我们不会做任何事情。
/ /你也可以选择向用户显示一条消息,如果取消登录将导致
/ /用户不能够完成任务,他们已经在你的应用程序启动
/ /(如访问FB-存储的信息或张贴到
注销登录“ );
/ /为了简单起见,此示例处理与一个通用的消息其他错误
/ /可以检出我们的错误处理指南更详细的信息
/ / https://developers.facebook.com/docs/ios/errors
} 否则 {
alertTitle = @ “出事了” ;
alertMessage = @ “请稍后再试。” ;
的NSLog (@ “意外的错误:%@” ,错误);
}
如果 (alertMessage ) {
[[[ UIAlertView 的alloc ] initWithTitle :alertTitle
消息:alertMessage
代表:零
cancelButtonTitle :@ “确定”
otherButtonTitles :无] 秀];
}
}
按照我们的测试您的登录流程指南,以确保您的应用程序的登录将在一系列共同的条件下工作。
有关添加登录到您的iOS应用程序的更多信息,请参见以下内容:
在本节中:
本教程将引导您如何使用自己的自定义用户界面的登录和注销的控件添加Facebook登录到您的应用程序。通过这种方式,你可以留在你的应用程序的外观和感觉的控制,并提供一致的用户体验。
要实现这一点的登录,我们将使用Facebook的SDK的核心对象之一:FBSession
。该FBSession
对象用于验证用户和管理用户的会话。打开会话将启动认证流程之后,一个有效的用户会话应提供并随后缓存在一个访问令牌的形式。缓存的访问令牌,当仍然有效,可以被用来重新打开一个会话的任何时间。关闭会话注销用户,并可以选择性地清除缓存的令牌。当一个应用程序可以创建FBSession的实例,并管理它们本身,FBSession提供佣工,以简化具有单一登录的人一个应用程序的常见的场景。我们将在这里使用这些佣工。如果您想了解更多关于Facebook的会议是如何工作的,你可以阅读我们的理解会话部分。
本教程介绍了一个简单的用例,用户会看到一个自定义的登录/注销按钮,用户可以触摸来切换他们的身份验证状态。当用户登录时,我们将向然后登录的用户界面,它包含一个欢迎信息和改变按钮的标题为“退出”,当用户注销后,我们会向他们展示一个注销确认消息和一个“通过Facebook登陆“按钮,如下所示:
我们也会检查是否有缓存的会话,当用户打开该应用程序,以便自动登录,如果可能的用户。所示的示例代码属于FBLoginCustomUISample应用程序。如果你想看到此示例的完整代码,你可以找到它github.com / fbsamples / IOS-HOWTO文档。然而,本教程是自包含的,你不需要检查出的应用程序代码,以便能够遵循它。
在开始之前本教程中,您将需要:
如果你还没有这样做,需要帮助这样做,你可以按照我们的入门指南。
当用户使用Facebook帐号登录到您的应用程序,你的应用程序将控制权交给了Facebook的iOS应用程序或Facebook在移动浏览器,它会显示用户一个对话框,提示他们授权您的应用程序。如果一切顺利,这将导致创建将存储在一个访问令牌和缓存的会话。但是,当你试图让你的用户登录到你的应用程序,无论是与Facebook或其他方式,它始终是很好的做法,避免不必要的步骤,以尽量减少摩擦。所以,如果一个人曾登录到Facebook上与你的应用程序,并仍然有从该会话的有效缓存的道理,我们建议您使用它打开一个会话。这样,你无需为你的用户在触摸一个按钮来登录。
要实现这一点,在应用程序委托的应用:didFinishLaunchingWithOptions:
方法,我们将添加以下内容:
/ /当一个人打开的应用程序,检查是否有缓存的会话
,如果 (FBSession 。activeSession 。状态== FBSessionStateCreatedTokenLoaded ) {
/ /如果有一个,刚打开会话默默地,而不显示用户的登录界面
[ FBSession openActiveSessionWithReadPermissions :@ [@ “public_profile” ]
allowLoginUI :无
completionHandler :^(FBSession * 会话, FBSessionState 状态, NSError * 错误) {
/ /处理程序的会话状态改变
/ /这个方法会被调用每次会话状态的变化,
/ /也为中间状态,而不仅仅是在会议开幕
[ 自我sessionStateChanged :会话状态:状态错误:错误]
}];
我们首先检查是否有通过检查活动会话的状态的缓存令牌。如果有一个缓存的令牌的会话状态将被FBSessionStateCreatedTokenLoaded
。如果是这样的话,我们可以尝试使用打开缓存的会话FBSession
openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:
方法与allowLoginUI:
设置为NO
(这将防止在登录对话框中的显示)。需要传递给此方法的其他参数为:
当有人使用Facebook登录的应用程序的连接,应用程序可以访问他们保存在Facebook数据。这是通过要求做的权限。读取数据需要要求的读取权限。应用程序还需要以发布内容的用户的名义发布权限。如果您想了解更多有关权限,你可以看看我们的权限一节。
这要求更多了应用程序public_profile
,电子邮件
和user_friends
将不得不通过Facebook的审查可以提供给广大市民才。请参阅我们的评论文档获取更多信息。
该openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:
接受一个将被调用,每当有一个会话状态更改处理。这意味着,你的处理方法会被调用每一个登录过程中的中间阶段状态的变化,不仅在会话打开(或打开失败)。同时也为发生其他所有会话状态改变会话的整个生命周期中。如果您想了解更多关于FBSession
生命周期,您可以参考我们的理解会话向导。我们将仔细看看这个在处理会话状态的变化部分本教程。
到目前为止,我们已经讨论了如何打开一个会话,如果有一个缓存的令牌。打开一个会话,而无需一个是非常相似的。在我们的例子中,我们有一个按钮,用户可以触摸切换认证。当用户触摸这个按钮,应用程序将控制传递给Facebook的iOS应用或Facebook在移动浏览器,它会显示用户一个对话框,提示他们授权的应用程序,像这样:
要实现这一点,我们需要做三件事情:
要连接的按钮,在按钮的委托,我们做到以下几点:
- (IBAction )buttonTouched :(ID )发件人
{
/ /如果会话状态是任意的两个“开”状态时,按钮clicked
if ( FBSession . activeSession . state == FBSessionStateOpen
|| FBSession . activeSession . state == FBSessionStateOpenTokenExtended ) {
/ /关闭会话并从缓存中移除的访问令牌
/ /会话状态处理程序(在应用程序委托)将被自动调用
[ FBSession 。activeSession closeAndClearTokenInformation ];
/ /如果会话状态不是任意的两个“开”状态的按钮被点击时
} 否则 {
/ /打开一个会话显示用户的登录界面
/ /你必须始终打开一个会话时要求public_profile权限
[ FBSession openActiveSessionWithReadPermissions :@ [@ “public_profile” ]
allowLoginUI :YES
completionHandler :
^(FBSession * 会话, FBSessionState 状态, NSError * 错误) {
/ /检索应用程序委托
AppDelegate中* 的AppDelegate = [ 的UIApplication sharedApplication ]。代表;
/ /调用应用程序委托的sessionStateChanged:状态:错误的方法来处理会话状态的变化
[ AppDelegate中sessionStateChanged :会话状态:状态错误:错误]
}];
}
}
当用户触摸该按钮时,如果当前会话是打开的,我们将其关闭。另外,如果在当前会话中比开其他任何国家,我们将尝试打开它。要检查是否会话是开放的,我们检查会话状态是任何两个打开的状态:FBSessionStateOpen
或FBSessionStateOpenTokenExtended
。如果是这样的话,我们通过调用关闭会话closeAndClearTokenInformation
上的活动会话。会议闭幕会自动调用会话状态更改处理。如果会话没有打开,我们将尝试通过调用打开它FBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:
方法与allowLoginUI:
设置为YES
。同样,我们需要指定权限(至少public_profile
)和完成处理程序。对于完成处理程序,我们使用的是我们用于无声登录同样的方法。
接着,以处理传入的URL,当Facebook的应用程序或Facebook网站将控制返回给您的应用程序,重写应用程序:的OpenURL:sourceApplication:标注
在你的应用程序委托来调用处理传入的URL FBsession对象:
/ /在Facebook登录流程,您的应用程序将控制权交给了Facebook的iOS应用程序或Facebook在移动浏览器
。/ /验证后,您的应用程序将被召回的会话信息
- (BOOL )应用:(的UIApplication *)应用
的OpenURL :(NSURL *)网址
sourceApplication :(的NSString *)sourceApplication
注释:(ID )注释
{
返回 [ FBAppCall handleOpenURL :网址sourceApplication :sourceApplication ];
}
默认情况下,FBAppCall
将完成流FBSession.activeSession
。如果你明确管理FBSession
情况下,请使用以过载FBSession
实例。
最后,你将需要处理的情况下,用户离开正在显示Facebook登录对话框,而您的应用程序时。这可能发生,例如,如果使用压iOS的“家”按钮,对话框被激活。为了处理这种情况,覆盖applicationDidBecomeActive:
方法在你的应用程序委托调用FBAppCall handleDidBecomeActive
。该方法将检查可能已离开挂任何会议开幕进程,并且将清除悬而未决的会话,这样就可以重新开始。
- (无效)applicationDidBecomeActive :(的UIApplication *)应用
{
/ /处理用户离开应用程序正在显示Facebook登录对话框时
/ /例如:当用户按下了iOS的“家”按钮,登录对话框被激活
[ FBAppCall handleDidBecomeActive ];
}
在接下来的会议上,我们将看到如何处理会话状态的变化。
在之前的会议上,当我们打开一个会话,我们必须提供一个将被调用,每当有一个会话状态更改处理。这种处理方法会被调用每一个登录过程中的中间阶段状态的变化,不仅在会话打开(或打开失败)。同时也为发生其他所有会话状态改变会话的整个生命周期中。如果您想了解更多关于FBSession
生命周期,您可以参考我们的理解会话部分。
这里是处理程序,与不同的可能状态的变化和错误处理的例子:
/ /此方法将处理应用程序的所有会话状态的变化
- (无效)sessionStateChanged :(FBSession *)会话状态:(FBSessionState )状态错误:(NSError *)错误
{
/ /如果session被成功打开
,如果 (!错误&& 状态== FBSessionStateOpen ){
的NSLog (@ “会话打开” );
/ /显示用户已登录
如果会话被关闭
的NSLog (@ “关闭会话” );
/ /显示用户已登录了的用户界面
[ 自我userLoggedOut ];
}
/ /处理错误
,如果 (错误){
的NSLog (@ “错误” );
的NSString * alertText ;
的NSString * alertTitle ;
/ /如果错误要求人们使用的应用程序,使应用程序之外的行动,以恢复
如果 ([ FBErrorUtility shouldNotifyUserForError :错误] == YES ){
alertTitle = @ “出事了” ;
alertText = [ FBErrorUtility userMessageForError :错误]
[ 自我showMessage :alertText withTitle :alertTitle ];
} 否则 {
/ /如果用户注销登录,什么都不做
,如果 ([ FBErrorUtility errorCategoryForError :错误] == FBErrorCategoryUserCancelled ) {
的NSLog (@ “用户注销登录” );
这种情况发生的外/ /处理会话关闭
错误“ ;
alertText = @ “你的当前会话不再有效。请重新登录“。;
[ 自showMessage :alertText withTitle :alertTitle ];
/ /在这里,我们将处理与一般错误消息的所有其他错误。
/ /我们建议您查看我们的处理错误引导有关详细信息,
/ / https://developers.facebook.com/docs/ios/errors/
} 否则 {
/ /从错误中获取更多的错误信息
的NSDictionary * errorInformation = [[[ 错误。USERINFO objectForKey :@ “com.facebook.sdk:ParsedJSONResponseKey”