在 iOS 平台分享

本指南详细介绍如何通过 iOS 应用将内容分享到 Facebook。用户通过您的应用分享时,相关内容会在其时间线及其好友的动态消息中显示。

用户还可以使用 Messenger Expression 平台或 iOS 版 SDK 中分享功能的消息对话框,将您的应用内容分享到 Facebook Messenger。

iOS 版 Messenger SDK消息对话框

前提条件

将分享添加到您的应用前,您需要执行以下操作:

  • iOS 版 Facebook SDK 添加到您的移动开发环境中
  • 配置并链接您的 Facebook 应用编号
  • 将应用编号、显示名称和需要获取照片访问权限的理由添加到应用的 .plist 文件中,请注意,该理由必须能让人轻松看懂。
  • FBSDKShareKit.framework 链接到您的项目。

应用不能预填写任何分享内容,否则将违反 Facebook 开放平台政策,请参阅 Facebook 开放平台政策第 2.3 条

iOS 版 SDK 新手入门

内容建模

Facebook SDK 4.0+ 版本提供用于分享内容的新模型。每种内容类型都有一个您可用于表示该内容类型并且符合 <FBSDKSharingContent> 的界面。对内容建模后,将符合 <FBSDKSharing> 的分享界面(例如 FBSDKShareDialog)添加到应用。

用户通过您的应用将链接分享到 Facebook 时,系统会同时包含所分享的链接和 contentURL。按 FBSDKShareLinkContent 模型构建链接的分享内容。如需了解完整的属性列表,请参阅 FBSDKShareLinkContent 参考文档

截至 2017 年 4 月 18 日,图谱 API 版本 2.9 及更高版本不再支持下列参数。对于版本 2.8 及更低版本,这些参数将继续有效,直到 2017 年 7 月 17 日。

  • contentTitle:表示链接中的内容的标题
  • imageURL:在帖子中显示的缩略图的网址
  • contentDescription:内容的描述,通常为 2-4 个句子

以下是如何触发分享的示例:

FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
content.contentURL = [NSURL URLWithString:@"https://developers.facebook.com"];

注意: 如果您的应用分享的是 iTunes 或 Google Play 商店的链接,我们不会发布您在分享中指定的任何图片或说明,而会发布通过网络爬虫直接从应用商店抓取的一些应用信息,其中可能不包括图片。要预览转至 iTunes 或 Google Play 的链接分享,请在分享调试器中输入您的网址。

照片

用户可以使用分享对话框或自定义界面,通过您的应用将照片分享到 Facebook:

  • 照片大小必须小于 12MB
  • 用户需要安装版本 7.0 或以上的原生 iOS 版 Facebook 应用

FBSDKSharePhotoContent 模型构建照片的分享内容。如需了解完整的属性列表,请参阅 FBSDKSharePhotoContent 参考文档

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  UIImage *image = info[UIImagePickerControllerOriginalImage];

  FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc] init];
  photo.image = image;
  photo.userGenerated = YES;
  FBSDKSharePhotoContent *content = [[FBSDKSharePhotoContent alloc] init];
  content.photos = @[photo];
  ...
}

视频

应用用户可通过分享对话框或您专属的自定义界面将视频分享到 Facebook:

  • 视频大小必须小于 12MB。
  • 分享内容的用户应安装版本 26.0 或以上的 iOS 版 Facebook 客户端。

FBSDKShareVideoContent 模型构建视频的分享内容。如需了解完整的属性列表,请参阅 FBSDKShareVideoContent 参考文档

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  NSURL *videoURL = [info objectForKey:UIImagePickerControllerReferenceURL];

  FBSDKShareVideo *video = [[FBSDKShareVideo alloc] init];
  video.videoURL = videoURL;
  FBSDKShareVideoContent *content = [[FBSDKShareVideoContent alloc] init];
  content.video = video;
  ...
}

视频网址 videoURL 必须是资产网址。例如,您可以从 UIImagePickerController 获取视频资产网址。

多媒体

