• Facebook


    Facebook登录为iOS

    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登录教程


    先决条件

    在开始之前本教程中,您将需要:

    • 您的环境设置
    • 正确配置并连接到你的iOS应用,Facebook的应用程序与单点登录启用
    • Facebook的SDK添加到项目中
    • 您的Facebook应用程序ID和显示名称添加你的应用程序的。plist文件

    如果你还没有这样做,需要帮助这样做,你可以按照我们的入门指南


    添加登录的UI控件

    你可以通过编程方式或图形添加登录按钮。

    以编程

    首先,Facebook的适用于iOS的SDK头文件添加到您的控制器代码:

    #进口<FacebookSDK/FacebookSDK.h>

    然后,你可以创建一个登录按钮中的任何视图控制器用下面的代码:

    FBLoginView  * 的LoginView =  [[ FBLoginView 的alloc ] 初始化] 
    [ 自我视图addSubview 登录视图];

    只要你喜欢你可以定位和大小的按钮。例如,下面的代码对准在中心水平的按钮:

    FBLoginView  * 的LoginView =  [[ FBLoginView 的alloc ] 初始化] 
    / /对齐按钮,在中心      
    addSubview 登录视图];

    图形

    您可以添加图形采用了iOS界面生成器的登录UI控件。要添加的UI控件,请执行以下操作:

    1. 添加一个视图对象来布局。如你愿意,你可以调整其大小。
    2. 在身份检查,改变类属性来FBLoginView

    更改后,你的布局应该类似这样:

    注:在Facebook的SDK 3.7.x及更早的版本中,登录UI控件不支持使用自动布局约束。你将需要定义其布局的老办法,通过设置大小督察的自动尺寸调整掩码中的弹簧和支柱。

    设置您的布局后,进行以下更改到的调用时,您的应用程序启动代码。这些变化请确保FBLoginView类被加载的视图显示之前:

    -  BOOL 应用:(的UIApplication  *)的应用
    didFinishLaunchingWithOptions :(NSDictionary中 *)launchOptions
     { 
        。后启动应用程序/ /覆盖点进行定制
        [ FBLoginView  ] 
        ... 
        返回YES ; 
    }

    注意:如果你已经添加了-ObjC的标志,你的链接器选项,那么你就不必添加此代码。并称,标志会导致链接器加载在Facebook的SDK中所有的目标文件,包括FBLoginView类。如果你想知道更多关于什么的,ObjC的标志呢,你可以看看我们的故障排除指南


    从Facebook的应用程序处理的响应

    处理您从与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_profileuser_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文档。然而,本教程是自包含的,你不需要检查出的应用程序代码,以便能够遵循它。


    先决条件

    在开始之前本教程中,您将需要:

    • 您的环境设置
    • 正确配置并连接到你的iOS应用,Facebook的应用程序与单点登录启用
    • Facebook的SDK添加到项目中
    • 您的Facebook应用程序ID和显示名称添加你的应用程序的。plist文件

    如果你还没有这样做,需要帮助这样做,你可以按照我们的入门指南


    打开会话

    当用户使用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在移动浏览器,它会显示用户一个对话框,提示他们授权的应用程序,像这样:

    要实现这一点,我们需要做三件事情:

    • 会话打开/关闭呼叫添加到登录按钮
    • 处理传入的URL,当Facebook的应用程序或Facebook网站将控制返回给您的应用程序
    • 处理的情况下,用户离开正在显示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 会话状态状态错误错误] 
         }]; 
      } 
    }

    当用户触摸该按钮时,如果当前会话是打开的,我们将其关闭。另外,如果在当前会话中比开其他任何国家,我们将尝试打开它。要检查是否会话是开放的,我们检查会话状态是任何两个打开的状态:FBSessionStateOpenFBSessionStateOpenTokenExtended。如果是这样的话,我们通过调用关闭会话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” ] objectForKey :@ “身体” ] objectForKey :@ “错误” ];
    
            / /显示用户的错误消息
            alertTitle =  @ “出事了” ; 
            alertText =  [ NSString的stringWithFormat :@ “请重试 n  n已如果问题仍然存在,请联系我们,何况这个错误代码:%@”  [ errorInformation objectForKey :@ “消息” ]] 
            [ showMessage alertText withTitle alertTitle ]; 
          } 
        } 
        / /清除此令牌
        [ FBSession activeSession closeAndClearTokenInformation ]; 
        / /显示用户已登录了的用户界面
        [ 自我userLoggedOut ]; 
      } 
    }

    在这种情况下,如果会话成功打开后,我们会向用户显示一个登录的用户界面。如果会话被关闭,要么故意或者如果登录失败,我们会显示用户已登录了的用户界面。

    如果有任何错误,我们会处理它们的方式如下。首先,我们将调用FBErrorUtility shouldNotifyUserForError:方法传递给它,我们得到了错误,以找出是否错误要求人们使用你的应用程序,使一个动作你的应用程序之外,以恢复。这可能是情况下,例如,如果用户还没有证实他们的Facebook帐户,他们要完成这一过程,才可以使用此帐户登录到您的应用程序。在这种情况下,该SDK提供并指示一个错误信息,你可以显示你的用户。所以,如果shouldNotifyUserForError:返回,那么我们将通过展示它们,我们从得到的消息通知用户FBErrorUtility通过调用错误:userMessageForError。如果没有,我们将不得不到应用程序的错误逻辑中处理错误。处理错误,我们将需要更多的信息。此信息可在错误分类,检索它,我们可以调用[FBErrorUtility errorCategoryForError:错误]

    当用户触摸的情况下,“取消”显示Facebook登录对话框时,错误类别将被FBErrorCategoryUserCancelled。在这个例子中,我们选择忽略这一点,但你也可以选择向用户显示一条消息,如果你觉得取消登录会导致用户不能够完成任务,他们已经在你的应用程序启动(比如访问FB存储的信息或张贴到Facebook)。

    我们已经提到,这种处理方法会被调用为每个会话状态改变会话的整个生命周期内,所以我们还需要处理会话关闭,可你的应用程序之外发生的,即使他们是无关的登录过程。这方面的一个例子是一个会话结束这种情况发生,因为用户从Facebook的用户界面中删除你的应用程序。对于这些情况,错误类别将FBErrorCategoryAuthenticationReopenSession。为了从错误中恢复,我们告诉我们的用户重新登录。

    在这个例子中,我们只专门处理两个错误类别,为剩下的一个通用的消息,但是你可能需要处理其他案件具体取决于您的应用程序。你可以找到在不同的错误类型,他们在我们的意思是什么的详细信息FBError参考。您也可以阅读更多有关错误处理在我们的错误处理指南

    最后,如果出现了任何错误,我们将清除缓存令牌通过调用closeAndClearTokenInformation上的活动会话,所以下一次我们尝试,我们开始一个新的会话登录。


    处理应用程序冷启动

    由于大多数的登录流量需要一个应用程序切换来完成,这是可能你的应用程序能够由iOS的在内存不足的情况(或者,如果您的应用程序不支持backgrounding)终止。在这种情况下,提供给您的open调用的状态变化处理程序块丢失。要处理这种情况下,您可以明确指定状态改变处理程序块的FBSession实例之前任何时间handleOpenURL:打电话。例如,

    / /在Facebook登录流程,您的应用程序将控制权交给了Facebook的iOS应用程序或Facebook在移动浏览器
    。/ /验证后,您的应用程序将被召回的会话信息
    -  BOOL 应用:(的UIApplication  *)应用
                的OpenURL :(NSURL *)网址
      sourceApplication :(的NSString  *)sourceApplication
             注释:(ID 注释
     { 
      / /注意作为处理函数传递给任何open调用这个处理程序块应该是完全相同的。
      [ FBSession activeSession setStateChangeHandler 
         ^(FBSession  * 会话 FBSessionState 状态 NSError  * 错误 {
    
           / /检索应用程序委托
           AppDelegate中* 的AppDelegate =  [ 的UIApplication sharedApplication ]。代表; 
           / /调用应用程序委托的sessionStateChanged:状态:错误的方法来处理会话状态的变化
           [ AppDelegate中sessionStateChanged 会话状态状态错误错误] 
         }]; 
      返回 [ FBAppCall handleOpenURL 网址sourceApplication sourceApplication ]; 
    }

    测试您的登录流程

    按照我们的测试您的登录流程指南,以确保您的应用程序的登录将在一系列共同的条件下工作。


    其他资源

    了解会议

    在本节中:


    概观

    当有人成功使用Facebook登录的应用程序的连接,应用程序将能够获得一个访问令牌,它提供给了Facebook的API临时的,安全的访问。访问级别将取决于权限的用户授予应用程序。该FBSession类是用来管理,存储和默认刷新访问令牌。

    本节概述了背后的概念FBSession状态的生命周期,为您提供的会话管理功能的背景。有关如何使用您自己的会话令牌缓存来覆盖默认行为的信息,您可以阅读我们的管理自己的令牌缓存部分


    FBSession国家生命周期

    Facebook的SDK使用一个会话状态机来控制会话的生命周期。这些国家所使用的Facebook的SDK来允许或拒绝访问其它的Facebook的API,处理访问令牌存储或检索,并处理任何错误情况。

    从登录登出,通过一个典型的生命周期如下图所示。在这个例子中,我们寻找一个令牌缓存在应用程序启动,以提供一个初始登录于经验,如果令牌是可用的。如果令牌不存在,我们显示一个登录界面,在这里用户可以触摸一个按钮来启动登录过程。在此之后,通过身份验证的用户可以应用在使用过程中被要求提供额外的权限,这揭开序幕一个新的权限请求流将触发一个UI,要求该权限的用户。最后,经过身份验证的用户可以通过点击注销按钮退出该应用程序的。

    对于每个进程(应用程序启动登录对话框要求额外的权限,并注销),我们将显示出所有的中间状态,直到操作完成会议将通过一个图。你只需要关心自己的最后一届国家为他们每个人,这将决定你的应用可以使代表用户的操作。您可以放心地忽略中间状态,有你完成处理程序只在最后的状态行事。

    应用程序启动

    为了检查是否有缓存的道理,当应用程序被启动,我们调用FBSession类方法openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:allowLoginUI设置为NO。这将防止登录的用户界面从显示和会话将被打开只有当缓存的令牌被发现,但不显示登录界面。任何其他openActiveSession *方法将触发相同的流量,只要allowLoginUI设置为NO

    下图显示了状态的会话可以在以后通过openActiveSession *方法被调用allowLoginUI设置为NO。首先,FBSession.activeSession对象在状态下创建FBSessionStateCreatedFBSessionStateCreated是状态的会话时,它存在于,但没有令牌已被发现(还)。在此之后,如果令牌被发现,该会话将过渡到FBSessionStateCreatedTokenLoaded。而且,从FBSessionStateCreatedTokenLoaded,当会话结束后打开它会过渡到FBSessionStateOpen。只有当会话处于打开状态,您可以拨打对方的Facebook的API,只要你有正确的权限。如果找不到令牌,会话将继续留在FBSessionStateCreated

    注意:一旦你创建了一个FBSession.activeSession对象,会话是否成功还是没有打开,活动会话会继续,除非您清除它通过调用相关联的访问令牌存在closeAndClearTokenInformation上的活动会话。

    而不是调用的静态之一openActiveSession *方法,你的应用可以达到同样的流量按照下列步骤:

    1. 调用一个FBSession实例的init函数。
    2. 检查状态值转换为FBSessionStateCreated
    3. 如果状态值FBSessionStateCreated,调用一个FBSession实例打开的功能。

    你想使用这个流程,如果你不能使用静态方法,例如:如果您在缓存标记为FBSession而不是使用内置的机制自己,和需要传递的信息初始化时在会话。

    注册

    登录界面是通过调用触发FBSession类方法,allowLoginUI:completionHandler:openActiveSessionWithReadPermissionsallowLoginUI设置为YES强行登录用户界面的显示。

    在iOS6的+,试图使用OS的Facebook系统帐户登录。如果Facebook的系统帐户没有设置,登录回退到使用快速应用程序切换到了Facebook的iOS应用或移动Safari。

    在iOS6的+登录流程如下所示:

    最初阶段是在FBSessionStateCreated。因为我们迫使SDK中通过使用显示登录对话框allowLoginUI:是,我们的会议将立即过渡到FBSessionStateCreatedOpening,然后显示登录对话框FBSessionStateCreatedOpening是状态的会话中,当试图登录的用户通过用户界面是正在进行中。如果用户单击OK(确定),状态转换到FBSessionStateOpen。如果用户点击不允许的状态转换为FBSessionStateClosedLoginFailed。如果未能打开,你可以显示给用户的会话返回错误信息,我们将看到更多的是,当我们面对同样的文档中处理错误。

    另外,快速应用程序切换的登录流程如下所示:

    正如我们已经被迫在登录界面与allowLoginUI:是的,在会话FBSessionStateCreated过渡到FBSessionStateCreatedOpening之前,应用程序切换到Facebook为iOS或移动Safari。像以前一样,如果用户接受在登录界面的权限,状态转换到FBSessionStateOpen。如果用户触摸的取消按钮,状态转换到FBSessionStateClosedLoginFailed和错误信息提供以及。然而,当所示的对话框,并且当会话状态FBSessionStateCreatedOpening,用户可以按下iOS的Home键。在这种情况下,Facebook的为iOS没有路径发送有关中断的信息在登录流程。你可以通过调用处理这个FBAppCallhandleDidBecomeActive方法,你里面:applicationDidBecomeActive在你的应用程序委托的方法。这将清除的流动,并最终过渡状态到FBSessionStateClosedLoginFailed状态。

    要求额外的权限

    我们之前提到的,一旦一个会话处于打开状态,您可以拨打对方的Facebook API的前提是你拥有必要的权限。如果你需要,你的应用程序可以要求额外的权限,当用户进行身份验证。该FBSession实例方法requestNew *用于启动这些流量。

    上图显示了用户登录的系统帐户为iOS6的设备的流量。的流动是基本相同的快速应用程序切换的情况。如果用户接受的其他权限,会话状态转换到FBSessionStateOpenTokenExtended

    如有必要,Facebook的SDK时会自动刷新用户的会话。当它这样做,国家也转换到FBSessionStateOpenTokenExtended状态。

    如果用户拒绝接受额外的权限则状态不转变,仍然在任FBSessionStateOpenFBSessionStateOpenTokenExtended

    注销

    当用户点击退出按钮,closeAndClearTokenInformation方法被调用的活动会话,导致以下流程:

    这无论从过渡状态FBSessionStateOpenFBSessionStateOpenTokenExtended,在''''开放状态,给FBSessionStateClosed

    closeAndClearTokenInformation关闭会话清除任何缓存信息,摧毁了会议。这意味着当应用程序重新启动缓存的令牌将不可用。登录视图将被显示。

    另外,调用密切的一个方法FBSession也转换了状态FBSessionStateClosed但缓存信息不会被清除和令牌可在下次应用程序启动时可以重复使用。使用接近在应用程序委托的方法applicationWillTerminate:方法是一个很好的做法,引发了清理,依赖于一个开放的会话中的任何依赖对象。

    一些需要注意的事项

    • 会话只能打开一次。当会话关闭时,它不能被重新打开。相反,一个新的会话应该创建。典型的应用程序只需要在任何时候一个活动会话。Facebook的SDK提供了需要开辟新的会话实例护理静态活动会话的方法。

    • 可使用SDK来打开一个会话的不同的方法可采取完成处理程序。该处理器成为与该会话实例相关联,并为以下状态变化被调用:打开OpenTokenExtended休息,和ClosedLoginFailed

    管理权限

    在本节中:


    概观

    在基本的登录流程,你的应用程序接收到访问一个人的公众形象和好友列表。为了访问他们的Facebook个人资料的其他元素,或将内容发布到Facebook代表他们,你需要请求必要的权限。这些权限可以在初始登录时或在应用程序的经验,任何其它点要求。

    如果你想使一个请求到Facebook代表用户,你需要或者检查是否有必要的权限,如果没有请他们,或者直接提出请求并处理缺少权限误差要求的权限和重试。

    此外,使用您的应用程序的人可以从Facebook的用户界面撤消权限,但你也可以实现一个机制,从您的应用程序中,如果你想这样做这样做。您也可以让用户从你的应用程序中删除基本的登录权限,通过实施机制完全撤销登录。

    在这部分的指导,我们将引导您完成:

    • 在登录请求权限
    • 检查权限
    • 处理缺失权限
    • 要求额外的权限
    • 撤消权限
    • 撤销登录

    你可以找到关于不同的可用权限,他们在我们的意思是什么样的信息权限参考


    在登录请求权限

    当有人使用Facebook登录的应用程序的连接,应用程序可以访问他们的公众形象和好友列表,信息是对所有人都可见的碎片。要创建这个基本的连接,应用程序必须始终通过询问的请求访问一个人的公开个人资料信息public_profile许可。同样,所有其他部分的信息,有人增加了他们的Facebook的个人资料作抵押落后于其他的读取权限。应用程序还需要发布的权限,以发布内容的用户的代表。如果您想了解更多有关权限,你可以看看我们的权限参考

    你可以要求任意数量的读取权限或登录期间发布的权限。然而,作为一般规则,更权限的应用程序的请求,就越有可能是人们接受许可请求并继续登录过程。我们的研究表明,提出了四个多权限的应用程序体验中完成登录的次数显著下降了。请求发布权限与publish_actions登录过程中会提示在登录界面第二步,因为他们有自己的发布权限的登录界面后,显示屏幕的要求,这可能会导致更少的人登录。因此,我们建议您请求的读取权限最低限度登录时再要求任何额外或发布权限,当一个人真正需要他们。

    您可以了解如何优化您的权限请求在这里

    要问权限登录你可以使用openActiveSessionWith *权限:*方法。以下是要求的一个例子public_profile(必需)和user_birthday阅读权限:

    (必须)与public_profile / /打开会话和user_birthday阅读permissions 
    [ FBSession openActiveSessionWithReadPermissions :@[@ "public_profile" ,  @ "user_birthday" ] 
                                       allowLoginUI : YES
                                  completionHandler : 
         ^( FBSession  * session ,  FBSessionState state ,  NSError  * error )  { 
           __block NSString  * alertText ; 
           __block NSString  * alertTitle ; 
           if  (! error ){      
             //如果会话被成功打开
             ,如果 状态==  FBSessionStateOpen ){ 
             / /你的代码在这里
    
           }  否则 { 
             / /有错误,处理它
             ,如果 ([ FBErrorUtility shouldNotifyUserForError 错误]  == YES ){ 
               / /错误要求人们使用的应用程序,使应用程序恢复外的动作
               / /该SDK将提供一个我们必须向用户显示错误信息
               alertTitle =  @ “去的东西wrong" ; 
               alertText =  [ FBErrorUtility userMessageForError : error ]; 
               [[[ UIAlertView alloc ] initWithTitle : alertTitle
                                  消息alertText
                                  代表自我
                        cancelButtonTitle :@ “OK!” 
                        otherButtonTitles ] ];
    
             }  否则 { 
               / /如果用户取消 
                    取消“ ; 
                 alertText =  @ “你的生日也不会在我们的日历输入,因为你没有授予的权限”。; 
                 [[[ UIAlertView 的alloc ] initWithTitle alertTitle
                                  消息alertText
                                  代表自我
                        cancelButtonTitle :@ “OK!” 
                        otherButtonTitles ] ];
    
               }  其他 { 
                 / /为了简单起见,此示例中,对于所有其他错误,我们展示一个通用的消息
                 / /你可以阅读更多有关如何处理其他错误在我们处理错误 
                 
                    出了问题“ ; 
                 alertText =  [ NSString的stringWithFormat :@ “请重试。 n
                               如果问题仍然存在,请联系我们,何况这个错误代码:%@“  
                               [ errorInformation objectForKey :@ “消息” ]] 
                 [[[ UIAlertView 的alloc ] initWithTitle alertTitle
                                  消息alertText
                                  代表自我
                        cancelButtonTitle :@ “OK!” 
                        otherButtonTitles ] ]; 
               } 
             } 
           } 
         } 
       }];

    如果你正在初始化,然后手动打开会话,你可以将权限添加到会话你正要使用初始化会话打开initWithPermissions: ,或通过指定会话的权限属性,一旦会话被初始化。


    检查权限

    Facebook提供人完全控制他们授予应用程序的权限。用户可以撤销他们从Facebook的隐私设置,在任何时候给予你的应用程序的权限。他们也可以拒绝共享权限与您的应用程序在登录时。因此,应用程序应该检查权限的当前有效性试图执行一个API调用之前,例如,检查publish_actions尝试出版一本打开图的故事之前,还是理所当然的。下面是一个例子:

    / /检查发布 
          
                               
                                   数据] objectAtIndex 0 ]; 
                                如果 ([!权限objectForKey :@ “publish_actions” ]){ 
                                  / /发布权限没有找到,问publish_actions 
                                  [ 自我requestPublishPermissions ];
    
                                }  否则 { 
                                  / /找到发布权限,发布OG故事
                                  [ 自我publishStory ]; 
                                }
    
                              }  否则 { 
                                / /有错误,处理它
                                / /见https://developers.facebook.com/docs/ios/errors/
                               } 
                            }];

    处理缺失权限

    如果您检查是否尝试使用需要它们的API之前,相应的权限,你可千万别碰上缺少的权限错误。但是,您可报考一个API调用,只要求权限的情况下,第一次调用由于权限不在场失败。如果你需要检测缺少权限的错误,您可以使用使用者资讯的NSError物业,该SDK将返回。如果错误是由缺少权限引起的,它的使用者资讯会看起来像这样:

     { 
        “com.facebook.sdk:ErrorSessionKey”  =  “<FBSession:0xa2115f0,状态:FBSessionStateOpen,loginHandler:0xa211800,的AppID:462857150476058,urlSchemeSuffix:,tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xa1567a0>,到期日期:2013年11月24日22:25 :07 +0000,refreshDate:2013年9月25日22:25:08 +0000,attemptedRefreshDate:0001-12-30 00:00:00 +0000,权限:( N “public_profile ”, n 
          
                                      需要延长许可:publish_actions“ ; 
                    类型=  OAuthException ; 
                }; 
            }; 
            代码=  403 ; 
        }; 
    }

    处理缺少权限时,您可以找到关于最佳做法的详细信息在这里


    要求额外的权限

    您可以在任何时候要求提供活动会话额外的权限。事实上,我们建议您要求的权限时,您的应用程序实际上需要他们完成由用户发起的行动。你可以阅读更多有关优化权限请求在这里

    下面的示例显示了如何请求publish_actions发布权限,活动会话。

    / /请求publish_actions 
    [ FBSession activeSession requestNewPublishPermissions :[ NSArray arrayWithObject :@ "publish_actions" ] 
                                          defaultAudience : FBSessionDefaultAudienceFriends 
                                        completionHandler :^( FBSession  * session ,  NSError  * error )  { 
                                          __block NSString  * alertText ; 
                                          __block NSString  * alertTitle ; 
                                          if  (! error )  { 
                                            if  ([ FBSession . activeSession . permissions
                                                 indexOfObject :@ “publish_actions” ]  ==  NSNotFound ){ 
                                              / /没有权限授予,告诉用户我们不会公布
                                              alertTitle =  @ “未授予权限” ; 
                                              alertText =  @ “你的行动将不会被发表到Facebook。” ; 
                                              [ [[ UIAlertView 的alloc ] initWithTitle alertTitle
                                                              消息alertText
                                                              代表自我
                                                    cancelButtonTitle :@ “OK!” 
                                                    otherButtonTitles ] ]; 
                                            }  否则 { 
                                              / /授予权限,发布OG故事
                                              [ 自我publishStory ]; 
                                            }
    
                                          }  否则 { 
                                            / /有错误,处理它
                                            / /见https://developers.facebook.com/docs/ios/errors/
                                           } 
                                        }];

    撤消权限

    应用程序可以让人们删除,或撤销先前授予的特定权限。例如,应用程序可以有一个设置页面,让人们禁用特定的功能,如出版行为,和应用程序可以撤销publish_actions同时许可。

    您可以通过拨打电话到图形API端点撤销特定的权限。如果请求成功,您会收到真正的回应。在这个例子中,我们撤销publish_actions权限:

    [ FBRequestConnection startWithGraphPath :@ "/me/permissions/publish_actions" 
                                   parameters : nil 
                                   HTTPMethod :@ "delete" 
                            completionHandler :^( FBRequestConnection  * connection , id result ,  NSError  * error )  { 
                              __block NSString  * alertText ; 
                              __block NSString  * alertTitle ; 
                              if  (! error && result ==  true )  { 
                                //撤销许可工作
                                alertTitle =  @ “权限成功撤销” ; 
                                alertText =  @ “这个程序将不再发布到Facebook代表您。”
    
                              }  否则 { 
                                / /有错误,处理它
                                / /见https://developers.facebook.com/docs/ios/errors/
                               }
    
                              [[[ UIAlertView 的alloc ] initWithTitle alertTitle
                                                          消息alertText
                                                          代表自我
                                                cancelButtonTitle :@ “OK!” 
                                                otherButtonTitles ] ]; 
                            }];

    撤销登录

    同样,你可以撤销所有权限的应用程序,通过做一个图表API调用,删除所有权限。要做到这一点,您可以使用代码在上面的例子中,改变请求的路径/我/的权限

    登录对话框

    在本节中:


    概观

    当使用您的应用程序一个人试图与Facebook登录,它们将显示在Facebook的登录对话框中的一个。这些对话框的功能是允许登录的人进行身份验证并授予必要的权限给你的应用程序。此外,他们确保登录并授予权限的人意识到,他们正在这样做。其结果是,在登录对话框不能被旁路。

    有不同的对话框的Facebook的SDK的的iOS可以呈现给一个人谁是登录到您的应用程序使用Facebook。选项有独立的选择(无论是通过实现登录的方式登录Facebook的按钮使用API调用自定义UI):SDK将自动为您选择最佳的选择,没有什么你需要在你的代码改变。

    本节描述了不同的登录对话框,每个人的优点和缺点,以及可用的选项,如果你想自定义的经验。


    Facebook的原生应用程序登录对话框

    Facebook的原生应用程序登录对话框是完全天然的。提出这个对话框中为Facebook的iOS应用软件做一个快速的应用程序开关,带来了对Facebook的iOS应用软件的前景被所示的对话框,同时,并将控制权返回给你的应用程序,一旦用户完成与它进行交互。为了让这个对话合作,Facebook的应用程序的名称必须在你的应用程序的。plist中下键指定FacebookDisplayName。这个键的值必须是完全匹配的显示名称字段下在Facebook的应用程序仪表板设置的值。

    产品优点:

    • 100%原生,快。

    缺点:

    • 需要为Facebook的iOS应用软件V6.0 +安装。


    iOS的原生登录对话框

    在iOS原生的登录对话框是苹果的一个特征Facebook的整合。如果人们通过他们的iOS设置登录到Facebook,他们可以使用这些凭据进行身份验证到你的应用程序。这是一个设备级认证,这意味着一个人有登录到您的应用程序,他们利用每个设备上。

    产品优点:

    • 100%原生,快。
    • 登录流量不转换关闭您的应用程序。

    缺点:

    • 只有当使用您的应用程序日志中到Facebook通过人的iOS 6 +中使用。
    • 没有视觉提示,例如:配置文件被认证的人的照片。
    • 简化版,当被要求发布权限提供隐私选择器给用户。

    特别注意事项:

    • 采用了iOS原生登录对话框要求您要求的权限时,有一些特殊的考虑。您可以在阅读它的iOS集成指南


    Facebook的应用程序的Web登录对话框

    提出了在此登录对话框的Facebook的iOS应用。它相当于Facebook的原生应用程序登录对话框基于Web的。时,不支持,因为安装了旧版本的Facebook的为iOS应用程序的原生版本,它会显示。

    产品优点:

    缺点:

    • 基于Web的对话往往要慢一些。


    移动Safari浏览器登录对话框

    这个登录对话框时在移动Safari。它的后备对话框显示的时候其他对话框不可用的设备上 - 例如,当一个用户没有Facebook应用程序安装或通过IOS是不是登录到Facebook上。

    产品优点:

    • 不依赖于具有Facebook上的安装iOS应用的人。

    缺点:

    • 基于Web的对话往往要慢一些。
    • 通常需要的人进入他们的凭据登录到Facebook上的移动Safari浏览器,因为人们通常不登录Facebook在他们的移动浏览器。


    嵌入的WebView登录对话框

    这个登录对话框呈现在你的应用程序嵌入的WebView。这是永远不会由SDK自动显示唯一的对话框。你必须经过特别配置以触发将提交该对话框的代码。当出现此对话框中的人的用户名和密码,必须填写所要求的权限都之前。

    产品优点:

    • 登录流量不转换关闭您的应用程序。

    缺点:

    • 基于Web的对话往往要慢一些。
    • 人们不得不在他们的登录凭据每次通过登录流动时间填写。

    特别注意事项:

    • 您将需要专门修改您的登录代码来触发此对话框。你可以学习如何做到这一点在下面的部分,登录对话框流和控制


    控制登录对话框

    Facebook的SDK时会自动选择基于一个人的装置的帐户设置和功能的最佳登录对话框流量。这是Facebook的SDK实现默认的序列:

    1. Facebook的原生应用程序登录对话框
    2. Facebook的应用程序的Web登录对话框
    3. 移动Safari浏览器登录对话框

    如果Facebook帐户没有设置,Facebook的SDK的检查,看看Facebook的应用程序是安装在设备上。如果安装了Facebook应用程序,如果它的支持,提出了Facebook应用程序本地登录对话框。如果无法显示Facebook的原生应用程序登录对话框,因为有一个老版本的应用程序,是提出了Facebook应用程序的Web登录对话框。如果未安装Facebook应用程序,移动Safari启动,显示移动Safari浏览器登录对话框。

    您可能希望控制登录对话框的备用流。

    您可以通过调用打开一个网站会做到这一点openWithBehavior:completionHandler:在一个方法FBSession实例。通过在任何FBSessionLoginBehavior *参数,例如:

    / /初始化一个会话对象
    FBSession  * 会话=  [[ FBSession 的alloc ] 初始化] 
    / /设置活动的会话
    [ FBSession setActiveSession 会话]; 
    / /打开会话
    [ 会话  
                                
                                  
                应对会话状态的改变,
                / /例如:更新视图
            }];

    默认情况下,嵌入的WebView不是默认流的一部分。要添加它作为一个选项,打开使用的一个网站会话openWithBehavior:completionHandler:该方法FBSession类,并通过在这些中的一个FBSessionLoginBehavior参数:

    参数流程说明

    FBSessionLoginBehaviorWithFallbackToWebView

    Facebook的应用程序原生>的Facebook应用程序的Web>移动Safari>嵌入的WebView

    FBSessionLoginBehaviorForcingWebView

    嵌入的WebView

    FBSessionLoginBehaviorWithNoFallbackToWebView设置绕过嵌入的WebView。

    管理自己的令牌缓存

    在本节中:


    概观

    Facebook的SDK适用于iOS会自动存储和获取有关Facebook的会话管理数据,你的应用程序的照顾。Facebook的SDK中,通过缓存执行此FBSession默认令牌相关的数据。您可以选择自行管理缓存的数据,也许通过你的存储服务器上的这个数据。对于大多数应用程序,你会希望让Facebook的SDK处理令牌缓存,但也有几种情况时,您可能想自己做:

    • 如果你有多个用户登录同一台设备上(您将需要处理多个令牌)。
    • 如果你想提供给用户进行的跨不同设备的无缝登录体验(如果用户登录在一台设备,你给他记录在其他设备使用相同的标记)。
    • 如果你只是喜欢令牌本地存储在您的服务器,而不是作为一个额外的安全层。

    远程缓存通常是在与提供自己的登录机制,除了Facebook登录应用程序一起使用。

    您可能还需要通过一些其他途径创建的令牌。你可以使用自己的缓存策略来导入这些标记到你的应用程序。

    在本节中,我们将介绍你所需要知道管理自己的令牌缓存。如果你还没有这样做,我们建议您通过阅读理解会话部分本文件以获得Facebook的会议是如何工作的概述。

    我们将首先解释令牌缓存是如何工作的,然后我们将通过令牌缓存实现的示例。如果你想实现多个用户登录到您的应用程序的支持,因为是很常见的平板电脑的应用程序,你可能要检查的SwitchUserSample应用程序,捆绑在一起的SDK,它展示了这个场景。该SwitchUserSample应用程序演示了如何允许一定数量的用户在登录到应用程序,并根据存储在一个不同的密钥每个用户的会话数据NSUserDefaults

    如果远程缓存会话数据,那么你应该禁用iOS6的本地登录对话框流量。本机登录流程需要用户从每个设备登录。中央令牌缓存机制违反了这一原则,并可能导致身份验证过程中不一致的用户体验。

    如何令牌缓存作品

    FBSessionTokenCachingStrategy类负责管理缓存的数据。该数据是一个NSDictionary中,并存储在NSUserDefaults下的特定键。为了处理自己的缓存,你将需要创建一个子类的自定义类FBSessionTokenCachingStrategy并重写方法:

    • 保存权杖数据:cacheTokenInformation:cacheFBAccessTokenData: 。这些方法调用的时候FBSession过渡到FBSessionStateOpenFBSessionStateOpenTokenExtended状态,登录流量或时期间额外的权限授予。覆盖cacheFBAccessTokenData:方法,除非你缓存更多的数据,这不是在FBAccessTokenData。如果你需要额外的缓存数据,覆盖cacheTokenInformation: 。该cacheFBAccessTokenData:方法以一个FBAccessTokenData输入。

    • 检索令牌数据:fetchTokenInformationfetchFBAccessTokenData。检查有效的令牌时,这些方法被调用时,例如当openActiveSession *:allowLoginUI:否被调用。覆盖fetchFBAccessTokenData方法,除非你缓存更多的数据,这不是在FBAccessTokenData。如果缓存更多的数据,覆盖fetchTokenInformation。该fetchFBAccessTokenData方法应该返回一个FBAccessTokenData对象。

    • 清除令牌数据:ClearToken中。当所谓的closeAndClearTokenInformation被称为上FBSession对象。

    FBAccessTokenData令牌数据包含用户的ACCESS_TOKEN和到期日期,以及包含在该令牌上次刷新的日期和登录触发的登录流程,例如,如果它是一个iOS6的+系统帐户登录类型的其他数据。

    当Facebook的SDK管理令牌数据缓存,它存储在NSUserDefaults下一个名为'' FBAccessTokenInformationKey键''。若要修改其中的数据存储的关键,你需要创建的实例FBSessionTokenCachingStrategy使用类initWithUserDefaultTokenInformationKeyName:方法,并通过它,你想使用的键名。然后你需要把你的实例传递FBSessionTokenCachingStrategy到FBSession类的初始化方法。Facebook的SDK将存储在您所选择的密钥的令牌数据。


    先决条件

    为起点,此文档的代码上可以找到GitHub上。如果你还没有这样做,克隆的how-to样本为Facebook SDK 3.5

    git clone命令的https / / github.com/fbsamples/ios-3.5-howtos.git
    

    然后在打开Xcode项目TokenCacheHowTo /初始文件夹。


    样本概况

    完整的示例,用户可以通过Facebook登录。幕后的缓存行为被改变,以展示以下两种情况:

    1. 本地设备高速缓存:在这种情况下,令牌数据缓存在本地设备上,但在从默认的Facebook SDK的位置,不同的位置。从用户的角度来看的经验比默认的没有什么不同。

    2. 远程服务器的缓存:在这种情况下,令牌数据被缓存在服务器上。令牌数据可以从多个设备访问。这让第一次使用到一台设备上登录,进入到第二个设备,启动相同的应用程序,并与记录在体验开始。

    此示例的用户界面(UI)主罚者通过登录流量和使用Xcode的调试消息来验证缓存功能:

    供大家参考,已完成的样品也可以在GitHub上。已完成的样品有一个叫做标志kLocalCacheMyTokenCachingStrategy.m文件,允许你测试本地缓存与远程缓存。

    的初始代码概述

    最初的Xcode项目有Facebook登录实现的。它包括所有你需要设置示例用户界面组件。现在缺少的是Facebook的功能,您将添加管理自己的缓存。

    在该项目中使用的主要类和nib文件是:

    • AppDelegate.m:包括Facebook登录实现支持代码。

    • ViewController.m:包括一个方法来处理是通过从应用程序委托通知触发会话状态的回调。在这个类中的登录按钮的方法调用的应用程序委托实现文件相应的方法进行登录或注销的人。

    • ViewController.xib:包含一个按钮与对象的动作绑在一个方法的ViewController实现类。该按钮连接到电源插座,控制按钮上的文字显示在登录或注销状态。


    第1步:设置本地缓存

    在这个步骤中,您将设置一个自定义的类来处理令牌缓存任务和修改FBSession开放的方法来使用你的自定义类。

    被缓存的数据是一个NSDictionary中的对象,您可以将其存储在属性列表中,并利用NSDictionary的方法,让你写和从属性列表读取。

    步骤1a:创建一个自定义子类

    通过右键单击该项目文件夹中创建一个新的类文件>新建文件> Objective-C类模板。将该类命名为'''' MyTokenCachingStrategy并选择NSObject类作为子类。

    接下来,打开MyTokenCachingStrategy头文件并进行以下代码更改:

    #进口 
    #进口 @接口MyTokenCachingStrategy:NSObject的
    @接口MyTokenCachingStrategy:FBSessionTokenCachingStrategy
    

    打开MyTokenCachingStrategy实现文件。首先,创建属性和定义的用来在本地缓存中的数据的属性列表中的位置的辅助方法:

    ... 
    #导入“MyTokenCachingStrategy.h”
    
    / /本地缓存-唯一的文件信息
    静态 的NSString * kFilename =  @ “TokenInfo.plist” ;
    
    @interface  MyTokenCachingStrategy  () 
    @property  ( nonatomic , strong )  NSString  * tokenFilePath ; 
    -  ( NSString  *) filePath ; 
    @end
    
    @实施 MyTokenCachingStrategy
    
    -  ID 的init
     { 
        自我 =  [ 的init ]; 
        如果 个体经营 { 
            _tokenFilePath =  [ 文件路径]; 
        } 
        回归 自我; 
    }
    
    -  ( NSString  *) filePath { 
        NSArray  * paths = 
        NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory , 
                                            NSUserDomainMask , YES ); 
        NSString  * documentsDirectory =  [ paths lastObject ] 
        返回 [ documentsDirectory stringByAppendingPathComponent kFilename ]; 
    } 
    ...

    接下来,添加了读取和写入属性列表文件的辅助方法:

    -  无效的WriteData :(NSDictionary中 *)数据{ 
        的NSLog (@ “文件=%@和数据=%@”  自我tokenFilePath 数据); 
        BOOL成功=  [ 数据将writeToFile 自我tokenFilePath原子;] 
        如果 (!成功 { 
            的NSLog (@ “写入文件时出错” ); 
        } 
    }
    
    -  ( NSDictionary  *) readData { 
        NSDictionary  * data =  [[ NSDictionary alloc ] initWithContentsOfFile : self . tokenFilePath ]; 
        NSLog (@ "File =%@和数据=%@“  自我tokenFilePath 数据),
        返回的数据; 
    }

    最后,实施FBSessionTokenCachingStrategy的处理持久性,检索和的缓存令牌信息结算类方法:

    -  ( void ) cacheFBAccessTokenData :( FBAccessTokenData  *) accessToken { 
        NSDictionary  * tokenInformation =  [ accessToken词典] 
        [ 自我的WriteData tokenInformation ]; 
    }
    
    -  ( FBAccessTokenData  *) fetchFBAccessTokenData
     { 
        NSDictionary  * tokenInformation =  [ self readData ]; 
        if  ( nil  == tokenInformation )  { 
            return  nil ; 
        }  else  { 
            return  [ FBAccessTokenData createTokenFromDictionary : tokenInformation ]; 
        } 
    }
    
    -  无效的ClearToken
     { 
        [ 自我的WriteData :[ NSDictionary中dictionaryWithObjectsAndKeys ]]; 
    }

    步骤1b:使用自定义类打开会话

    打开应用程序委托执行文件。

    首先,导入自定义的类的头文件:

    #导入“MyTokenCachingStrategy.h”    

    接下来,添加一个私有属性令牌缓存对象:

    @接口 的AppDelegate  ()
    @属性 非原子 MyTokenCachingStrategy  * tokenCaching ; 
    @结束
    ...

    接下来,打开应用程序委托实现类并更换openSessionWithAllowLoginUI:以下定义:

    -  BOOL openSessionWithAllowLoginUI :(BOOL allowLoginUI { 
        BOOL openSessionResult = NO ; 
        / /设置令牌的策略,如果需要的话
        ,如果  == _tokenCaching  { 
            _tokenCaching =  [[ MyTokenCachingStrategy 的alloc ] 初始化]; 
        } 
        / /初始化会话对象与 
          
        如果显示登录界面,或者如果一个缓存的令牌可用,
        / /然后打开会话。
        如果 allowLoginUI | | 会话状态==  FBSessionStateCreatedTokenLoaded  { 
            / /为了进行调试日志,如果缓存的标记被发现
            ,如果 会话状态==  FBSessionStateCreatedTokenLoaded  { 
                的NSLog (@ “。发现缓存标记” ); 
            } 
            / /设置活动的会话
            [ FBSession setActiveSession 会话]。
            。/ /打开会话
            [ 会话 
                                        
                                          
                        
                                            状态状态
                                            错误错误] 
                    }] 
            / /返回结果-将被设置为从会话立即打开
            。/ /打开电话,如果是以前发现了一个缓存的令牌
            openSessionResult = 会话isOpen会; 
        } 
        返回openSessionResult ; 
    }

    生成并运行该项目,以确保它运行没有错误。点击登录按钮之前,您应该会看到一个调试消息,发现令牌的数据是。点选''''登录按钮与Facebook登录。一旦通过验证,按钮上的文字应改为''''注销。登录流程完成后,你应该看到的消息显示,保存在令牌数据。

    停止从Xcode中运行的应用程序。您的测试设备,双击Home键,并从那里运行以及停止的应用程序。启动应用程序来测试缓存数据获取流量。按钮应该说''''退出作为缓存的数据从缓存的位置读取。

    从Xcode中重新启动应用程序。点选''''退出按钮,并确认按钮上的文字更改为''''登录。您应该看到令牌的数据是空的调试消息。停止从Xcode中运行的应用程序一次,并确保应用程序是不是你的测试设备上运行。启动应用程序。按钮应该说''''登录,因为没有令牌数据已经在缓存中被发现。

    与你到哪儿去登录到Facebook帐户系统上的iOS6​​的+设备的测试。验证登录流量使用的iOS原生登录对话框。


    第2步:设置远程缓存

    在这个步骤中,你将本地存储在服务器上的标记数据,而不是。

    您将添加服务器端代码来处理传入的令牌数据和客户端代码来发送和接收该数据。

    步骤2a:设置服务器端代码

    来测试服务器端的缓存数据存储,你会建立一个处理HTTP POST请求来存储数据令牌和一个简单的端点HTTP GET请求来获取令牌数据。端点返回与该设置一个'成功'参数JSON响应以'真'时,数据被存储或检索的成功和被设置为'假'在其他情况下。

    如果你没有自己的后端服务器,可以考虑使用解析。服务器端的代码示例使用PHP编写,但是你可以采取相同的概念,并将其应用于你支持执行堆栈。

    创建一个文件,并将其命名为'''' token.php和承载它的服务器上。将以下内容添加到文件中:

    <?PHP
     / /版权所有2004年至今的Facebook。保留所有权利。
    
    / /强制HTTPS上 
           “https://开头 $ _SERVER [ “HTTP_HOST” ]  $ _SERVER [ “REQUEST_URI” ]); 
      退出(); 
    }
    
    / /如果POST,保存权杖的数据,并返回一个成功标志。
    / /如果GET,检查独有的信息发送回一个保存权杖的数据。
    
        
         
        获取唯一的id传递
        $ UNIQUE_ID = 用strip_tags $ _REQUEST [ 'UNIQUE_ID' ]); 
        / /使用唯一的ID来创建数据存储文件
        $ token_filename = $ UNIQUE_ID  'TXT' ; 
        $文件= 目录名__FILE__   '/数据/'  $ token_filename ; 
        / /获取令牌数据信息
        $ auth_response [ 'token_info' ]  = 用strip_tags $ _REQUEST [ 'token_info' ]); 
        / / JSON编码的数据
        $数据= 的json_encode $ auth_response ) ; 
        / /创建一个新文件或覆盖 
                     无法写入文件 
             
        
                 数据输入。“ ; 
      } 
    }  否则 ,如果 $ _SERVER [ 'REQUEST_METHOD' ]  ==  'GET'  { 
      如果 使用isset $ _REQUEST [ 'UNIQUE_ID' ])) { 
        / /获取唯一的id传递
        $ UNIQUE_ID = 用strip_tags $ _REQUEST [ 'UNIQUE_ID' ]); 
        / /使用唯一的id找到检查文件
        $ token_filename = $ UNIQUE_ID  'TXT' ; 
        $文件= 目录名__FILE__   '/数据/'  $ token_filename ; 
        / /获取该文件的内容和解码JSON 
                      无法读取文件内容或数据空' ; 
        }  否则 { 
          / /返回令牌     
        
                 数据 
      
               方法:'  $ _SERVER [ 'REQUEST_METHOD' ]; 
    }
    
    回声的json_encode $反应);

    创建一个名为''''数据在PHP文件驻留在同一个目录下的目录。如果您将数据存储在不同的目录,例如:文档的Web根目录以外,一定要相应地修改'''' token.php文件。

    注:出于安全原因,在生产设置你不会存储令牌数据在文件系统中,尤其是如果它是从网上方便。真实的场景中会涉及到存储在数据库中的信息。此外,UNIQUE_ID可以通过这是由你的服务器所产生的第三者会议上表示。因此,一个可能的用户流程,更安全的可能是以下几点:

    • 用户打开你的应用程序,并通过不同的登录机制进行身份验证对您的服务器。您的应用程序从服务器获取会话(第三方会话)。
    • 您的应用程序使用第三方会话信息拨打电话到您的服务器,检查是否有缓存Facebook的令牌。
    • 当Facebook的令牌数据需要被存储,你的服务器使用的是第三方会话信息调用。本次会议的信息是用来获取用户信息和用户信息是反过来用来存储Facebook的标记数据。
    • 用户打开你的应用程序和缓存的令牌需要进行检查接下来的时间,服务器代码的第三方会话映射到一个用户,检查它的数据库中检索令牌数据。

    步骤2b:修改远程存储的自定义类

    打开MyTokenCachingStrategy头文件,并添加用于识别远程缓存支持用户的公共属性:

    / /在实际应用这个唯一标识用户和东西
    / /应用程序知道一个FBSession开放之前尝试。
    @属性 非原子 的NSString  * thirdPartySessionId ;

    打开MyTokenCachingStrategy实现文件。进行以下修改,以删除与本地文件缓存的性能和helper方法和添加这些用于远程数据缓存:

    ...
    #导入“MyTokenCachingStrategy.h”
    
    
    / /本地缓存 - 唯一的文件信息
    静态的NSString * kFilename = @“TokenInfo.plist”;
    
    @接口MyTokenCachingStrategy()
    @属性(非原子,强)的NSString * tokenFilePath;
    - (的NSString *)文件路径;
    @结束
    
    
    @实施MyTokenCachingStrategy
    
    - (id)的初始化
    {
        自= [超级初始化];
        如果(个体经营){
            _tokenFilePath = [个体经营文件路径];
            _thirdPartySessionId = @“”;
        }
        回归自我;
    }
    
    
    - (的NSString *)文件路径{
        NSArray的*路径=
        NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                            NSUserDomainMask,YES);
        的NSString * documentsDirectory = [路径lastObject];
        返回[documentsDirectory stringByAppendingPathComponent:kFilename];
    }
    
    ...
    

    你会看到在错误的WriteData:READDATA由于删除的方法tokenFilePath财产。你会被换出这些方法在短期内如此忽略这些错误现在。

    接着,添加代码来设置远程缓存:

    / /远程缓存-后端服务器
    的静态 的NSString * kBackendURL =  @ “<YOUR_BACKEND_SERVER> / token.php” ;
    
    / /远程缓存-日期格式
    静态 的NSString * kDateFormat =  @ “YYYY-MM-dd'T'HH:MM:ss.SSSZZZ” ;
    
    @实施 MyTokenCachingStrategy 
    ...

    更换<YOUR_BACKEND_SERVER>与路径到你存储端点token.php或者您的令牌缓存端点。

    接下来,添加用于处理服务器的响应助手代码。这是要使用的的WriteData:READDATA方法:

    / *
     * Helper方法,用于寻找那些表示日期字符串和
     *将它们转换为NSDate的对象。
     * / 
    -  的NSMutableDictionary  *)dictionaryDateParse  NSDictionary中 *)数据{ 
        / /日期格式,日期检查
        NSDateFormatter * dateFormatter =  [[ NSDateFormatter 的alloc ] 初始化] 
        [ dateFormatter setDateFormat kDateFormat ] 
        / /字典返回
        的NSMutableDictionary  * resultDictionary =  [[ 的NSMutableDictionary 的alloc ] 初始化] 
        / /枚举通过输入字典
        [ 数据enumerateKeysAndObjectsUsingBlock :^(ID密钥ID OBJ BOOL * 停止 { 
            / /检查字符串是日期
            ,如果 ([ obj的isKindOfClass :[ NSString的 ]] ) { 
                的NSDate  * objDate =  ; 
                BOOL而isDate =  [ dateFormatter getObjectValue :&objDate
                                                  forString OBJ
                                           ErrorDescription中]; 
                如果 而isDate  { 
                    resultDictionary [ 关键]  = objDate ; 
                    [ resultDictionary的setObject objDate forKey 关键]; 
                }  否则 { 
                    resultDictionary [ 关键]  = obj的; 
                } 
            }  否则 { 
                / /非字符串,只是不停地为-是
                resultDictionary [ 关键]  = obj的; 
            } 
        }] 
        返回resultDictionary ; 
    }
    
    / *
     * Helper方法来检查后端服务器的响应
     *用于读取和写入。
     * / 
    -  的NSDictionary  *)用handleResponse :(NSData的 *)responseData { 
        NSError  * jsonError =  ; 
        ID结果=  [ NSJSONSerialization  JSONObjectWithData responseData
                                                    选项0 
                                                      错误:&jsonError ]; 
        如果 jsonError  { 
            返回 ; 
        } 
        / /检查格式正确的反应
        ,如果 ([ 结果isKindOfClass :[ NSDictionary中 ]]  && 
            结果[@ “ 地位” ]) { 
            / /检查如果我们得到了一个成功案例回
            BOOL成功=  [ 结果[@ “ 身份” ] boolValue ]; 
            如果 (!成功 { 
                / /处理错误情况下
                的NSLog (@ “错误:%@” 导致[@ “ 的errorMessage” ] ); 
                返回 ; 
            }  否则 { 
                / /检查返回的标记数据(在读取请求的情况下)
                ,如果 结果[@ “token_info” ]) { 
                    / /创建令牌的一个NSDictionary data 
                    NSData  * jsonData =  [ result [@ "token_info" ] 
                                        dataUsingEncoding : NSUTF8StringEncoding ]; 
                    if  ( jsonData )  { 
                        jsonError =  nil ; 
                        NSDictionary  * tokenResult = 
                        [ NSJSONSerialization  JSONObjectWithData : jsonData
                                                        选项0 
                                                          错误:&jsonError ]; 
                        如果 jsonError  { 
                            返回 ; 
                        }
    
                        / /检查是否有效的数据返回,即不为零
                        ,如果 ([ tokenResult isKindOfClass :[ NSDictionary中 ]) { 
                            / /解析结果来处理转换为
                            / /日期 
                             
                          
                             
                        
                      
                         
                    
                  
                     
                
            
          
            没有得到任何数据返回“ ); 
            返回 ; 
        } 
    }

    用handleResponse: helper方法后收到响应从读取或写入被调用。在读的情况下,代码调用dictionaryDateParse:方法转换任何的NSString表示日期,对象的NSDate对象。这是为了确保返回的标记数据是在预期的格式。

    接着,添加令牌写入数据到服务器的代码。取代以前存在的WriteData:方法:

    -  无效的WriteData :(NSDictionary中 *)数据{ 
        的NSLog (@ “写-数据=%@” 数据); 
        NSDateFormatter * dateFormatter =  [[ NSDateFormatter 的alloc ] 初始化] 
        [ dateFormatter 
          
          
           
              mutableCopy ] 
            / /枚举通过输入字典
            [ 数据enumerateKeysAndObjectsUsingBlock :^(ID密钥ID 对象BOOL * 停止 { 
                如果([ 对象isKindOfClass :[ NSDate的 ]) { 
                    COPYDATA [ 关键]  =  [ dateFormatter
                    
                
            
              
                                选项0 
                                错误:与错误] 
            如果 错误 { 
                的NSLog (@ “JSON错误:%@” 错误); 
                回报; 
            } 
            jsonDataString =  [[ 的NSString 的alloc ] initWithData jsonData
                                                   编码NSUTF8StringEncoding ]; 
        }
    
        NSURLResponse  * 响应=  ; 
        错误=  ; 
        / /设置一个URL请求后端 
          
                                           
        配置HTTP POST 
        [ 的URLRequest setHTTPMethod :@ “POST” ]; 
        / /通过后的数据:独特的ID和JSON字符串
        令牌/ /表示 
          
                              
        setHTTPBody :[ 的postData dataUsingEncoding NSUTF8StringEncoding ]] 
        / /创建一个同步请求
        的NSData  * responseData =  的NSMutableData  *)[ NSURLConnection的
                                                 sendSynchronousRequest 的URLRequest
                                                 returningResponse :&回复
                                                 错误:与错误] 
        / /处理返回的数据
        [ 自我用handleResponse responseData ]; 
    }

    最后,添加代码以从服务器读取缓存的令牌数据,并为你刚刚定义的helper方法的使用。这段代码取代了以前的READDATA方法:

    -  的NSDictionary  *)READDATA { 
        NSURLResponse  * 响应=  ; 
        NSError  * 错误=  ; 
        / /设置一个URL请求给后端服务器,一个
        具有唯一的ID / / GET请求中传递 
           
          
                                    
        做一个同步请求
        的NSData  * responseData =  的NSMutableData  *)[ NSURLConnection的
                                                 sendSynchronousRequest 的URLRequest
                                                 returningResponse :&回复
                                                 错误:与错误] 
        如果  =!responseData  { 
            / /处理返回的数据
            返回 [ 自我用handleResponse responseData ]; 
        }  否则 { 
            返回 ; 
        } 
    }

    你会发现,令牌数据读取和写入,阻止用户界面同步HTTP调用。这是一个简单的机制,这个示例应用程序,以确保FBSession是在正确的状态,每当应用程序启动。你应该考虑让你的现实世界的应用程序请求异步的,尤其是如果Facebook登录不适合你的应用程序的功能有直接的要求。

    步骤2c:修改会话开放代码

    更改代码来设置唯一标识一个用户的属性。当你初始化你会设置此属性MyTokenCachingStrategy实例。打开应用程序委托执行文件,并添加修改在相关的代码openSessionWithAllowLoginUI:方法:

    ... 
    如果  == _tokenCaching  { 
        _tokenCaching =  [[ MyTokenCachingStrategy 的alloc ] 初始化];
    
        / /硬代码用于演示目的,应设置为
        / /标识应用程序的用户的唯一价值。
        [ _tokenCaching setThirdPartySessionId :@ “213465780” ]; 
    } 
    ...

    限制登录的您允许的类型,谨防不一致,如果用户的设备之一,不具备iOS6的。你会基本上禁用登录使用iOS系统的Facebook帐户凭据的能力。使在下列变化openSessionWithAllowLoginUI:方法在应用程序委托执行文件中找到:

    [会议openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
    [会议openWithBehavior:FBSessionLoginBehaviorWithFallbackToWebView
    

    从测试设备上删除应用程序。

    生成并运行该项目,以确保它运行没有错误。点击登录按钮之前,您应该看到没有找到数据调试消息。点选''''登录按钮与Facebook登录。一旦通过验证,按钮上的文字应改为''''注销。登录流程完成后,你应该看到的消息显示,保存在令牌数据。

    停止从Xcode中运行的应用程序。您的测试设备,双击Home键,并从那里运行以及停止的应用程序。启动应用程序来测试缓存数据获取流量。按钮应该说''''退出作为缓存的数据从缓存的位置读取。

    从Xcode中重新启动应用程序。点选''''退出按钮,并确认按钮上的文字更改为''''登录。您应该看到令牌的数据是空的调试消息。停止从Xcode中运行的应用程序一次,并确保应用程序是不是你的测试设备上运行。启动应用程序。按钮应该说''''登录,因为没有令牌数据已经在缓存中被发现。

    为了测试中央缓存功能,登录到缓存服务器上的标记数据。从测试设备上删除应用程序,以模拟将一个新的设备的用户。从Xcode中重新启动应用程序。该应用程序应该在通过身份验证的状态开始作为缓存的标记数据从服务器读取。你应该看到一个缓存的令牌,发现一个调试消息。

    与你到哪儿去登录到Facebook帐户系统上的iOS6​​的+设备的测试。验证登录流程不使用的iOS原生登录对话框。


    故障排除


    附加信息

  • 相关阅读:
    YOLOv5目标检测源码重磅发布了!
    CSS文本
    CSS3:透明度
    CSS3:HSL和HSLA
    颜色-背景色
    颜色-前景色
    列表 图像 链接
    CSS简介
    标记和插入音频视频
    表单
  • 原文地址:https://www.cnblogs.com/liyufeng2013/p/3794874.html
Copyright © 2020-2023  润新知