如何在请求会话之前检测用户是不是有 iOS 集成 Facebook 帐户设置?

Posted

技术标签:

【中文标题】如何在请求会话之前检测用户是不是有 iOS 集成 Facebook 帐户设置?【英文标题】:How to detect if user have an iOS integrated Facebook account setup before request session?如何在请求会话之前检测用户是否有 iOS 集成 Facebook 帐户设置? 【发布时间】:2012-12-09 23:32:32 【问题描述】:

在我看来,在第一次会话打开请求时,ios 集成了 Facebook,而旧的“应用切换”授权以不同的方式工作。

首先需要以只读权限打开会话,然后在发布时请求发布权限。

旧的需要在第一次请求每个权限,所以应用稍后可以发布(否则不能)。

所以我在我的 facebook 连接方法中拆分了会话打开逻辑:

-(void)connectWithSuccess:(EPPZSuccessBlock) successBlock
                     fail:(EPPZFailBlock) failBlock

    if (FBSession.activeSession.isOpen)
    
        if (successBlock) successBlock();
        [self socialServiceDidConnect:self];
    

    else
    
        //This is what I need to decide somehow.
        BOOL userHaveIntegrataedFacebookAccountSetup = NO;

        if (userHaveIntegrataedFacebookAccountSetup)
        
            //Request for a session with read permissions only, otherwise iOS integrated Facebook will throw me an exception.
            [FBSession openActiveSessionWithReadPermissions:[NSArray arrayWithObject:@"user_about_me"]
                                               allowLoginUI:YES
                                          completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
              [self handleOpenSessionResponseWithSession:session status:status error:error success:successBlock fail:failBlock]; ];
        
        else
        
            //Request for session with every (incuding publish) permissions, otherwise non integrated Facebook won't let the app to post later.
            [FBSession openActiveSessionWithPublishPermissions:self.publishPermissions
                                               defaultAudience:FBSessionDefaultAudienceEveryone
                                                  allowLoginUI:YES
                                             completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
              [self handleOpenSessionResponseWithSession:session status:status error:error success:successBlock fail:failBlock]; ];
        
    

但我需要某种简单的检测来确定使用哪个,所以问题是:如何在请求会话之前检测用户是否有 iOS 集成 Facebook 帐户设置?

【问题讨论】:

见this answer(来自@Lefteris 的评论) 【参考方案1】:

据我所知,找出这个问题的正确方法是使用

[SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]

请注意,这仅适用于 iOS 6 及更高版本! Social.framework 的一部分。

【讨论】:

不要像我一样被愚弄:即使没有设置 facebook 帐户,这在 (Xcode 4.6.3) iOS 模拟器 6.x 下也会返回 YES。如果您随后显示 SLComposeViewController,您会在 composer 视图上方收到一条警报,询问您是要转到设置以设置帐户还是取消。但是,在实际设备上,它似乎可以按文档说明工作。 在装有 iOS 10.1 的设备上,如果“设置”中没有设置 Facebook 帐户但安装了 Facebook 应用程序,则返回 true。【参考方案2】:

正如安东所说。

//Facebook setup on users device.
BOOL haveIntegratedFacebookAtAll = ([SLComposeViewController class] != nil);
BOOL userHaveIntegratedFacebookAccountSetup = haveIntegratedFacebookAtAll && ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]);

【讨论】:

以上是关于如何在请求会话之前检测用户是不是有 iOS 集成 Facebook 帐户设置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 和 Android 的给定时间检测用户是不是仅在一台设备上处于活动状态

如何在 Quickblox iOS SDK 中检查会话是不是有效或过期?

如何制作过滤器以检测用户是不是请求了未找到的页面?

如何使用 django 保持 tensorflow 会话在内存中运行

iOS 9:如何检测用户何时对推送通知请求说“不允许”? [复制]

Zend Framework 1 - 如何在功能集成测试中重置视图数据,而不是会话数据?