应用用户可通过分享对话框从应用向 Facebook 分享同时包含照片和视频的内容。请注意以下事项:

  • 用户使用的 iOS 版本至少应为 7.0。
  • 分享内容的用户应安装 iOS 版 Facebook 客户端版本 52.0 或更高版本。
  • 每个照片和视频元素的大小必须小于 12MB。
  • 用户最多可以分享 1 个视频加 29 张照片,或最多分享 30 张照片。

使用 FBSDKShareMediaContent 模型构建多媒体分享内容。如需了解完整的属性列表,请参阅 FBSDKShareMediaContent 参考文档

FBSDKSharePhoto *photo = [FBSDKSharePhoto photoWith...
FBSDKShareVideo *video = [FBSDKShareVideo videoWith...
FBSDKShareMediaContent *content = [FBSDKShareMediaContent new];
content.media = @[photo, video];
}

分享方式

构建模型处理内容后,您可以触发“分享”或消息对话框,或触发用于分享的专属自定义界面。

按钮

在 iOS 中,Facebook 提供用于触发分享的原生按钮。


“赞”按钮

“赞”按钮是用户与好友分享内容的快捷途径。轻触“赞”按钮即可为应用中的内容点“赞”,并将内容分享到 Facebook。要向视图添加“赞”按钮,请将下列代码片段添加到您的视图:

FBSDKLikeControl *button = [[FBSDKLikeControl alloc] init];
button.objectID = @"https://www.facebook.com/FacebookDevelopers";
[self.view addSubview:button];

“分享”按钮

实施“分享”按钮后,用户可将内容分享到自己的 Facebook 时间线、好友的时间线或小组中。“分享”按钮将调用分享对话框。要向视图添加“分享”按钮,请将下列代码片段添加到您的视图:

FBSDKShareButton *button = [[FBSDKShareButton alloc] init];
button.shareContent = content;  
[self.view addSubview:button];

“发送”按钮

用户可以使用“发送”按钮,以私密方式向好友和使用 Facebook Messenger 的联系人发送照片、视频和链接。“发送”按钮将调用消息对话框。要向视图添加“发送”按钮,请将下列代码片段添加到视图:

FBSDKSendButton *button = [[FBSDKSendButton alloc] init];
button.shareContent = content; 
[self.view addSubview:button];

如果未安装 Messenger 应用,“发送”按钮将隐藏。请确保此按钮隐藏时,您的应用布局是适当的。要检查“发送”按钮能否在当前设备上显示,可使用 FBSDKSendButton 属性 isHidden

if (button.isHidden) {
  NSLog(@"Is hidden");
} else {
  [self.view addSubview:button];
}

分享对话框

要使用 Facebook 构建的分享体验,您需要如以上内容建模部分中所述定义您的内容,然后调用分享对话框。例如,要使用分享对话框分享链接:

FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
content.contentURL = [NSURL URLWithString:@"http://developers.facebook.com"];
[FBSDKShareDialog showFromViewController:self
                              withContent:content
                                 delegate:nil];

在旧版本的 iOS 版 SDK 中,您的应用必须先检查设备是否安装了原生 Facebook 应用,然后才可打开分享对话框。若未安装 Facebook 应用,则您必须自行提供代码,才能调用回退对话框。

现在,SDK 将自动检查设备上是否安装了原生 Facebook 应用。如果未安装,SDK 会将用户切换到默认浏览器并打开动态发布对话框。如果用户想要分享开放图谱动态,SDK 会打开网页分享对话框

如果安装了原生 Facebook 应用,4.0-4.4 版的 SDK 会切换到原生 iOS 版 Facebook 应用,并在发布帖子后将控制权交还您的应用。如果使用 4.5+ 版 SDK,除非分享内容是开放图谱动态,否则用户会看到 iOS 分享表,而不会切换到原生 iOS 版 Facebook 应用。

消息对话框

消息对话框会切换到原生 iOS 版 Messenger 应用,并在发布帖子后将控制权交还您的应用。

[FBSDKMessageDialog showWithContent:content delegate:nil];

注意: iPad 当前不支持消息对话框。

iOS 集成

iOS 6+ 包括原生分享表,允许用户将状态更新、照片、视频和链接发布到 Facebook,并且支持设置帖子的分享对象和在帖子中圈出地点。分享表无法用于分享开放图谱动态。Facebook SDK 支持使用此原生控件;从 4.5 版 Facebook SDK 开始,当您调用 Facebook 分享对话框时,用户会在大多数情况下获得此体验。

使用 iOS 分享表需要遵守 Facebook 开放平台政策,包括第 2.3 条,即规定应用不可以在分享表中预先填写内容。这意味着应用不能使用未由应用用户输入的内容预先填写分享表的 initialText 字段。

此 API 还使用和 Facebook SDK 的其他部分一样的样式块。要显示原生 iOS 分享对话框,请使用:

// Example content. Replace with content from your app.
FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
content.contentURL = [NSURL URLWithString:@"https://developers.facebook.com"];

FBSDKShareDialog *dialog = [[FBSDKShareDialog alloc] init];
dialog.fromViewController = self;
dialog.content = content;
dialog.mode = FBSDKShareDialogModeShareSheet;
[dialog show];

请注意,需要 .fromViewController 才能显示分享表。

其他功能

Facebook 分享对话框可为您提供一些 API 分享方式所不具有的选项。

话题标签

您可以指定一个话题标签,让它随分享的照片、链接或视频一同显示。这个话题标签还会显示在分享对话框中,因此用户在发布之前可决定是否将它删除。

以下是为链接分享添加话题标签的示例。

FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
content.contentURL = [NSURL URLWithString:@"https://developers.facebook.com"];
content.hashtag = [FBSDKHashtag hashtagWithString:@"#MadeWithHackbook"];

引文分享

您还可以让用户选择高亮一段文本,作为与分享的链接一同显示的引文。或者,您也可以预先定义与分享的链接一同显示的引文,例如文章中的醒目引文。不管使用哪种方式,引文都将在用户评论区之外的专用位置显示。

FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
content.contentURL = [@"https://developers.facebook.com/products/sharing"];
content.quote = @"Learn quick and simple ways for people to share content from your app or website to Facebook.";

进阶主题

借助应用链接,您可让用户通过从应用发布的 Facebook 帖子链接回您的应用。

当用户点击从应用发布的 Facebook 帖子时,会打开您的应用,甚至可以链接到应用内的特定内容。

自定义界面

要使用专属分享界面,您需要:

以下是将链接发布到 Facebook 时使用的图谱 API 调用:

[FBSDKShareAPI shareWithContent:content delegate:nil];

分享开放图谱动态

借助开放图谱动态,用户可通过强类型 API 分享内容丰富的结构化内容,该 API 由开放图谱操作和对象定义。

分享的动态会链接回您的应用或您应用的 App Store 页面。

如需详细了解如何将自定义动态添加到您的应用,请参阅 iOS 平台中的开放图谱动态

FBSDKShareOpenGraphContent 模型构建开放图谱操作的分享内容。如需了解完整的属性列表,请参阅 FBSDKShareOpenGraphContent 参考文档

NSDictionary *properties = @{
  @"og:type": @"fitness.course",
  @"og:title": @"Sample Course",
  @"og:description": @"This is a sample course.",
  @"fitness:duration:value": @100,
  @"fitness:duration:units": @"s",
  @"fitness:distance:value": @12,
  @"fitness:distance:units": @"km",
  @"fitness:speed:value": @5,
  @"fitness:speed:units": @"m/s",
};
FBSDKShareOpenGraphObject *object = [FBSDKShareOpenGraphObject objectWithProperties:properties];
FBSDKShareOpenGraphAction *action = [[FBSDKShareOpenGraphAction alloc] init];
action.actionType = @"fitness.runs";
[action setObject:object forKey:@"fitness:course"];
FBSDKShareOpenGraphContent *content = [[FBSDKShareOpenGraphContent alloc] init];
content.action = action;
content.previewPropertyName = @"fitness:course";

iOS 模拟器和测试

使用模拟器在应用中测试分享时,如果尝试分享视频、照片或开放图谱操作,您将收到报错。这是因为您需要安装提供分享对话框的 iOS 版 Facebook。我们不为模拟器提供此类支持。

分享链接时不需要安装 iOS 版 Facebook,因此,此测试用例可行。要测试其他分享情形,请设置安装了 iOS 版 Facebook 的实际测试设备。