iOS Facebook SDK - 最佳实践?

Posted

技术标签:

【中文标题】iOS Facebook SDK - 最佳实践?【英文标题】:iOS Facebook SDK - Best Practices? 【发布时间】:2012-03-02 15:39:59 【问题描述】:

我想知道使用 Facebook ios SDK 的“最佳实践”指南是什么。

特别 - 我有几个使用 Facebook SDK 的表单。 作为 OOP 程序员,我最初的直觉是在处理所有 Facebook 活动的数据访问层下创建一个“FacebookManager”类。 不幸的是,由于 Facebook iOS SDK 使用了委托和异步方法,这并没有太大帮助,因为任何其他使用 FacebookManager 的模块无论如何都必须为所有响应传递委托。

然后我发现每个 ViewController 本身都是一个 FBRequestDelegate 并处理所有 Facebook 响应。

那么,你是如何在你的应用中做到这一点的呢?

【问题讨论】:

【参考方案1】:

我所做的是按照您的建议创建一个 FacebookManager。该管理器成为 FBRequestDelegate。现在我更喜欢块而不是委托模型,所以我所有的 FacebookManager 方法都是基于块的。

这是我发帖到用户墙方法的样子

- (void)postToUserWall:(NSDictionary*)postDictionary withCompleteHandler:(void(^)(id result, NSError* error))block 


  if( [facebook_ isSessionValid] ) 
    NSMutableDictionary* params = [postDictionary mutableCopy];
    [params setObject:facebook_.accessToken forKey:@"access_token"];
    FBRequest* request = [facebook_ requestWithGraphpath:@"me/feed" andParams:[postDictionary mutableCopy] andHttpMethod:@"POST" andDelegate:self];
    [[request params] setObject:block forKey:@"result"];
  


然后在成功或错误时我只是执行块

- (void)processRequest:(FBRequest*)request withResult:(id)result andError:(NSError*)error 
  NSDictionary* params = [request params];
  if( [request params] != nil && [params objectForKey:@"result"] != nil ) 
    void(^completeBlock)(id result,NSError* error) = [params objectForKey:@"result"];
    completeBlock(result, nil);
  



- (void)request:(FBRequest *)request didLoad:(id)result 
  [self processRequest:request withResult:result andError:nil];



- (void)request:(FBRequest *)request didFailWithError:(NSError *)error 
  [self processRequest:request withResult:nil andError:error];

我希望有更好的方法来处理阻塞,但这是迄今为止我发现的最好的方法。这是最好的方法吗?可能不是,但这就是我目前使用的,它似乎没问题,让所有 FB 交互远离我的视图控制器。

注意这里的所有代码都假设 ARC,这就是没有发布的原因

【讨论】:

为什么 PostToWall 函数的最后两行没有反转?您运行请求,然后将块作为参数添加到它?我不明白... 我的理解是请求已准备好,直到下次运行 runloop 时才会执行。这就是为什么它看起来应该在添加块之前发出请求,但实际上它是在添加块之后在运行循环的下一次执行时执行的 我最终使用了您的示例。谢谢。 将异步框架包装成块的有趣方式。 +1。但是,您是否能够将登录方法(授权)包装到块模型中? FBSessionDelegate 方法不返回任何对象... 看起来其他人通过将块存储到管理器上的 ivar 来实现块登录。 ***.com/questions/9561421/…【参考方案2】:

Facebook 经理,基本上是 Facebook sdk 的包装器。以下是有关如何管理它的一些提示。

1) 修改 Facebook SDK 的协议定义,将您不需要的协议定义为可选,这样您就不必实现它们。

2) 处理此管理器类中的所有会话活动、登录/注销、委托、协议等。换句话说,这个管理器实现了 Facebook sdk 定义的所有协议。

3) 在管理器类中定义自己的协议,并使所有协议方法可选,这样每个视图控制器都可以定义它实际需要的内容。

4) 一些有用的包装器会很有用,例如,

- (void) postToFriend: (Record*) f_record withMessage: (NSString*) message;
- (void) resumeSession; // checks, resumes session, extend token, or report error

5) 如果您的 viewController 需要更多功能,添加包装器会很容易

有很多开源代码可用(搜索 github),但自定义管理器类不难编写,可以轻松移植到其他项目。

希望对你有帮助。

【讨论】:

【参考方案3】:

我们已经构建了一个相当广泛的库,可用于 facebook 集成。见这里:

https://github.com/RIKSOF/three20/tree/development/src/extThree20Facebook

它是 Three20 框架的扩展。如果您愿意,您可以轻松地将此库修改为独立于 Three20。

我们基本上已经为每个 Graph API 对象定义了对象。从 Graph API 返回的 JSON 被读入这些对象。

【讨论】:

以上是关于iOS Facebook SDK - 最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

ios/iphone sdk 表单管理最佳实践

对于使用 Facebook iOS SDK 的混合 SSO 场景,为我们自己的自定义用户记录生成密码/密钥的最佳方式是啥?

IOS SDK - xcode interface builder - 管理许多对象的最佳实践是啥?

使用Facebook,Gmail和其他注册链接在iOS应用程序中设置登录/注册屏幕的最佳/最简单方法是什么?

访问令牌持久性最佳实践 (iOS)

iOS Facebook Graph API 使用“下一个”或“上一个”Url 使用 SDK 进行分页