iOS 版 Facebook SDK 常见问题和疑难解答

您可以在多个 iOS 应用中使用同一个 Facebook 应用编号,例如,在应用的免费版和付费版中使用同一个编号。

在应用的 .plist 文件中定义网址方案后缀参数 FacebookUrlSchemeSuffix

注:后缀仅可使用字母字符。

SDK 压缩包包括 FacebookSDKStrings.bundle,其中包含适用于 SDK 资源且经本地化的字符串。将此捆绑包添加到应用内,并按照 Apple 的说明文档启用 Base Internationalization

如需下载较早版本的 SDK,可以前往 iOS 下载区

原生分享对话框是 iOS 版 Facebook 应用的一部分,无法在模拟器上运行。请使用物理设备测试原生分享对话框。我们正在寻找能够在模拟器中测试原生分享对话框的方法。

在尝试使用 Facebook SDK 类的每个文件顶层,确保使用正确的导入语句。例如:

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKShareKit/FBSDKShareKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>

使用 Objective-C 中的框架时,使用类别扩展现有类的类无法自动加载。

当您尝试调用这些类中已扩展的方法时,将收到 unrecognized selector sent to instance 错误。通过 Xcode 界面构建工具使用的类也不会自动加载,例如,当您通过界面构建工具界面在 .xib 文件中绘制视图,并将其设置为 FBSDKLoginButton,从而将 FBSDKLoginButton 添加到界面时。因此,当您尝试调用其中的方法时,将收到 unrecognized selector sent to instance 错误。有两种方法可以解决此问题。

您可以通过调用以下内容,在应用委托的 application:didFinishLaunchingWithOptions: 中手动加载类:

[FBSDKLoginButton class];

您也可以添加 -ObjC 链接工具标记。此标记会提示链接工具加载 SDK 中定义 Objective-C 类或类别的每个对象文件。此方法会让我们的所有类都能“开箱即用”,但会增加可执行文件的大小(因为应用程序中会加载额外的对象代码)。

要添加 -ObjC 标记,请点击项目目标并选择“Build Settings”(构建设置)选项卡。在“Linking”(链接)下,双击“Other Linker Flags”(其他链接工具标记),即可添加 -ObjC

FBSDKRequestConnection 使用需要有效 RunLoopNSURLConnection。如果在主线程外使用,则需要自行管理。

您也可以在 FBSDKRequestConnection 中设置 delegateQueue 属性。

.plist 中出现配置错误很常见。请确保 .plist 包含针对 FacebookAppIDFacebookDisplayName 的行,以及针对 fb{app-id} 的网址类型条目。

如果在发出图谱 API 请求时获得意外结果,则可以在任何请求之前添加下列代码,启用调试模式:

[FBSettings setLoggingBehavior:
    [NSSet setWithObject:FBSDKLoggingBehaviorGraphAPIDebugInfo]];

如果想要阻止信息级别消息,仅保留警告,可以使用 FBSDKLoggingBehaviorGraphAPIDebugWarning

启用此记录行为会将 debug 参数添加到所有图谱 API 请求,并会在控制台中输出任何发生的问题。

您可以点击此处,详细了解图谱 API 调试模式。

如果用户明确点击“登录”对话框中的取消按钮,或用户手动切换回您的应用(称为“隐式取消”),SDK 将报告取消操作。您应确保未在应用委托的生命周期内启动登录流程(例如在 application:openURL:sourceApplication:annotation: 内启动登录),因为这样做类似于隐式取消操作。如果必须这么做,请稍后将登录启动发送到主队列,以便先完成应用委托的生命周期。

  • Facebook SDK 包含访问 Apple 广告标识符 (IDFA) 的代码,但该代码只能在一些情形中执行。
  • iOS 版 Facebook SDK 仅能在以下情形中访问 IDFA:1) 您的应用通过 Facebook 的 Audience Network 投放应用内广告,或者 2) 您的应用记录应用安装或其他移动应用事件,以便为广告营销活动统计这些事件。
  • 如果您没有使用 FBSDKAppEvents 类记录应用事件,则 Facebook SDK 不会访问 IDFA。此外,Facebook SDK 不要求包含 AdSupport.framework。
  • 如果您只想追踪应用事件而不希望收集 IDFA,可在应用面板的高级设置版块禁用 IDFA 收集。

分享对话框会根据用户操作通知其委托的 sharer:didCompleteWithResults:sharerDidCancel: 方法。

  • sharer:didCompleteWithResults:,当用户成功分享时通知。此外,如果用户向应用授予 publish_actions 权限,results 字典中还会有 postId 键。如果用户登录时未使用 Facebook 登录,在用户点击“Cancel”(取消)时也会调用此方法。
  • sharerDidCancel:,当用户点击分享对话框的“X”按钮时通知;或在用户使用 Facebook 登录功能登录并点击“Cancel”(取消)时通知。

如果在发出请求时收到意外结果,请开启 FBSDKGraphRequests 调试。在发送任何请求前添加此代码:

[FBSDKSettings enableLoggingBehavior:FBSDKLoggingBehaviorNetworkRequests];

您将能够直接查看来自服务器的请求和响应,对任何问题进行调试。

请考虑查看 FBSDKSettings.h 中定义的其他 FBSDKLoggingBehavior* 常量,寻找可以记录的其他内容。