脸书-IOS-SDK-应用集成指南-全-

脸书 IOS SDK 应用集成指南(全)

原文:zh.annas-archive.org/md5/1c6f68a435c688f454f4b91bab4dd11c

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

Facebook 是全球最受欢迎的社交网站,拥有超过 10 亿的用户基础。用户信任这个平台,并愿意通过第三方应用程序与之互动。利用社交平台功能的应用程序更有可能因为 Facebook 平台提供的不同渠道而走红。

本书将重点介绍 Facebook 平台的概念和功能实现。我们将使用 Facebook iOS SDK 创建一个新的社交应用程序,使用户能够利用通过其 API 提供的多种功能。

本书涵盖的内容

第一章,Facebook 平台简介,描述了社交网络平台的概念和社交网络上的不同功能。在这里,我们将学习社交网络的架构以及不同的部分如何相互交互。

第二章,创建新的 iOS 社交项目,介绍了如何创建一个将使用 Facebook iOS SDK 和 API 的新 iOS 应用程序。我们将学习如何设置一个新的 iOS XCode 项目,以便用户能够与社交平台互动。设置的一部分将涉及创建一个新的 Facebook App ID 和下载 iOS SDK。

第三章,连接到 Facebook 用户账户,描述了如何设置我们的应用程序,以便使用用户的 Facebook 凭证进行用户身份验证。我们将学习如何设计一个新的界面,使用户能够提供他们的 Facebook 凭证并在社交平台界面中进行身份验证。UI 实现的一部分将使用一个新的 SDK 组件,FBLoginView。我们将处理用户登录和注销流程。

第四章,显示用户资料,描述了我们可以从社交网络中检索哪些用户信息。我们将学习如何在用户成功认证后获取用户信息。我们将创建一个新的用户界面,以显示从 Facebook 平台获取的数据。

第五章,在墙上发布,描述了如何通过 Facebook iOS SDK 与 Facebook 用户的墙进行交互。我们将学习如何通过 Facebook iOS SDK 在用户的墙上分享由应用程序驱动的活动。我们将使用基于原生和基于 Web 的 API。我们将定制实现,以便选择当前登录用户或他们的任何朋友的墙。

第六章,Facebook Graph API,描述了如何使用 Graph API 与社交平台进行交互。Graph API 是查询和从平台获取信息的主要工具。我们将学习如何使用 Graph API 调试应用程序请求,以验证查询和响应,以及如何使用 Facebook iOS SDK 实现 Graph API。

第七章,分发你的社交应用,描述了如何让你的应用程序在众多用户中走红。在这里,我们将学习如何使用 Facebook 的推广渠道来与我们的 Facebook 朋友分享我们新的 iOS 社交应用。我们将负责在 Facebook 应用配置文件上设置所有必要的信息,以创建无瑕疵的分享体验。

第八章,推广你的社交应用,描述了如何使用 Facebook 工具来推广和跟踪我们的社交应用用户和用法。在这里,我们将学习如何使用 Facebook Insight 工具。本章的部分内容将专注于使用移动和网页广告来扩大我们的应用程序受众。

你需要本书的内容

为了开始使用 Facebook iOS SDK 进行开发,你应该拥有一台装有 XCode 的 Mac OS 机器。为了在 Facebook 社交图谱上注册你的应用程序,你需要一个 Facebook 账户。此外,为了将你的应用程序推广到全世界,你需要一个 Apple 的开发者账户。

本书面向的对象

本书是为从新手到专家的 iOS 开发者编写的。我肯定会推荐阅读来自 Apple 网站的故事板参考。本书使用 Objective-C、Storyboard 和 Facebook iOS SDK。

惯例

在本书中,你将找到多种文本样式,用于区分不同类型的信息。以下是一些这些样式的示例及其含义的解释。

文本中的代码单词如下所示:“将FBLoginView对象添加到我们的界面中,将使我们的社交应用能够以透明的方式执行登录和注销。”

代码块设置如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ 
    [FBProfilePictureView class];
 return YES;
}

当我们希望引起你对代码块中特定部分的注意时,相关的行或项目将以粗体显示:

- (BOOL)application:(UIApplication *)application <span class="strong"><strong>didFinishLaunchingWithOptions:(NSDictionary *)launchOptions</strong></span>
{ 
    [FBProfilePictureView class];
 return YES;
}

新术语重要词汇将以粗体显示。你在屏幕上看到的,例如在菜单或对话框中的单词,将以如下方式显示:“为了创建一个新的 Facebook App ID,你可以在 App 仪表板的左上角点击创建新应用”。

注意

警告或重要注意事项将以如下所示的框中出现。

小贴士

小技巧和窍门如下所示。

读者反馈

我们的读者反馈总是受欢迎的。告诉我们你对这本书的看法——你喜欢什么或可能不喜欢什么。读者反馈对我们开发你真正能从中获得最大收益的标题非常重要。

要发送一般反馈,只需发送一封电子邮件到&lt;<a class="email" href="mailto:feedback@packtpub.com">feedback@packtpub.com</a>&gt;,并在邮件的主题中提及书名。

如果你在一个领域有专业知识,并且你对撰写或为书籍做出贡献感兴趣,请参阅我们的作者指南www.packtpub.com/authors

客户支持

现在你已经是 Packt 图书的骄傲拥有者,我们有许多事情可以帮助你从购买中获得最大收益。

下载示例代码

您可以从www.packtpub.com下载您购买的所有 Packt 书籍的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。

勘误

尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果您在我们的某本书中发现错误——可能是文本或代码中的错误——如果您能向我们报告这一点,我们将不胜感激。通过这样做,您可以避免其他读者感到沮丧,并帮助我们改进本书的后续版本。如果您发现任何勘误,请通过访问www.packtpub.com/submit-errata,选择您的书籍,点击勘误提交表单链接,并输入您的勘误详情来报告它们。一旦您的勘误得到验证,您的提交将被接受,勘误将被上传到我们的网站,或添加到该标题的勘误部分下的现有勘误列表中。您可以通过选择您的标题从www.packtpub.com/support查看任何现有勘误。

盗版

互联网上对版权材料的盗版是所有媒体中持续存在的问题。在 Packt,我们非常重视保护我们的版权和许可证。如果您在互联网上发现我们作品的任何非法副本,无论形式如何,请立即提供位置地址或网站名称,以便我们可以寻求补救措施。

请通过链接发送至&lt;<a class="email" href="mailto:copyright@packtpub.com">copyright@packtpub.com</a>&gt;,告知我们疑似盗版材料的位置。

我们感谢您在保护我们的作者以及为我们提供有价值内容的能力方面提供的帮助。

问题

如果您在本书的任何方面遇到问题,可以通过&lt;<a class="email" href="mailto:questions@packtpub.com">questions@packtpub.com</a>&gt;联系我们,我们将尽力解决。

第一章. Facebook 平台简介

平台是 Facebook 项目的主要组件之一。它允许开发者创建能够依赖 Facebook 的架构层来扩展他们自己的系统的第三方应用程序。自 2007 年 5 月平台推出以来,Facebook 工程师一直在努力扩展、改进和使架构更加灵活、可靠、安全、健壮。去年以来,Facebook 一直专注于提升移动设备上的用户体验,因此他们扩展了他们的架构,引入了原生 SDK,如 iOS 和 Android。

在本章中,我们将从开发者的角度来探讨 Facebook 平台的架构和功能。我们将重点关注那些可以使我们的应用程序在社交世界中迅速传播的平台部分。

Facebook 平台 – 功能

自 Facebook 最初推出以来,它已经发生了很大的变化。在其首次发布时,它不过是一个学生信息的存储库。当 Facebook 成为领先的社交网络网站时,Facebook 工程师开始开发一套 REST API,这后来允许开发者提取用户数据的一部分,如基本信息、活动和好友列表。

正如我们之前提到的,去年 Facebook 投入了大量精力来生产各种 SDK 集合,以满足开发者的需求。

图片

上述图表显示了 Facebook 平台具有模块化架构,为开发者提供多种功能。

社交图谱

社交图谱是 Facebook 平台的核心组件。平台使用图结构来存储用户、对象以及它们之间的连接。我们可以将社交图谱的结构总结如下:

  • 用户:这是在 Facebook 图谱中表示单个个人的数据结构。

  • 动作:这是两个对象之间的链接。这可以通过平台定义的属性或开发者创建的属性进行自定义。

  • 对象:这代表除了用户之外的所有实体;例如,Facebook 活动和 Facebook 页面。可以使用开放图谱自定义任何对象。

社交图谱的一个用例是当 Facebook 用户喜欢一个朋友的图片时。在这种情况下,图片是对象;“喜欢”对应动作;当然,Facebook 用户是用户。

以下图表显示了基于刚才提到的用例场景的社交图谱的基本结构:

图片

图结构提供了以下优势:

  • 高关系定制:开发者可以使用预定义的连接或创建自己的连接。

  • 分布:使用图路径算法,朋友的动态可以轻松被发现并显示在用户的动态时间轴上。

  • 对象定制:任何东西都可以是对象,用户也不例外。如果默认对象定义不足,没问题,开发者可以创建自己的定制对象并将它们存储在社交图谱中。

图形结构提供了更多技术优势,但它们超出了本书的范围。

图形 API

作为 Facebook 平台最重要的部分,图形 API 对外部世界开放;事实上,它是开发者与社交图谱和现实生活交互的主要工具。这是一个基于 HTTP 调用的 API 系统,用于查询、更新和创建新的对象和动作。

图形 API 也是 Facebook SDKs 用来实现我们应用程序和社交图谱之间低级通信的系统。

我们将在第六章“Facebook 图形 API”中关注图形 API。

社交插件

社交插件是可以在网站上使用以扩展社交功能的网络工具,这些功能与 Facebook 平台相连。以下列表显示了平台当前提供的社交插件:

  • 赞按钮:这允许用户将外部网站上的网页分享到他们的 Facebook 个人资料

  • 发送按钮:这会将网页内容发送到 Facebook 朋友

  • 关注按钮:这允许人们订阅其他 Facebook 用户

  • 评论:这允许用户为您的网站上的任何部分创建评论

  • 活动流:这允许其他网站显示用户的朋友的动态

  • 推荐框:这建议用户可能喜欢您网站上哪些页面

  • 赞框:这允许用户在您的网站上赞和展示 Facebook 页面

  • 登录按钮:这显示了 Facebook 的登录按钮和当前网站上已经登录的朋友的图片

  • 注册:这使您的网站能够使用 Facebook 作为认证系统

  • 脸谱:这显示了已经赞过 Facebook 页面或注册过您网站的用户的图片

所有社交插件仅适用于网络应用。

对话框

对话框为访问多个平台上的社交功能提供了统一的接口。目前有七个对话框可用,在我看来,以下是最重要的:

  • 分享对话框:在用户的动态时间轴上发布

  • 登录对话框:授权应用程序使用 Facebook 平台作为单一登录入口点

  • 好友对话框:发送好友请求

认证和权限

Facebook 平台的登录部分分为两个不同的部分,如下所示:

  • 应用程序权限使我们社交应用能够访问用户信息。我们将在本章后面讨论这些权限。

  • 签名请求是在某些情况下平台传递给应用程序的请求的一部分;这对于本书的范围来说并不重要;因此,我们不会讨论它。

功能 - 存储和使用平台数据

由于开发者处理的数据类型,Facebook 实施了关于此类用户信息使用的严格政策。开发者需要小心处理从平台接收到的数据。

Facebook 平台包含大量关于任何用户的信息。由于这种丰富性,开发者应仅请求操作应用程序所需的数据,以最佳方式运行。

用户登录到他们的社交应用后,开发者可以访问基本用户信息,无需请求任何特定权限。基本账户信息包括姓名、性别、个人资料图片、URL 和好友列表。为了访问更多账户数据,我们需要明确请求用户的许可。

为了访问额外信息,我们需要请求权限。此外,我们还需要定义并使我们的应用程序隐私政策可供用户查看。我们需要确切地说明我们将如何使用用户信息。

注意

注意,不能与任何第三方网络、广告交易平台和货币化或广告服务共享信息。有关更多信息,请参阅developers.facebook.com/policy/

集成点

理解应用集成点非常重要。这些点将确保我们的社交应用可见性。Facebook 平台提供了许多集成点,有助于在用户和应用程序之间创建无缝的用户体验。

当我们构建 Facebook 应用时,无论是移动端还是桌面端,我们始终需要记住使用所有可用的集成或营销点,这些点可以与我们的社交应用相匹配。平台提供以下点:

  • 内容和信息

  • 沟通和动态信息

  • 移动信息和通信

  • 用户行为

  • 市场营销和推广机制

集成点将在第八章“推广您的社交应用”中介绍。

Facebook 对集成点使用制定了政策。开发者应始终定义公平的用户体验,不会阻止用户使用 Facebook 的社交渠道。一旦我们的应用程序获得在用户时间轴上发布权限,应用程序应始终提醒用户下一次时间轴更新。我们在社交应用中放置的广告必须与 Facebook 平台上的任何视觉对象不同。

关于 Facebook 消息有一个重要的注意事项。此渠道应仅用于用户之间的沟通,而不是应用程序和用户之间的沟通。

Facebook 应用门户

Facebook App Portal 于 2012 年 5 月推出,旨在帮助用户将其安装到他们的时间轴或移动设备上。该门户最初推出时包含 600 个移动和 Web 应用。在这个门户中,一个团队会选择将在 App Center 中出现的应用,以确保根据用户评分和应用参与度分析,向公众提供高质量的产品。这并不意味着我们不能创建新的 Facebook 应用,但为了在我们的应用在 App Center 中活跃起来,我们将不得不等待我们的应用变得流行。

关于 Facebook App Center 也有一些批评。帮助提高门户上提供的产品质量的同一政策,却否认了新应用的可视性。

Facebook App Center 的目标不是取代 iOS 应用或 Google Play 商店。真正的目标是引导移动用户到这些商店。为了获取更多数据,我们可以看看以下统计数据:

  • App Center 在 2012 年 5 月仅将人们引导到 App Store 就超过 8300 万次

  • 类似地,Facebook 在 2012 年 5 月将用户引导到 iOS 应用上 134 百万次

Facebook App Center 在桌面和移动版本以及 Facebook iOS 和 Android 应用中都可以使用。我们将概述桌面和移动版本。

对于桌面版本,你可以在左侧栏中找到App Center链接。一旦点击链接,你将被重定向到实际门户;你也可以通过访问www.facebook.com/appcenter/来访问 App Center。

图片

Facebook App Center – 主要部分

用户体验完全基于 Facebook 个人资料进行定制。实际上,页面将根据访问它的用户而有所不同。建议系统使用推荐和你的朋友的数据来定制你的门户着陆页。

如前一个截图所示,页面布局简单。在左侧栏中,我们有三部分:搜索和分类、请求和我们的应用,以及 Facebook 礼品卡。在页面中心,我们可以看到不同的部分,如热门游戏朋友的游戏。这些部分是为每个用户独特定制的。

如果我们向下滚动,我们还可以看到如下截图所示的章节:

图片

我们可以很容易地理解门户上建议是如何工作的——我们朋友中最受欢迎的应用总是位于顶部。

当然,我们很高兴 Facebook 决定给我们提供选择,去发现我们网络中未使用过的应用。

我们也可以看看 App Center 的 Android 移动版本,如下面的截图所示:

图片

应用权限

如前所述,隐私是用户数据的首要关注点。Facebook 意识到这个问题,并致力于保护用户信息免受未经授权的访问。

为了规范账户信息的访问,Facebook 工程师基于权限定义了一项隐私政策。权限是开发者访问账户信息的唯一方式。

当我们创建一个 Facebook 应用程序(我们将在后面看到如何操作)时,我们将自动获得用户某些信息的访问权限。这也被称为基本账户信息或公开资料和好友列表

有时这些信息不足以满足我们的应用程序体验;因此,我们可以要求我们的用户以下权限:

  • 电子邮件权限

  • 扩展资料权限

  • 扩展权限

  • 开放图权限

  • 页面权限

基本账户权限或公开资料和好友列表:这提供了以下账户属性的访问权限:idnamefirst_namelast_namelinkusernamegenderlocaleage range以及我们设置为公开的所有信息。

电子邮件权限:这提供了访问用户电子邮件地址的权限。请注意,根据 Facebook 平台政策,您不能向用户的电子邮件账户发送垃圾邮件。有关更详细的信息,请参阅developers.facebook.com/docs/reference/login/email-permissions/.

扩展资料权限:此权限用于访问资料信息。此组权限在登录流程中不能被撤销;因此,它们是必需的。如果我们希望它们是可选的,我们必须设计我们的工作流程应用程序,在应用程序的特定部分请求这些权限,而不是在登录时。有关更详细的信息,请参阅developers.facebook.com/docs/reference/login/extended-profile-properties/.

扩展权限:这允许开发者访问敏感信息,并赋予发布和删除数据的能力。

当一个应用程序被授予发布权限的访问权限时,我们能够执行以下操作:

  • 上传照片和视频(包括创建相册)

  • 发布到用户的动态

  • 在照片和视频中创建标签

  • 在故事中创建点赞和评论

  • 发布问题

  • 创建笔记

  • 为事件或群组创建内容

我们应该只在需要时请求扩展权限。

开放图权限:这提供了访问开放图信息以及创建新操作的能力。

页面权限:这允许开发者检索当前用户拥有的页面和应用程序的信息。

我们的应用程序应该足够智能,能够在运行时理解我们目前拥有用户账户信息的哪些权限。每次我们对 Facebook 用户数据进行任何操作时,应用程序都应该在运行时检查我们是否被授予完成请求操作所需的权限。这非常重要,因为用户随后能够通过 Facebook 网站在应用程序环境之外修改/删除应用程序权限。

处理缺失的权限将肯定改善用户与我们的应用程序的交互。用户体验将变得更加流畅,我们不会在我们的 App Store 着陆页上处理负面反馈。

小贴士

经验法则

你请求的权限越多,用户不授予它们的可能性就越大。始终给用户提供按他们意愿开启和关闭权限的能力。

Facebook iOS SDK 3.x 的新功能

当 Facebook 工程师发布了 Facebook iOS SDK 的 3.0 版本时,许多开发者因为提供了许多改进而感到非常兴奋,这些改进使得开发者能够构建社交应用。

新的 SDK 提供了以下几个新功能:

  • 集成在 iOS 6 中

  • 原生 UI 控件用于常见操作

  • 更好的会话管理

  • 移动应用分析

iOS 6 中的 Facebook 集成

Facebook 是 iOS 中集成的第二个社交服务;第一个是 iOS 5 中的 Twitter。Facebook 集成将为想要构建社交应用的开发者带来几个优势;实际上,Facebook iOS SDK 正是利用了这种集成。

为了在 iOS 设备上使用 Facebook 集成功能,我们需要在设置中设置一个 Facebook 账户。

一旦 Facebook 账户与 iOS 设备连接,我们需要考虑我们应用程序的数据流。

首先,为了使用原生登录对话框,我们需要独立处理读写权限。因此,我们需要执行不同的请求以获取用户账户信息的权限。

Facebook SDK 提供了使用原生登录对话框的支持;然而,当设备上没有设置 Facebook 账户时,相同的 API 将提供回退到快速应用切换界面。

图片

原生 UI 登录对话框

前面的图片展示了在 iOS 6 上原生登录交互的一个示例。

另一个利用 iOS Facebook 集成的 SDK 功能是分享功能。使用原生分享功能,用户将能够通过原生 iOS 功能发布状态更新、链接、照片、视频,以及与朋友和位置标记操作。不幸的是,这个 API 没有回退来支持没有设置 Facebook 账户的设备。因此,这意味着我们需要手动处理它。

在我们的实际应用实现过程中,我们将使用原生分享对话框实现分享功能;然而,我们也将引入回退功能,以便在设备没有与应用程序关联的 Facebook 账户时提供实用的替代方案。

iOS 6 提供的所有原生功能都可以真正提高用户体验,避免令人烦恼的快速应用切换效果。我们的流程将在整个应用中看起来更加一致。

以下图片展示了如何使用分享对话框发布带有图片的状态更新。

图片

原生 UI 分享对话框

我想提出一个关于原生功能的考虑。当然,它们非常有用,因为它们肯定会提高我们社交应用的用户体验。但也有一些明显的缺点。我们需要改变请求权限的方式,并且原生 API 只随着 iOS 更新而更新。这意味着,如果需要修复 API 的时间,我们需要等待才能获得这样的修复,这可能会很耗时。Facebook SDK API 的更新频率比原生功能更高;因此,它们更可靠且经过充分测试。此外,开发者不需要使用 SDK API 更改应用程序请求权限的方式。

原生 UI 控件

Facebook SDK 的新版本提供了几个可用的 UI 组件,以便执行常见的操作,如好友选择、地点选择、登录和用户头像。

我首先想讨论的是登录组件,也称为FBLoginView类。使用这个组件实现登录/注销 Facebook 流程是多么简单,这真的令人印象深刻。将FBLoginView对象添加到我们的界面中,将使我们的社交应用能够以透明的方式执行登录和注销。我们只需要处理回调,以便在成功或失败响应中自定义我们的系统。我们将在编码之旅中稍后深入了解FBLoginView

社交应用的一个重要部分包括展示用户个人资料信息和 Facebook 个人头像的能力。在 SDK 3.0 之前,展示用户头像的方式是通过下载图片并将其放置在我们的界面中。当然,处理这个流程并不复杂,但许多事情可能会出错,例如下载和存储图片时可能会出现错误,这可能会减慢我们的开发进程。使用新的组件FBProfilePictureView,我们只需在我们的界面中添加一个新的FBProfilePictureView实例。用户登录后,我们将 Facebook 个人资料 ID 传递给FBProfilePictureView对象,这样我们就完成了——我们得到了用户的头像。

每当我们思考创建我们的社交应用并将其病毒式传播时,我们首先想到的是给用户分享他们生活的能力。每次我们在 Facebook 时间轴上发布内容,我们总是试图标记我们的朋友;因此,我们需要一种方式来挑选我们的朋友,也许还要选择一个地点。框架 SDK 提供了现成的组件,能够显示和选择朋友和地点。开发者需要做的唯一工作就是处理回调。这些组件也可以很容易地进行定制,我们将以FBFriendPickerViewController为例。

更好的会话管理

在 SDK 2.x 中,会话管理是一个痛点。实际上,通过访问令牌进行会话管理是开发者的责任。在 SDK 3.x 中,Facebook 工程师引入了新的会话管理流程 API,将处理与认证和会话相关的所有方面,包括刷新令牌。

新的会话管理过程的核心是FBSession。在新版本的框架中,FBSession负责管理用户登录流程和处理我们应用使用期间的 Facebook 会话。新的会话管理组件有几个改进和新特性,例如安全令牌的自动刷新功能,这是我个人比较喜欢的。在框架的上一版本中,开发者负责扩展认证令牌。

新的会话管理类使用 Objective-C 的块隐喻将响应从任何会话操作(如登录、登出和其他状态变化)发送回我们的应用程序。

移动分析

对于开发者来说,了解用户如何使用他们的社交应用非常重要。在框架的上一版本中,Facebook 工程师引入了新的使用指标,通过广告帮助开发者提高他们的应用货币化潜力。

应用使用指标为原生登录对话框和分享表(分享对话框)的印象和用法提供分析。开发者还可以使用 AppInsight 服务可视化这些指标。

在 Facebook 移动产品上,广告正在变得越来越大。新的框架可以跟踪来自您应用的转换事件。转换事件帮助商家跟踪他们在 Facebook 广告投资上的回报率。

我们在框架中还有一个新特性,称为购买事件。购买事件目前仍处于测试版,但最终将提供应用内购买元素的能力。

我们将在第八章“推广您的社交应用”中详细研究 Facebook 分析。

平台参考

技术参考在开发应用程序中始终非常重要。Facebook 为开发者提供的信息量相当可观。

我们可以从 Facebook 开发者页面(developers.facebook.com/)开始,在那里我们可以找到我们开始开发社交应用程序所需的所有信息。

为了始终了解平台和 SDK 的更新,我们可以访问 Facebook 开发者博客developers.facebook.com/blog/和 Facebook 开发者直播页面www.facebook.com/FacebookDevelopers

对于 iOS 开发者,我们的页面是 iOS SDK 页面developers.facebook.com/ios/

Facebook 平台文档可以在developers.facebook.com/docs/coreconcepts/找到,以及平台 Facebook 页面(www.facebook.com/platform)。维基百科也有一篇关于 Facebook 平台的非常有用的页面(www.facebook.com/platform)。

Open Graph 参考可以在developers.facebook.com/docs/concepts/opengraph/找到。

摘要

在本章中,我们讨论了 Facebook 平台及其功能。社交图谱是核心数据结构,将使社交网络能够创建丰富和吸引人的用户体验。

为了将 Facebook 的流行度扩展到其网站之外,Facebook 工程师创建了社交插件组件。这些组件允许用户在任何网站或网络应用程序中包含部分 Facebook 功能。

我们还讨论了 Graph API。Graph API 是开发人员查询社交平台和获取数据的主要工具。它们被用于所有的 Facebook SDK 中。

通过使用他们的 SDK 的应用程序收集的大量数据,Facebook 使社交平台能够向开发者和应用程序所有者提供使用分析。对 Facebook 来说最有利可图的移动功能是移动广告和应用推广。

第二章:创建新的 iOS 社交项目

通过本章,我们开始我们的编码之旅。我们将从头开始构建我们的社会应用。

在本章中,我们将学习以下内容:

  • 创建 Facebook App ID:这是与我们的 API 一起使用的关键,用于与 Facebook 平台通信。

  • 下载 Facebook SDK:iOS SDK 可以从两个不同的渠道下载。我们将探讨这两个渠道。

  • 创建新的 XCode 项目:我将简要介绍如何创建新的 XCode 项目以及 IDE 环境的描述。

  • 将 Facebook iOS SDK 导入到我们的 XCode 项目中:我将逐步介绍如何将 Facebook SDK 导入到我们的 XCode 项目中。

  • 熟悉 Storyboard 以构建更好的界面:这是对苹果工具的简要介绍,用于构建我们的应用程序界面。

在开始任何工作之前,我们应始终检查我们是否有合适的工具。为了开始构建我们的应用程序,我们需要两样东西:

  • Mac OS 机器:XCode 仅在 Mac 上运行(官方)

  • XCode:这是用于构建我们的社会应用的编辑器

本书的目标是解释如何将 iOS Facebook SDK 集成到我们的应用程序中。使用 XCode 和 Objective-C 概念超出了本书的范围。本章将简要介绍 XCode,因为我们假设读者已经熟悉苹果开发环境和其功能。我们将构建一个用于图书跟踪的社会应用。

创建 Facebook App ID

为了使用他们的 SDK 与 Facebook 平台进行通信,我们需要为我们的应用程序提供一个标识符。这个标识符,也称为 Facebook App ID,将使我们能够访问平台;同时,我们还将能够收集大量有关其使用情况、印象和广告的信息。

要获取 Facebook App ID,我们需要一个 Facebook 账户。如果您还没有,您可以通过以下页面创建一个 Facebook 账户:www.facebook.com

图片

上一张截图显示了新的 Facebook 账户注册表单。填写所有字段后,您将能够访问 Facebook 开发者门户。

一旦我们登录到 Facebook,我们需要访问开发者门户。您可以在developers.facebook.com/找到它。我已经提到了开发者门户在开发我们的社会应用中的重要作用。

图片

上一张截图显示了 Facebook 开发者门户。主要部分,即顶部部分,是专门用于当前 SDK 的。在顶部蓝色栏上点击Apps链接,它将重定向我们到 Facebook 应用仪表板。

图片

上一张截图显示了 Facebook 应用仪表板。在左侧,我们有一个应用列表;在页面中心,我们可以看到列表中当前选定应用的详细信息。页面显示了应用的设置和分析(洞察)。

为了创建一个新的 Facebook App ID,您可以在应用仪表板的右上角点击创建新应用

图片

上一张截图显示了创建 Facebook App ID 的第一步。在提供应用名称时,请确保该名称尚未存在或违反任何版权法;否则,Facebook 将删除您的应用。应用命名空间是我们想要在 Open Graph 结构中定义自定义对象和/或操作时需要的东西。应用命名空间主题不包含在本书中。Web 托管在创建社交 Web 应用时非常有用。如果需要,Facebook 可以与其他提供商合作为我们创建 Web 托管。这部分内容将不会在本书中讨论;因此,请不要为您的应用选择此选项。

一旦提供了所有信息,我们就可以继续下一步。请填写表格,并继续到下一个步骤。

图片

在页面顶部,我们可以看到App IDApp Secret。这是我们新社交应用最重要的信息。App ID是我们可以分享的信息,而App Secret则不可以。

在我们新的 Facebook 应用页面中心,我们有基本信息字段。不要担心命名空间应用域名托管 URL;这些字段是针对 Web 应用的。沙盒模式仅允许开发者使用当前应用。开发者通过左侧边栏上的开发者角色链接进行指定。

向下移动,选择应用的类型。对于我们的目标,选择原生 iOS 应用。您可以选择多个类型并创建多平台社交应用。

一旦您选择了原生 iOS 应用,您将看到一个以下表格:

图片

我们现在需要提供的唯一字段是包标识符包标识符与 XCode 设置有关。确保 Facebook 的包标识符将与我们的XCode 社交应用包标识符匹配。包标识符的格式始终类似于com.MyCompany.MyApp

iPhone/iPad App Store IDs是您在 App Store 发布应用时的 App Store 标识符。如果您在保存更改后没有提供任何这些标识符,您将收到一个警告消息;然而,请不要担心,我们新的App ID现在可以使用了。

保存您的更改,并准备好开始我们的开发之旅。

下载 Facebook iOS SDK

iOS Facebook SDK 可以通过两个不同的渠道下载:

  • Facebook 开发者门户:用于下载安装包

  • GitHub:用于下载 SDK 源代码

使用 Facebook 开发者门户,我们可以下载 iOS SDK 作为安装包。如以下截图所示访问developers.facebook.com/ios/并点击下载 SDK以下载安装包。

安装包安装后,将在我们的Documents文件夹中创建一个新的FacebookSDK文件夹。

之前的截图显示了 iOS SDK 安装包的内容。在这里,我们可以看到四个元素:

  • FacebookSDK.framework:这是我们将在 XCode 社交项目中导入的框架

  • LICENSE:它包含有关框架许可和使用的相关信息

  • README:它包含有关框架安装的所有必要信息

  • Samples:它包含一组有用的示例项目,这些项目使用了 iOS 框架的功能

使用安装包,我们只有编译后的文件可以使用,没有原始源代码。

可以通过 GitHub 渠道下载源代码。要克隆git repo,你需要一个 Git 客户端,无论是终端还是图形用户界面。iOS SDK 框架git repo位于github.com/facebook/facebook-ios-sdk.git。我更喜欢以下命令中使用的终端客户端:

git clone https://github.com/facebook/facebook-ios-sdk.git

在我们克隆了 repo 之后,目标文件夹将如下截图所示:

之前的图片显示了iOS SDK GitHub repo的内容。在这个 repo 中出现了两个新元素:srcscriptssrc包含需要编译的框架源代码。scripts文件夹包含编译源代码所需的所有必要脚本。

使用 GitHub 版本可以使我们在社交应用中始终保持框架的最新状态,但就本书的范围而言,我们将使用安装包。

创建新的 XCode 项目

我们创建了一个 Facebook App ID 并下载了 iOS Facebook SDK。现在是时候使用 XCode 开始我们的社交应用程序了。

  1. 如果启用了在 XCode 启动时显示此窗口,应用程序将提示欢迎对话框!

  2. 选择创建新的 XCode 项目选项。如果欢迎对话框已禁用,请导航到文件 | 新建 | 项目…

  3. 选择要工作的项目类型是下一步,如下面的截图所示!

  4. 左侧的条目定义了项目是针对桌面还是移动设备。导航到iOS | 应用程序并选择单视图应用程序项目类型!

之前的截图显示了新项目的详细信息。为新项目提供以下信息:

  • 产品名称:这是我们应用程序的名称

  • 组织名称:即使您不属于任何组织,我也强烈建议填写这部分,因为此字段将是我们的Bundle Identifier的一部分。

  • 公司标识符:虽然这仍然是可选的,但我们绝对应该填写它,以尊重Bundle Identifier的最佳实践格式。

  • 类前缀:此前缀将被添加到我们将在项目中创建的每个类之前。

  • 设备:我们可以选择应用程序的目标设备;在这种情况下,是一个 iPhone,但我们也可以选择 iPad 或通用。

  • 使用故事板:我们将使用故事板来创建应用程序的用户界面。

  • 使用自动引用计数:此功能使Objective C 垃圾回收器能够进行引用计数。

  • 包含单元测试:如果选中,XCode 还将为我们的应用程序创建一个单独的项目目标以进行单元测试;这不是本书的内容。

保存新项目。我强烈建议勾选为此项目创建本地 git 仓库选项,以便跟踪更改。一旦项目处于版本控制之下,我们还可以决定使用 GitHub 作为远程主机来存储我们的源代码。

图片

将 Facebook SDK 导入到应用程序项目中

我已经提到,我们将使用安装包导入 Facebook SDK。安装包将在Documents文件夹中创建一个FacebookSDK文件夹。在文件夹中,找到FacebookSDK. framework文件夹,并将其拖放到您的 XCode 项目中。将框架拖放到Project NavigatorFrameworks部分,如图所示:

图片

当提示导入设置时,请勾选将项目复制到目标组文件夹中(如有必要)选项。

使用Finder在您的项目目录中定位Facebook SDK文件夹。您可以通过在 XCode 中右键单击并导航到SDK | 在 Finder 中显示来找到文件夹位置。在Framework文件夹中,找到Resources文件夹并打开它。

图片

就像我们对 Facebook 框架所做的那样,将FacebookSDKResources.bundle拖放到 XCode 的Frameworks部分。它将用于在 iOS 项目中创建 UI 对象。仍然检查是否需要启用将项目复制到目标组文件夹中(如有必要)选项。

SDK 依赖于 XCode 中已经包含的三个框架,例如 AdSupport、Accounts 和 Social。我们需要将这些框架添加到我们的项目中。在目标摘要面板中,找到链接的框架和库,点击+,将显示所有可用的框架列表。

图片

选择之前图像中提到的框架,并点击添加。这三个包将被添加到我们的根项目文件夹中。为了保持我们的项目有序,我们可以将这三个框架移动到项目的Frameworks部分。

下一步是添加SQLite-ObjC 链接器标志。在Summary面板中,选择Targets中的项目,在右侧找到Build Settings,在下面的条中检查AllLevels。现在在搜索栏中输入other link。结果应该看起来像下面的屏幕截图。

然后选择Other Linker Flags条目,双击第三列,即Resolved之后的列。向其中添加以下标志:

  • -ObjC

  • -lsqlite3.0

现在,我们需要将 Facebook 框架设置为使用我们之前创建的 Facebook App ID。在Navigator中,定位到Application-Info.plist文件;您可以在项目的Navigator | Application Folder | Supporting Files中找到它。

创建一个新的条目,使用FacebookAppID键;值需要是一个字符串类型,包含您之前创建的 Facebook App ID。

我们还需要确保应用程序接收到基于 Web 的身份验证流程(OAuth)的回调 URL。为了实现这一点,创建一个新的 URL 类型数组条目,包含一个单独的项目。向数组项目添加一个新的URL Schemes数组,第一个条目将是一个以fb前缀的 Facebook App ID 的字符串键。您可以在下面的屏幕截图中看到结果:

新的社会 iOS 项目现在已准备就绪。在下一章中,我们将开始编写新的功能代码。

熟悉 Storyboard 以构建更好的界面

Storyboard是构建 iPhone/iPad 用户交互和界面的优秀工具。使用它,我们能够在开始编写代码之前绘制整个数据流和交互。

Storyboard 是在 iOS 5 版本中引入的。在此之前,唯一可用的构建 UI 的格式是 XIB 格式。XIB 格式允许一次构建一个界面,而 Storyboard 允许您跨多个界面工作,并使用动作(segues)将它们连接起来。

Storyboard 并不是要完全取代 XIB 格式;实际上,它们可以轻松共存。

下面的屏幕截图中显示了 Storyboard 的实际应用示例。Storyboard 中的每个元素都称为场景。场景通过 segues 连接。两个场景嵌入在导航控制器中,截图中最左侧的对象;两个主要控制器通过每个场景中按钮关联的两个 segues 相互连接。

对于这个项目,我们将利用 Storyboard 功能来构建应用程序界面。

摘要

在本章中,我们学习了如何创建一个新的 Facebook App ID,这个 ID 将用于在社交平台上识别我们的社交应用。我们还创建了一个新的 iPhone 项目,并下载了 Facebook iOS SDK。为了使用 Facebook iOS SDK,我们必须在我们的社会项目中导入几个框架,并设置一些特定的链接器标志,这些标志将由 Facebook SDK 使用。同样重要的是要记住,我们需要在我们的应用程序中使用之前创建的 Facebook App ID;否则,Facebook SDK 将抛出异常,因为 Facebook App ID 用于与社交平台通信。

一个重要的工具,它也将被用来构建我们的社会项目,就是 Storyboard。Storyboard 将帮助用户创建我们的图形用户界面并定义用户交互。

第三章:连接到 Facebook 用户账户

在上一章中,我们创建了一个只有一个视图的项目,用户可以在其中提供书籍信息。在本章中,我们将扩展之前的应用程序原型。

在本章中,我们将构建我们的第一个 Facebook 用户交互体验,例如登录和登出流程。我们将构建一个新的视图控制器来处理社交应用程序中的逻辑和用户界面。这个控制器的名字将是LBFacebookViewController

处理 Facebook 身份验证流程有两种方式:

  • FBLoginView: 通过使用包含处理身份验证流程逻辑的用户界面组件

  • FBSession: 通过构建我们的自定义界面,让用户能够与他们在 Facebook 平台上的社交生活进行交互

我们将学习如何使用FBLoginView组件来对 Facebook 平台进行用户身份验证。

我们只需要提供FBLoginViewFBLoginView代理的LBFacebookViewController,以便用户可以使用平台登录和登出。作为我们 UI 视图的一部分,我们将显示一些 Facebook 用户账户信息,例如用户名和头像。

我们将在本书后面使用FBSession来检索有关用户社交生活的更多信息。

登录流程

在新的 Facebook SDK 3 之前,处理 Facebook 会话很繁琐,可能会花费我们大量的时间在代码维护和调试上。

FBSession组件([developers.facebook.com/docs/reference/ios/3.2/class/FBSession/](https://developers.facebook.com/docs/reference/ios/3.2/class/FBSession/))是在 Facebook SDK 的版本 3 中引入的。它是一个跟踪并确保 Facebook 会话信息保持最新的组件。身份验证令牌FBSession信息中最重要的属性。所有与平台的安全通信都基于身份验证令牌。实际上,它将是我们在 Facebook 平台上执行的每个请求的一部分。从之前的 SDK 版本开始,开发者有责任在令牌过期后对其进行扩展。

FBLoginView是由 Facebook SDK 提供的 UI 组件,它将使任何 iOS 应用程序能够在不编写处理平台请求/响应的代码的情况下,对 Facebook 平台进行用户身份验证。

FBLoginView处理用户交互并持续更新FBSession状态。如前所述,自 iOS 6 以来,苹果一直在提供 Facebook 集成。FBLoginView能够使用原生 UI 组件让用户接受他们当前使用的应用程序可以访问他们的 Facebook 资料。这只能在当前 iOS 设备与 Facebook 账户相关联时发生。如果没有设置 Facebook 账户,FBLoginView将使用 Safari 对用户进行身份验证。

FBLoginView通过FBLoginViewDelegate提供了四个回调来处理使用FBLoginView进行身份验证后 Facebook 平台的响应,如下所示:

  • loginView:handleError:

  • loginViewFetchedUserInfo:user:

  • loginViewShowingLoggedInUser:

  • loginViewShowingLoggedOutUser:

对于我们的社交应用程序,我们将使用FBLoginView组件。我们将在登录/注销流程实现期间讨论这些方法。

FBLoginView处理登录流程,我们只需要在登录过程成功后设置我们的应用程序状态。

创建登录界面

在本节中,我们将创建一个新的视图控制器,使应用程序能够对 Facebook 平台进行用户身份验证。

创建 Facebook 视图控制器

从我们之前的工程开始,我们将添加一个新的视图控制器,该控制器将包含 UI 元素和逻辑来处理身份验证流程。

选择应用程序的LBViewController,在右下角位置添加一个新按钮,并将其标签设置为Go Social,如以下截图所示。此按钮将提示 Facebook 视图控制器,并使用户能够使用该平台。

Go Social 按钮

现在,创建一个新的视图控制器。从对象库列表中,将视图控制器拖放到 Storyboard 中,如以下截图所示。Storyboard 现在有一个新的场景,我们将称之为 Facebook 场景。

新的故事板视图控制器

新场景将包含FBLoginView组件。我们需要在第一个场景和 Facebook 场景之间进行转场。选择Go Social按钮,按住Ctrl按钮,然后再次选择Go Social按钮以在两个场景之间创建连接。

以下截图显示了如何创建新的转场:

Go Social 转场

动作转场下选择推送

将选择作为动作转场

对于那些已经熟悉 Storyboard 的你们来说,你们会注意到,在不属于导航控制器的视图控制器中定义推送转场会抛出异常,因为没有导航控制器,应用程序无法跟踪用户通过我们的视图的路径。为了避免异常,我们需要创建一个将两个场景包裹在内的导航控制器。

以下截图显示了如何创建导航控制器以定义用户的交互。选择第一个场景,然后转到编辑器 | 嵌入 | 导航控制器。

创建导航控制器

导航视图控制器现在将使应用程序内的推送转场成为可能。

导航控制器

上述截图显示了创建导航控制器后的结果。

现在我们已经固定了导航,我们需要创建一个类,将 Facebook 视图场景与我们将要实现的逻辑绑定起来。要创建一个新的ViewController类,在iLikeBook文件夹上右键单击,然后转到新建文件 | Objective-C 类。提供一个类名,LBFacebookVIewController,并将子类定义为UIVIewController。取消选择带有 XIB 用户界面选项。

LBFacebookViewController

新类将出现在iLikeBook文件夹下。我们需要将 Storyboard 中的 Facebook 场景与LBFacebookVIewController绑定。选择 Storyboard 和 Facebook 场景。打开实用工具仪表板,在 XCode 右上角的视图面板上,选择最右侧的按钮。在自定义类下打开身份检查器,并将字段设置为LBFacebookVIewController。当用户访问 Facebook 场景时,应用程序将加载LBFacebookVIewController类的代码。

打开LBFacebookVIewController.m,并在代码中添加以下@interface语句:

@interface LBFacebookViewController ()
 @end

当 Facebook 场景仍然被选中时,将其拖放到一个新的UIView中。新视图的背景色为白色,当未选中时可能难以识别视图。通过访问属性检查器 | 背景,将视图的背景色更改为浅灰色。使用大小检查器将新视图组件的大小设置为100 x 50,位置设置为(70, 45)。将新UIView自定义类设置为FBLoginView

FBLoginView

现在我们需要在LBFacebookViewController中创建对FBLoginView的引用。在选择了 Facebook 场景后,打开辅助编辑器,并使用 XCode 右上角的显示辅助编辑器按钮。

FBLoginView 与 LBFacebookViewController

确保左侧可以访问LBFacebookViewController.m

选择FBLoginView,按住Ctrl键,并将视图拖到类文件中的@interface语句内。XCode 将要求输入引用名称,如下面的截图所示:

FBLoginView 引用创建

存储字段保留为Weak值。生成的代码语句应类似于以下截图所示:

FBLoginView 引用

Facebook 场景现在包含FBLoginView,但我们希望在用户正确登录后提供一些反馈。在 Facebook 场景中拖放一个新的UIView。将其大小调整为 200 x 200 px,并将其放置在场景的中心。将UIView自定义类设置为FBProfilePictureViewFBProfilePictureView将允许应用程序在成功登录后显示用户的 Facebook 个人资料信息。

FBProfilePictureView

上一张截图显示了添加FBProfilePictureView后的结果。

FBProfilePictureView 需要更新所有登录和登出操作;因此,应用程序需要在 LBFacebookViewController 中有一个 UI 对象的引用。

正如我们在 FBLoginView 中所做的那样,我们需要在 LBFacebookViewController 类中创建 FBProfilePictureView 的引用。结果应类似于以下截图:

图片

FBProfilePictureView 参考信息

在继续使用 FBLoginView 代理之前,我们需要在 AppDelegate 类中设置应用程序处理外部 URL 的方式。我们希望 Facebook SDK 处理我们应用程序和社交平台之间的通信。

使用以下命令在 AppDelegate 文件中导入 Facebook SDK:

#import &lt;FacebookSDK/FacebookSDK.h&gt;

打开 Live Blogger (LB) 的 AppDelegate 文件并添加以下代码:

- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
return [FBSession.activeSessionhandleOpenURL:url];
}

上述代码将处理针对 Facebook 平台的每个单独请求。

由于 FBProfilePictureView 中存在一个错误,如果该类之前未加载,应用程序在运行时可能会抛出异常。为了解决这个问题,我们需要更改以下突出显示的 AppDelegate 方法:

- (BOOL)application:(UIApplication *)application <span class="strong"><strong>didFinishLaunchingWithOptions:(NSDictionary *)launchOptions</strong></span>
{ 
    [FBProfilePictureView class];
 return YES;
}

下一步是设置 FBLoginView。打开 LBFacebookViewController 并自定义 (void) viewDidLoad 方法如下:

- (void)viewDidLoad
{
    [superviewDidLoad];
     [self.fbLoginViewsetDelegate:self];
 }

self.fbLoginViewsetDelegate:self 方法将当前类设置为 FBLoginView 的代理。

图片

登录用户界面

登录代理

现在 FBLoginView 组件已经就位,我们需要关注其代理以处理响应和/或错误。

打开 LBFacebookViewController.m。正如我们在上一节中所做的那样,我们需要导入 Facebook SDK。

我们还需要使用以下代码将 FBLoginViewDelegate 扩展到 LBFacebookViewController

@interface LBFacebookViewController () &lt;FBLoginViewDelegate&gt;
 @end

使用上述代码,我们将允许将当前类设置为 FBLoginView 的代理以捕获回调。

我们应该实现的第一代理如下:

//delegate method to handle communication errors
- (void)loginView:(FBLoginView *)loginViewhandleError:(NSError *)error {
if (error) {
    NSLog(@"%@", error);
    }
}

上述代码片段显示了在 FBLoginView 抛出任何错误时将被调用的代理代码,并将错误打印到调试窗口中。

以下代码块显示了在用户登录后处理回调的说明;应用程序仍然没有关于用户 Facebook 账户的信息。在即将到来的章节中,将使用此方法来启用按钮以提供更多功能。

// delegate to handle the logged in mode
- (void)loginViewShowingLoggedInUser:(FBLoginView *)loginView {
 }

以下方法将为我们提供有关用户 Facebook 账户的信息。以下代码是处理用户获取信息的回调方法:

// delegate called after the application has received
// the user information from Facebook platform
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id&lt;FBGraphUser&gt;)user
{
    [self.profilePictureViewsetProfileID:user.id];
}

user 对象包含 Facebook 账户信息。FBGraphUser 提供了一个简单的接口来访问账户数据。setProfileId 方法设置 FBProfilePictureView ID,并通过调用 Facebook 平台的 API 获取账户图片。

由于 Framework SDK 的新更新,处理 Facebook 会话现在变得非常简单。

图片

用户登录成功

登出流程

登出流程不过是使用FBLoginView的新委托方法。再次强调,在LBFacebookViewController中,创建新的委托方法如下:

// delegate to handle the logged out mode
- (void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView
{
    [self.profilePictureViewsetProfileID:nil];
}

在用户成功登出后,将调用前面的方法。由于到目前为止 UI 仍在开发中,我们只需要将FBProfilePictureView的 profile ID 更新为 null 值,因为没有用户登录。

这是我们处理登出流程所需做的所有事情。

摘要

本章涵盖了实现 Facebook 登录和登出流程所需的所有要点。我们最初创建了一个视图控制器,用作用户界面的接口。

为了处理身份验证逻辑和与社交平台的通信,我们依赖于FBLoginView。为了向用户提供一些反馈,我们使用了FBProfilePictureView通过设置对象的一个属性来显示用户的图片资料。

第四章。显示用户配置文件

在本章中,我们将通过从 Facebook 平台获取用户信息来扩展我们的社交应用程序。我们将探讨在明确请求用户权限的情况下和未明确请求用户权限的情况下可以获取的信息类型。我们将学习如何使用FBSession获取额外的用户信息。

理解 Facebook 平台

Facebook 通过权限系统保护用户数据。为了访问用户信息,我们需要请求用户允许应用程序获取此类数据。您可以在developers.facebook.com/docs/reference/api/user/找到用户信息的完整列表。

当用户登录到我们的系统时,他们允许应用程序访问他们的基本信息。基本信息包括以下内容:

  • id

  • name

  • first_name

  • last_name

  • link

  • username

  • gender

  • locale

  • age_range

您可以在以下位置找到有关朋友的基本信息

developers.facebook.com/docs/reference/login/public-profile-and-friend-list/.

如果我们计划使用任何其他用户信息类型,我们需要请求用户,并确保我们的应用程序足够智能,能够处理拒绝/撤销的权限。

电子邮件是重要信息,需要谨慎处理。用户需要授权才能访问此类数据。不要向用户的电子邮件发送垃圾邮件。

developers.facebook.com/docs/reference/login/-permissions/

扩展配置文件属性权限提供访问基本信息中未包含的剩余字段。您可以在以下位置找到关于扩展配置文件属性的完整信息

developers.facebook.com/docs/reference/login/extended-profile-properties/.

扩展权限提供访问敏感信息以及发布和删除社交图上数据的权限。信息可在以下位置找到

developers.facebook.com/docs/reference/login/extended-permissions/.

开放图权限提供与开放图交互的能力。用户将通过我们的应用程序发布和检索开放图上的操作。

developers.facebook.com/docs/reference/login/open-graph-permissions/

在本章范围内,我们将使用用户的基本信息和电子邮件信息在我们的应用程序中显示。

设置用户配置文件界面

在上一章中,我们实现了 Storyboard Facebook 场景,在用户登录后显示个人资料图片。在本章的这一部分,我们将扩展场景以包括他们的姓名和电子邮件。

姓名 信息已经通过基本权限提供。现在,对于用户的电子邮件,我们需要明确请求用户允许我们访问它。

首先,我们需要向我们的 Facebook 场景添加两个新的标签来显示新信息。以下图显示了添加标签后的场景外观:

图片

用户登录后,新标签将动态设置用户信息。当用户注销时,我们将姓名和电子邮件信息替换为空字符串。

点击显示辅助编辑器按钮,并在LBFacebookViewController.m接口声明中逐个拖放标签。

以下代码片段显示了创建标签引用的结果:

import "LBFacebookViewController.h"
#import &lt;FacebookSDK/FacebookSDK.h&gt;

@interface LBFacebookViewController () &lt;FBLoginViewDelegate, FBFriendPickerDelegate, UIAlertViewDelegate&gt;
 @property (weak, nonatomic) IBOutlet FBLoginView *fbLoginView;
 @property (weak, nonatomic) IBOutlet FBProfilePictureView *profilePictureView;
 @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
 @property (weak, nonatomic) IBOutlet UILabel *emailLabel;
 @end

现在我们有了姓名和电子邮件的标签引用,我们可以从 Open Graph 获取用户信息。

获取用户信息

在本节中,我们将专注于实现显示和隐藏用户姓名和电子邮件的代码。

在上一章中,我们在 Facebook 场景中为FBLoginView组件创建了一个代理方法来访问用户信息。隐藏辅助编辑器并打开LBFacebookViewController.m文件。我们需要在loginViewFetchedUserInfo方法中添加一些代码来定制新的标签。

从自定义姓名标签开始,我们可以使用方法提供的(id<FBGraphUser>)user输入参数来访问用户姓名并设置标签。

// delegate called after the application has received
// the user information from Facebook platform
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id&lt;FBGraphUser&gt;)user
{
  [self.profilePictureView setProfileID:user.id];
  self.nameLabel.text = user.name;
}

self.nameLabel.test = user.name代码行将使用FBLoginView回调提供的用户姓名设置 UI 姓名标签内容。

当用户注销时,我们需要将姓名标签内容设置为空字符串,如下所示:

// delegate to handle the logged out mode
- (void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView
{
  [self.profilePictureView setProfileID:nil];
  self.nameLabel.text = @"Name";
}

self.nameLabel.test = @"Name"指令将姓名标签恢复到默认内容。

为了获取用户的电子邮件,我们首先需要请求用户允许应用程序访问此信息。我们需要通过以下方式定制FBLoginView,添加电子邮件权限:

- (void)viewDidLoad
{
  [super viewDidLoad];

  [self.fbLoginView setDelegate:self];

  // setting email read permission
  NSArray *readPermissions = [NSArray arrayWithObject:@"email"];
  [self.fbLoginView setReadPermissions:readPermissions];
}

以下代码片段显示了如何设置FBLoginView的附加权限。首先定义一个包含应用程序需要的读取权限的列表,并将创建的数组设置为FBLoginView readPermissions字段。

以下截图显示了带有附加电子邮件请求的用户权限界面:

图片

如果用户接受了请求,我们可以通过以下代码使用FBLoginView代理获取用户信息:

// delegate called after the application has received
// the user information from Facebook platform
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id&lt;FBGraphUser&gt;)user
{
  [self.profilePictureView setProfileID:user.id];
  self.nameLabel.text = user.name;

  if ([user objectForKey:@"email"]) {
    self.emailLabel.text = [user objectForKey:@"email"];
  }

}
 // delegate to handle the logged out mode
- (void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView
{
  [self.profilePictureView setProfileID:nil];
  self.nameLabel.text = @"Name";
  self.emailLabel.text = @"Email";
}

第一种方法仅在平台响应中存在电子邮件字段时才会获取电子邮件字段。第二种方法将用户的电子邮件替换为默认内容。

以下截图显示了最终结果:

图片

创建朋友视图接口

当我们想到社交活动时,我们会想到与朋友分享生活经历和时刻。

在本章的这一部分,我们将创建一个简单的朋友选择视图控制器。该控制器将显示与我们的 Facebook 账户关联的所有朋友,并提供选择一个或多个朋友的能力。

在下一章中,我们将使用朋友选择器与他们分享我们信息的一部分。

使用 Facebook SDK 的 2.x 版本,与新的 SDK 相比,实现好友列表将涉及大量工作。使用之前的 SDK 构建好友列表将需要创建一个新的 UI 组件来显示朋友信息,例如,表格视图控制器。背后的逻辑也是具有挑战性的,因为我们需要处理安全令牌扩展并解析响应以填充好友列表 UI。

使用 Facebook iOS SDK 3.x 创建好友列表是一个完全不同的故事。在 SDK 的 3.x 版本中,Facebook 工程师们非常努力地创建出完美无缺、即用即得的组件。其中之一就是FBFriendPickerViewController

FBFriendPickerViewController封装了用户交互和逻辑,以处理用户的好友列表。它将提供一个类似表格的 UI,因为它继承自UITabelViewController。从/到 Facebook 平台的整个通信完全由新组件处理。

我们可以在FBFriendPickerViewController上执行的一些自定义操作包括按姓氏或名字排序,更改显示朋友名字的方式等。

以下截图显示了使用新视图控制器生成的最终 UI 结果:

图片

只有当所选用户登录时,好友列表才会启用。

创建 UI

为了显示好友列表,我们需要首先向 Facebook UI 添加一个新按钮。打开 Storyboard,选择 Facebook 场景。按住Ctrl键盘按钮,从对象库中拖放一个按钮并将其放置在电子邮件标签下方。为新按钮设置标签文本,例如好友。通过导航到实用工具面板|属性检查器取消选择启用选项。

截图 1 到 5 显示了属性检查器中的启用选项未被勾选。

图片

好友按钮只有在用户已经登录的情况下才会触发创建FBFriendPickerViewController实例的代码;否则,它将被禁用。由于我们需要启用和禁用按钮,我们需要在我们的LBFacebookViewController中有一个按钮的引用,该引用将通过FBLoginView代理来访问。为了创建按钮引用,打开辅助编辑器,并在LBFacebookViewController接口声明内通过拖放创建好友按钮引用。

图片

当用户点击 朋友 按钮时,将触发创建朋友列表的代码。要将 朋友 按钮的 click 事件映射到 LBFacebookViewController 方法,请按住 Ctrl 键盘按钮,并将按钮拖放到 loginViewShowingLoggedOutUser 方法之后。XCode 将要求输入新方法的名称,该方法将映射 Touch Up Inside 事件。

图片

在我们点击 连接 后,XCode 将根据以下代码生成方法:

- (IBAction)onFriendsClick:(id)sender {

}

之前的片段将包含显示 FBFriendPickerViewController 实例的代码。

显示 FBFriendPickerViewController

为了显示 UI 朋友列表组件,我们需要在 LBFacebookViewController 中保持一个 FBFriendPickerViewController 的实例。打开 LBFacebookViewController.m 文件,并在 interface 语句中添加一个新的 FBFriendPickerViewController 实例。

以下代码显示了 interface 语句。

@interface LBFacebookViewController () &lt;FBLoginViewDelegate, FBFriendPickerDelegate&gt;
 @property (weak, nonatomic) IBOutlet FBLoginView *fbLoginView;
@property (weak, nonatomic) IBOutlet FBProfilePictureView *profilePictureView;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *emailLabel;
@property (weak, nonatomic) IBOutlet UIButton *friendPickerButton;
@property (strong, nonatomic) FBFriendPickerViewController *friendPickerViewController;
 @end

我们会注意到,FBFriendPickerViewController 也作为委托出现在之前的代码片段中,这是在 interface 语句的第一行显示的。

现在我们需要更新 onFriendsClick 方法,以初始化或重用 friendPickerViewController 属性并显示朋友列表。下一个应用程序方法显示了 onFriendsClick 方法的实现。

#pragma mark - FBFriendPickerViewController
- (IBAction)onFriendsClick:(id)sender {
  if (self.friendPickerViewController == nil) {
    self.friendPickerViewController = [[FBFriendPickerViewController alloc] init];
    self.friendPickerViewController.title = @"Pick a Friend";
    [self.friendPickerViewController setDelegate:self];
  }

  [self.friendPickerViewController loadData];
  [self.friendPickerViewController clearSelection];

  [self presentViewController:self.friendPickerViewControlleranimated:YES completion:^{
    NSLog(@"Friends list ready");
  }];
}

方法的第一部分检查 friendPickerViewController 是否已经初始化。如果没有初始化,该方法将为实例分配新的内存,并为 UI 设置标题,将当前类作为朋友列表控制器的委托。loadData 方法将从平台加载朋友信息,或者如果仍然有效,则从缓存中加载。clearSelection 方法将清除用户选择,如果朋友列表 UI 已经被使用。在方法结束时,我们使用 presentViewController 方法显示新的视图控制器,这将把 FBFriendPickerViewController 视图推到 UI 堆栈的顶部。

正如我们所说,FBFriendPickerViewController 需要一个委托才能与用户和其他应用程序交互。

在本章的范围内,我们将使用两个委托方法来处理 FBFriendPicker 视图中的 完成取消 按钮。在本章中,这两个委托方法将仅隐藏朋友列表 UI。下一代码显示了 FBFriendPickerViewController 的委托方法。

#pragma mark - FBFriendPickerViewController delegate
- (void)facebookViewControllerDoneWasPressed:(id)sender {
  [self dismissViewControllerAnimated:YES completion:^{
    NSLog(@"Friend Picker Done Button Clicked");
  }];
}
 - (void)facebookViewControllerCancelWasPressed:(id)sender {
  [self dismissViewControllerAnimated:YES completion:^{
    NSLog(@"Friend Picker Cancel Button Clicked");
  }];
}

之前代码中的两种委托方法都调用了 dismissViewControllerAnimated,这将从堆栈中弹出朋友列表 UI。

使用搜索栏自定义朋友列表

在上一节中,我们创建了朋友列表 UI,它还包括使用界面右侧的索引导航用户朋友列表的能力。

用户有很多朋友,有时索引可能不够快。我们希望向用户提供一个位于朋友列表顶部的搜索栏。

我们将开始创建一个新的类,该类将继承自 FBFriendPickerViewController。新的类将包含一个 UISearchBar UI 组件,因此我们需要将其设置为 UISearchBar 代理。当用户在搜索栏中输入时,新类将根据搜索查询内容过滤朋友条目。

为了创建新类,打开 项目导航器 并选择 iLikeBook 项目中的 iLikeBook 文件夹。右键单击它并选择 新建文件…,然后选择 Cocoa TouchObjective-C class 模板。点击 下一步 并设置类名,例如 LBFriendPickerViewController,并将 FBFriendPickerViewController 设置为子类。新类将具有与 FBFriendPickerViewController 相同的功能和属性。点击 下一步 创建文件。我们现在可以在 项目导航器 中看到两个新文件。

为了扩展我们的新朋友选择控制器,我们需要另外两个属性,如下所示:

  • SearchText:它是一个包含当前搜索查询的变量。Friend Picker 代理将访问它以过滤掉不满足搜索查询的朋友。

  • UISearchBar:它是允许用户输入搜索查询的 UI 组件。

SearchText,正如我们前面提到的,将用于从 Friend Picker 列表中过滤出朋友;因此我们可以将其定义为公共变量。打开 LBFriendPickerViewController.h 文件,并将 SearchText 变量添加为公共字段。以下列表显示了它在 LBFriendPickerViewController 类中的位置。

#import &lt;FacebookSDK/FacebookSDK.h&gt;
@interface LBFriendPickerViewController : FBFriendPickerViewController
 // Keep track of user's search query
@property (strong, nonatomic) NSString *searchText;
 @end

注意

更多信息,您可以查看以下两个 URL:developers.facebook.com/docs/reference/ios/3.2/protocol/FBFriendPickerDelegate

developer.apple.com/library/ios/#documentation/uikit/reference/UISearchBarDelegate_Protocol/Reference/Reference.html

现在打开 LBFriendPickerViewController.h 文件;我们将实现朋友搜索的 UI。

开始将 UISearchBar 组件添加到 interface 语句中。我们还需要将当前类定义为 UISearchBarDelegate,以便捕获用户的输入,如下面的代码片段所示:

@interface LBFriendPickerViewController () &lt;UISearchBarDelegate&gt;
 @property (weak, nonatomic) UISearchBar *searchBar;
 @end

UISearchBar 将显示在朋友列表的顶部,其宽度将与容器视图的宽度完全相同。该栏将在容器视图加载后由应用程序构建。

如果还没有创建 init 方法,请创建一个。在这个方法中,调用父类的 init 方法,并将 searchBar 变量设置为 nil,如下面的代码片段所示。

- (id)init
{
  self = [super init];
  if (self) {
    self.searchBar = nil;
  }
  return self;
}

我们需要自定义 viewDidLoad 方法,以便在朋友选择视图中构建 UISearchBar

- (void)viewDidLoad
{
  [super viewDidLoad];
  [self addSearchBarToFriendPickerView];
}

之前的代码展示了新的viewDidLoad方法,其中包含尚未定义的新方法addSearchBarToFriendPickerView。新方法仅在searchBar设置为nil时初始化searchBar。初始化完成后,searchBar将被添加到视图容器中。

下面的代码片段展示了addSearchBarToFriendPickerView的实现。

- (void)addSearchBarToFriendPickerView
{
  if (self.searchBar == nil) {
    CGFloat searchBarHeight = 44.0;
    self.searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width,searchBarHeight)];
    self.searchBar.autoresizingMask =self.searchBar.autoresizingMask |UIViewAutoresizingFlexibleWidth;
    self.searchBar.delegate = self;
    self.searchBar.showsCancelButton = YES;

    // Adding the searchBar to the current view and resize thefriends' list table view
    [self.canvasView addSubview:self.searchBar];
    CGRect newFrame = self.view.bounds;
    newFrame.size.height -= searchBarHeight;
    newFrame.origin.y = searchBarHeight;
    self.tableView.frame = newFrame;
  }
}

前面的方法首先检查searchBar是否已经初始化;如果没有,该方法将进行初始化。searchBarHeight变量是UISearchBar的最终高度,它将被用作初始化searchBar变量时的输入参数,以创建自定义框架。

在继续前进的过程中,我们将定义searchBar autoresizingMask以确保其宽度与视图容器相同。UISearchBar需要一个代理来访问用户的搜索查询;因此我们设置了一个代理。使用self.searchBar.showsCancelButton指令,我们可以设置UISearchBar按钮内的取消按钮为可见或隐藏。

searchBar组件需要被添加到当前视图。由于LBFriendPickerViewController继承了FBFriendPickerViewController,我们可以通过self.canvasView属性接收对父视图的访问。searchBar组件将显示在顶部,因为我们定义了位置(00)的框架。

在添加搜索栏后,我们需要使用searchBarHeight来调整朋友表格视图的高度。

UI 部分现在已完成;我们仍需注意UISearchBarLBFriendPickerViewController类之间的通信。

创建一个辅助方法来处理搜索,如下面的代码示例所示:

- (void)handleSearch: (UISearchBar *)searchBar {
  [NSObject cancelPreviousPerformRequestsWithTarget:selfselector:@selector(handleRealSearch:) object:searchBar];

  [self performSelector:@selector(handleRealSearch:)withObject:searchBar afterDelay:0.5f];
}
 - (void)handleRealSearch:(UISearchBar *)searchBar
{
  self.searchText = searchBar.text;
  [self updateView];
}

前面的方法将使用当前的UISearchBar内容值设置searchText属性,并调用updateViewUpdateView方法将调用LBFriendPickerViewController的代理方法来过滤用户。我们将在本节稍后深入了解该方法。

UISearchBar需要代理方法来处理用户的搜索。我们需要创建三个代理方法来处理以下操作:

  • 搜索栏文本已更改。

  • 搜索按钮被点击。

  • 取消按钮被点击。

文本更改方法相当简单。当用户输入时,应用程序将动态过滤用户。新代理方法的代码如下所示:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [self handleSearch:searchBar];
}

textDidChange方法使用handleSearch辅助方法来处理搜索。

要处理搜索按钮,点击并创建如下所示的方法:

- (void)searchBarSearchButtonClicked:(UISearchBar*)searchBar
{
  [self handleSearch:searchBar];
  [searchBar resignFirstResponder];
}

与之前的代理方法相比,唯一的区别是调用resignFirstResponder,这将点击搜索按钮后隐藏键盘。

取消按钮的方法更复杂;它将重置searchTextsearchBar内容值为空字符串,更新视图,并隐藏键盘。

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar {
  self.searchBar.text = @"";
  [self handleSearch:searchBar];
  [searchBar resignFirstResponder];
}

作为最后的润色,我们需要重写clearSelection方法以执行父级职责并重置searchTextsearchBar的内容。

- (void)clearSelection
{
  [super clearSelection];
  self.searchText = nil;
  self.searchBar.text = @"";
}

现在我们有了新的好友选择控制器,我们需要使用它。之前,我们在LBFriendPickerViewController内部使用了FBFriendPickerViewController

打开LBFriendPickerViewController.m,将FBFriendPickerViewController属性及其初始化替换为LBFriendPickerViewController,即刚刚创建的新类。你应该只有两个这样的实例。

@property (strong, nonatomic) LBFriendPickerViewController *friendPickerViewController;
 self.friendPickerViewController = [[LBFriendPickerViewController alloc] init];

我们需要实现的最后一个方法是过滤好友列表中用户的代理方法。在LBFriendPickerViewController.m的末尾,创建以下代码片段所示的方法:

- (BOOL)friendPickerViewController:(FBFriendPickerViewController *)friendPicker shouldIncludeUser:(id&lt;FBGraphUser&gt;)user
{
  NSString *searchText =self.friendPickerViewController.searchText;
  if (searchText &amp;&amp; ![searchText isEqualToString:@""]) {
    NSRange result = [user.namerangeOfString:searchTextoptions:NSCaseInsensitiveSearch];
    if (result.location != NSNotFound) {
    return YES;
  } else {
    return NO;
  }
} else {
  return YES;
}
return YES;
}

代码中列出的方法将检查我们好友列表中的每个用户,以找到与当前用户搜索查询的匹配项,并将返回 true 和 false。LBFriendPickerViewController 和 UISearchBar 调用此方法。

以下截图显示了定制的最终结果:

图片

摘要

在本章中,我们讨论了我们可以使用基本权限获取哪些信息。使用故事板,我们构建了个人资料 UI,在那里我们显示 Facebook 个人资料名称和图片。使用FBLoginView,我们实现了登录和注销流程,而不需要处理 Facebook 会话信息。

我们在个人资料 UI 中插入了一个新的按钮,该按钮将触发一个新的模态视图控制器。新的控制器继承自FBFriendPickerViewController,这将使我们的社交应用能够轻松获取好友列表。

我们通过插入一个新的搜索组件来自定义了好友列表的用户界面,我们可以使用这个组件根据用户的输入来过滤好友。

第五章. 墙上发布

在本章中,我们将实现 UI 和逻辑,使应用程序能够发布当前用户及其朋友的墙上的帖子。

我们将开始实现用户界面,使用户能够在实际将数据发送到 Facebook 平台之前审查要发布的信息。我们将定义在当前用户墙上发布帖子并自定义发布对话框的步骤。

我们将学习如何在帖子中标记朋友,为帖子添加上下文(例如,位置),并在平台上上传图片。

创建发布对话框界面

在 Facebook 平台上创建帖子意味着在 Facebook 新闻源上发布一个动作。这可以通过 Open Graph API 完成,该 API 在 Facebook SDK 2.x 中可用,与框架 3.x 版本的新原生或 Web 对话框相比。请注意,您仍然可以使用 Open Graph API 在您的新闻源上发布。

为了在 Facebook 新闻源上发布,我们首先需要请求用户允许我们在他们的新闻源上写入;更具体地说,是publish_actions权限。一旦应用程序被授予权限,我们可以使用以下组件:

  • FBNativeDialogs:此功能用于提供原生用户界面。它适用于 iOS 6 及以上版本,前提是在设备上设置了 Facebook 账户。

  • FBWebDialogs:此功能用于展示 Web 对话框以在 Open Graph 上发布。

原生对话框是分享平台信息的理想选择,因为它们需要编写的代码更少,并提供了更多开箱即用的功能;例如,位置标签和隐私设置(见以下截图)。

新闻源分享对话框

上一张截图显示了一个带有新闻源内容的原生对话框,并且还提供了通过添加位置按钮标记当前位置和使用朋友按钮更改隐私设置的能力。

创建书籍模型

在开始实现实际的分享功能之前,我们需要一种方法将信息从LBViewController(书籍信息控制器)传递到 Facebook 视图控制器。为了传递这些信息,我们将创建一个新的模型类。模型是一种用于存储信息且不关联任何逻辑的类。

要创建一个新的模型类,在项目导航器中的主文件夹(即Group)上右键单击,创建一个新的组,并将其命名为models。在models上右键单击并创建一个新文件。选择Objective-C类并将Class字段设置为LBBook,它是NSObject的子类。保存这些设置后,我们将在models组中获得新的LBBook类。以下截图显示了创建新的model书籍类后的项目结构:

添加 LBBook 类后的项目结构

我们需要填充model类以包含书籍信息所需的属性。我们需要以下属性:

  • 标题

  • 作者

  • 评论

  • 分数

打开 LBBook.h 文件并添加以下代码片段中的属性:

#import &lt;Foundation/Foundation.h&gt;
 @interface LBBook : NSObject
 @property (strong, nonatomic) NSString *title;
 @property (strong, nonatomic) NSString *author;
 @property (strong, nonatomic) NSString *review;
 @property (strong, nonatomic) NSNumber *vote;
 @end

我们不需要自定义 LBBook.m 文件。如前所述,我们只将此类用作容器。对于此模型不需要更多编码。

控制器之间的信息传递

我们需要通过 LBViewController 接口收集用户输入。我们可以采取两种不同的方法。第一种方法需要为 LBViewController 中的每个 UI 输入组件创建引用,并在用户点击 Go Social 按钮时收集数据。另一种技术需要在用户通过界面编辑书籍信息时更新书籍信息。两种技术都需要将 LBBook 类的实例作为 LBViewController 的私有属性。我们将采取第一种方法,并在用户点击 Go Social 按钮时收集所有信息。

打开 LBViewController.m 文件并导入 LBBook.h 文件。新的书籍属性将是私有的;因此,通过添加以下代码片段中的代码来编辑接口声明:

#import "LBBook.h"
 @interface LBViewController ()
 @property (strong, nonatomic) LBBook *book;
 @end

为了收集用户提供的书籍信息,我们需要在 LBViewController.m 接口声明中对每个 UI 组件有引用。为了创建这些引用,打开 Storyboard 并选择 Book Scene。在辅助编辑器窗口中打开 LBViewController.m 文件。将 interface 语句中的每个 UI 输入控件拖放到其中以创建对其的引用:

#import "LBViewController.h"
#import "LBBook.h"
#import "LBFacebookViewController.h"

@interface LBViewController ()
 @property (strong, nonatomic) LBBook *book;
 // UI input fields
@property (weak, nonatomic) IBOutlet UITextField *titleField;
@property (weak, nonatomic) IBOutlet UITextField *authorField;
@property (weak, nonatomic) IBOutlet UITextView *reviewField;
@property (weak, nonatomic) IBOutlet UITextField *voteField;
 @end

正如我们已经预料的,我们将在用户点击 Go Social 按钮后从视图中收集书籍信息。我们需要创建一个绑定按钮事件的函数。对于书籍场景,按住 Ctrl 按钮并在 LBViewController 文件中的 implementation.m 语句内拖放按钮以创建处理方法。将新方法的名称设置为 onGoSocialClick

在新方法中,我们需要收集书籍信息并将此类信息填充到 LBBook 实例中。我们首先需要检查书籍属性是否已经初始化;如果没有,我们需要处理它。对于每个 UI 输入,我们将在 book 属性中设置相应的属性。

- (IBAction)onGoSocialClick:(id)sender {
    // check if self.book is already initialized
    if (self.book == nil) {
        // init self.book
        self.book = [[LBBook alloc] init];
    }
    // set book title using the correspondent field text or empty string
    self.book.title = self.titleField.text ? self.titleField.text : @"";

    // set book author using the correspondent field text or empty string
    self.book.author = self.authorField.text ? self.authorField.text : @"";

    // set book review using the correspondent field text or empty string
    self.book.review = self.reviewField.text ? self.reviewField.text : @"";

    // set book review using the correspondent field text or empty string
    self.book.vote = self.voteField.text ? [NSNumber numberWithInt:self.voteField.text.intValue] : [NSNumber numberWithInt:-1];
}

以下代码片段显示了 onGoSocialClick 方法的最终版本。在设置任何书籍属性之前,我们需要检查相应的 UI 输入字段是否与 NIL 不同;如果是,我们使用空字符串。我们应该对提供的数据进行某种形式的验证;例如,书籍标题不应为空。我们将在发布书籍信息到用户的墙之前实现验证。

现在我们已经将用户提供的当前信息填充到书变量中,我们需要在 LBFacebookViewController.h 中创建一个类似的属性,但这个属性可以从其他类中访问。使用这种方法,LBViewController 可以更新 LBFacebookViewController 上的书属性,并且发布方法将能够访问这些数据。

打开 LBFacebookViewController.h 并创建一个新的 LBBook 属性。这次属性将不会定义为 strong,因为我们已经有一个对相同内存的 strong 引用,而是定义为 weak。内存管理不在此书的范围之内。如果您对 weak/strong 概念有任何疑问,可以查看苹果提供的 ARC 文档,该文档可以在以下位置找到:

developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

#import "LBBook.h"
 @interface LBFacebookViewController : UIViewController
 // Current book data. Initialized by LBViewController using segue
@property (weak, nonatomic) LBBook *book;
 @end

现在我们需要关注将书对象从 LBViewController 传递到 LBFacebookViewController。我们将使用连接书场景与 Facebook 的 segue 并覆盖 LBViewController 中的 segue 处理方法。首先我们需要定义一个 segue 的标识符。打开 Storyboard 并选择书和 Facebook 场景之间的 segue。打开实用工具面板,在属性检查器中设置 segue 的标识符为 GoSocialSegue

使用 segue,我们可以从源控制器传递数据到目标控制器,这正是我们打算做的。每次执行 segue 时,应用程序都会调用源控制器中的一个方法,这个方法可以由我们自行覆盖。

打开 LBFacebookViewController.m 并覆盖以下方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

如果当前的 segueGoSocialSegue 标识符,我们可以设置目标控制器书属性为 LBViewController 中定义的当前 book 属性。以下代码片段显示了前面方法的代码。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"GoSocialSegue"]) {
        if ([segue.destinationViewController isKindOfClass:[LBFacebookViewController class]]) {
            LBFacebookViewController *facebookController = segue.destinationViewController;
            [facebookController setBook:self.book];
        }
    }
}

在前面的代码中,我们再次检查了 segue 目标 viewController 类类型,并使用当前的 book 属性设置了 book 属性。

我们现在能够从一个控制器传递书信息到另一个控制器。

分享对话框

现在我们已经将书信息存储在 LBFacebookViewController 中,我们可以创建原生和 Web Feed 对话框,以便在用户的墙上分享信息。

在开始实现 Feed 对话框之前,我们需要请求用户授予 publish_action 权限。当应用程序被授予发布权限时,我们可以专注于对话框的实现。

我们将使用原生和 Web 对话框在用户的个人时间轴上发布信息。

上传操作权限

我们将在用户尝试在平台上创建新的 Feed 时检查我们的应用程序是否已被授予发布操作权限。

我们需要创建一个新的按钮,允许用户创建新的动态并发送当前书籍信息到 Open Graph。当前的 Facebook 场景布局不容易添加新组件,但我们可以以不同的方式重新排列 UI 组件。打开故事板并重新排列 Facebook 场景。下一张图片显示了新的 Facebook 场景布局。

图片

新的 Facebook 场景布局

从前面的截图,我们可以看到个人资料图片、姓名和电子邮件标签较小,并且位置不同。现在将一个新的按钮拖放到朋友按钮上方,并将其命名为 Book on Feed。以下截图显示了带有新按钮的 Facebook 场景。

图片

书籍在动态按钮

此按钮的行为应与朋友按钮完全一致;它只有在用户成功登录后才会激活;因此,我们需要在 LBFacebookViewController.m 文件的 interface 语句中获取按钮的引用。

图片

书籍在动态按钮引用

我们需要将书籍在动态按钮的点击事件映射到一个新方法。打开辅助编辑器,在 LBFacebookViewController.m 文件打开时,按住 Ctrl 键并在文件内的 implementation 语句中创建连接。这将允许用户在新闻源上发布当前书籍信息。

图片

书籍在动态按钮的点击处理程序引用

正如我们之前预料的,我们需要请求用户允许在他们的新闻源上发布。请求发布权限相当简单;我们只需要从 FBSession 对象中调用一个方法。FBSession 对象是一个单例组件,用于跟踪当前用户的 Facebook 会话状态。FBLoginView 组件在用户登录和登出时与 FBSession 交互,以保持会话更新;因此,我们可以在用户成功登录后使用此会话对象执行任何请求。

onBookOnFeedClick 方法中,将向用户发送发布动作权限请求,并将用户的响应保存在 Facebook 平台上。根据用户的响应,应用程序将继续发布当前书籍信息或显示一条消息,提醒用户缺少权限。

- (IBAction)onBookOnFeedClick:(id)sender {

    if (![FBNativeDialogs canPresentShareDialogWithSession:nil]) {
        UIAlertView *pickWallMessage  = [[UIAlertView alloc] initWithTitle:@"Where to post"
                                                                   message:@"Pick a Wall"
                                                                  delegate:self
                                                         cancelButtonTitle:@"cancel"
                                                         otherButtonTitles:@"mine", @"friend's", nil];
        [pickWallMessage show];
    } else {
        [self checkForPublishPermissionAndPublish];
    }
}

前面的截图显示了如何检查应用程序是否已经获得 publish_action 权限。如果没有,我们将使用当前活动的 Facebook 会话执行发布权限请求。当我们请求发布动作权限时,我们还需要定义新帖子的受众;例如,FBSessionDefaultAudienceEveryone。我们可以设置的受众值类型如下:

  • FBSessionDefaultAudienceNone: 这定义了只有 Facebook 平台作为受众。其他用户没有访问权限。

  • FBSessionDefaultAudienceOnlyMe: 这定义了当前用户仅作为新故事的受众。

  • FBSessionDefaultAudienceFriends:这定义了用户的朋友为受众。

  • FBSessionDefaultAudienceEveryone:这定义了当前帖子为公开。任何人都可以阅读。

completionHandler 方法检查用户是否已授予当前操作权限。如果已授予权限,应用程序将使用 publishCurrentBook 方法(将在本章的 Facebook 和原生部分中进一步讨论)通过窗口界面提示新的帖子信息。如果用户不授予权限,我们不得不通过 showDeniedPermissionAlertMessage 显示一个警告消息。以下代码片段演示了 showDeniedPermissionAlertMessage 方法的用法:

- (void)showDeniedPermissionAlertMessage:(NSString *)message
{
    UIAlertView *deniedPermissionMessage = [[UIAlertView alloc] initWithTitle:@"Permission Error"
                                                                      message:message
                                                                     delegate:nil
                                                            cancelButtonTitle:nil
                                                            otherButtonTitles:@"OK", nil];
    [deniedPermissionMessage show];
}

Facebook Web 对话框

Web 对话框类是在 Facebook iOS SDK 的第 3 版中引入的。有关更多详细信息,请访问 developers.facebook.com/docs/reference/ios/3.6/class/FBWebDialogs/

此类型对话框支持所有 iOS 版本,且无需在当前设备上设置 Facebook 账户。

Web 对话框是一个有用的组件,可以显示 Feed 对话框,允许用户将故事发布到个人资料的时间轴上。有关此方面的更多详细信息,请访问 developers.facebook.com/docs/reference/dialogs/feed/

FBWebDialogs 提供了用于在时间轴上发布信息和向朋友发送请求的静态方法。

在本书的这一部分,我们将探讨以下方法的实现:

presentDialogModallyWithSession:parameters:handler

我们将使用当前的 Facebook 开放会话和书籍信息来填充前面方法的输入参数。

LBFacebookViewController.m 文件中创建一个名为 displayWebPostDialog 的新方法,其中 dictionary 作为输入参数。以下代码片段演示了此方法的实现。

- (void)displayWebPostDialog:(NSDictionary *)params
{
    [FBWebDialogs presentFeedDialogModallyWithSession:FBSession.activeSession
                                           parameters:params
                                              handler:
     ^(FBWebDialogResult result, NSURL *resultURL, NSError *error) {
         if (error) {
             NSLog(@"Error publishing story.");
         } else {
             if (result == FBWebDialogResultDialogNotCompleted) {
                 NSLog(@"User canceled story publishing.");
             } else {
                 NSLog(@"Story posted");
             }
         }
     }];
}

当我们调用静态方法 presentFeedDialogModallyWithSession 时,应用程序将向用户显示一个包含帖子信息的窗口,类似于以下截图:

图片

在时间轴对话框上发布

现在缺少的部分是理解代码的哪一部分在调用 displayWebPostDialog 并传递正确的信息以填充 Facebook Web 对话框。

LBFacebookViewController.m 文件中创建名为 publishCurrentBook 的新方法。目前,该方法将创建一个字典,用于填充 Web 对话框信息,并包含书籍数据,然后调用 displayWebPostDialog 方法。

- (void)publishCurrentBook
{
    BOOL displayNativePostDialog = [self displayNativePostDialog];

    // NO FACEBOOK INTEGRATION
    if (!displayNativePostDialog) {
        // Create dictionary for Facebook web dialog
        NSString *name = [NSString stringWithFormat:@"Checkout %@", self.book.title];
        NSString *caption = [NSString stringWithFormat:@"Score %@", self.book.vote];
        NSString *description = self.book.review;
        NSString *pictureUrl = @"http://www.iconpot.com/icon/thumbnail/open-book-vector.jpg";

        NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                       name, @"name",
                                       caption, @"caption",
                                       description, @"description",
                                       pictureUrl, @"picture",
                                       nil];

        if (!self.myWall) {
            [params setObject:self.selectedFriend.id forKey:@"to"];
            self.myWall = YES;
        }

        [self displayWebPostDialog:params];
    }
}

publishCurrentBook 方法从由 onGoSocialSegue 初始化的内部属性 book 中读取书籍信息。

书籍字段将被用来填充 Web 对话框信息。以下截图显示了字典键与 Web 对话框界面组件之间的映射:

图片

带有书籍信息的 Web 对话框

用户将通过文本框添加更多信息,并能够确认或取消故事。以下屏幕截图显示了在 Facebook 时间轴上的故事:

用户在时间轴上的帖子

在朋友的墙上发布

我们需要给用户选择将故事发布到哪个 Facebook 墙的能力,更新 UI 和逻辑。在动态信息上点击 按钮将触发一个 UI 警告消息,让我们选择要使用的墙,而不是尝试发布故事。在朋友的墙上发布的功能只能通过 FBWebDialogs 使用。

LBFacebookViewController.m 文件中创建一个新的方法,名为 checkForPublishPermissionAndPublish。将 onBookOnFeedClick 方法中的内容移动到刚刚创建的新方法中。以下代码展示了新方法的内容:

- (void)checkForPublishPermissionAndPublish
{
    // Ask for publish_actions permissions in context
    if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) {
        [FBSession.activeSession requestNewPublishPermissions:[NSArray arrayWithObject:@"publish_actions"]
                                              defaultAudience:FBSessionDefaultAudienceFriends
                                            completionHandler:^(FBSession *session, NSError *error) {
                                                if (!error) {
                                                    [self publishCurrentBook];
                                                } else {
                                                    if (error.fberrorCategory == FBErrorCategoryUserCancelled) {
                                                        [self showDeniedPermissionAlertMessage:@"Publish Action Permission was not granted"];
                                                    }
                                                }
                                            }];
    } else { // If permissions present, publish the story
        [self publishCurrentBook];
    }
}

我们需要创建 UIAlertMessage 接口,以便用户可以选择哪个墙。为了捕获用户在 UIAlertMessage 接口上的响应,我们需要将 LBFacebookViewController 设置为 UIAlertViewDelegate。以下代码片段展示了新的代理扩展。

@interface LBFacebookViewController () &lt;FBLoginViewDelegate, FBFriendPickerDelegate, UIAlertViewDelegate&gt;

修改 onBookOnFeedClick 以向用户显示如下代码中的警告消息。

- (IBAction)onBookOnFeedClick:(id)sender {

    if (![FBNativeDialogs canPresentShareDialogWithSession:nil]) {
        UIAlertView *pickWallMessage  = [[UIAlertView alloc] initWithTitle:@"Where to post"
                                                                   message:@"Pick a Wall"
                                                                  delegate:self
                                                         cancelButtonTitle:@"cancel"
                                                         otherButtonTitles:@"mine", @"friend's", nil];
        [pickWallMessage show];
    } else {
        [self checkForPublishPermissionAndPublish];
    }
}

在以下屏幕截图中,我们为用户提供选择他们自己的墙或朋友的墙的选项:

UIAlertMessage – 墙选项

为了跟踪用户的选择,我们将使用两个私有属性:

  • @property BOOL myWall: 这用于跟踪要发布到哪个墙。

  • @property (strong, nonatomic) id<FBGraphUser> selectedFriend: 这用于跟踪当前选中的朋友。我们将使用此对象来提取 Facebook 用户。

LBFacebookViewController.m 文件中定义上述变量。

viewDidLoad 中将 myWall 变量设置为 false。在用户选择在朋友的墙上发布后,点击 完成 按钮在 朋友选择器 组件中,将设置 selectedFriend 变量。

我们现在需要创建 UIAlertViewMessage 代理方法来捕获用户的响应并选择正确的墙进行发布,如下面的屏幕截图所示:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        case 1: //mine button was clicked
            self.myWall = YES;
            [self checkForPublishPermissionAndPublish];
            break;
        case 2: //friend's button was clicked
            self.myWall = NO;
            [self showFriendPickerViewControllerWithMultiSelection:YES];
            break;
        default:
            self.myWall = YES;
            break;
    }
}

故意没有覆盖 clickButtonAtIndex UIAlertViewDelegate 方法。如果应用程序在警告消息仍然可见时尝试运行模态视图控制器,则不会显示任何内容。

如果用户点击 我的 按钮,应用程序将 myWall 变量设置为 true。这将显示发布视图控制器,并允许用户在自己的墙上发布新故事。

如果用户点击 取消 来取消操作,我们将 myWall 属性设置为 true 值,并关闭警告消息。

当用户点击 朋友的 按钮时,应用程序将 myWall 属性设置为 false,并将 LBFriendPickerViewController 显示给用户,以便选择一个朋友。

以下代码片段展示了新函数showFriendPickerViewControllerWithMultiSelection的实现,该函数将显示朋友选择器视图控制器。

- (void)showFriendPickerViewControllerWithMultiSelection:(BOOL)multiSelection
{
    if (self.friendPickerViewController == nil) {
        self.friendPickerViewController = [[LBFriendPickerViewController alloc] init];
        self.friendPickerViewController.title = @"Pick a Friend";
        [self.friendPickerViewController setDelegate:self];
    }

    [self.friendPickerViewController setAllowsMultipleSelection:multiSelection];

    [self.friendPickerViewController loadData];
    [self.friendPickerViewController clearSelection];

    [self presentViewController:self.friendPickerViewController animated:YES completion:^{
        NSLog(@"Friends list ready");
    }];
}

前面的方法接受一个布尔值作为输入来启用或禁用多选。当用户尝试向朋友的墙发布新故事时,我们将禁用multiSelection

使用前面代码中创建的新方法更新onFriendsClick;请参见以下代码片段中的输出:

- (IBAction)onFriendsClick:(id)sender {
    [self showFriendPickerViewControllerWithMultiSelection:YES];
}

我们现在需要更新facebookViewControllerDoneWasPressed代理方法以检索被选中的用户并存储对self.selectedFriend的引用。应用程序将只允许用户在单个朋友的墙上发布。一旦代理方法被调用,我们就可以轻松检查是否进行了朋友选择并发布到朋友的墙上。以下代码片段演示了新代理方法的用法。

#pragma mark - FBFriendPickerViewController delegate
- (void)facebookViewControllerDoneWasPressed:(id)sender {

    LBFriendPickerViewController *friendPicker = (LBFriendPickerViewController *)sender;

    // Checking for user friend selections
    if ([[friendPicker selection] count] &gt; 0) {
        self.selectedFriend = [[friendPicker selection] objectAtIndex:0];
    } else {
        // resetting previous selction
        self.myWall = YES;
    }

    [self dismissViewControllerAnimated:YES completion:^{
        if (!self.myWall) {
            // Posting new story on the friends wall
            [self checkForPublishPermissionAndPublish];
        }
    }];
}

如果friendPickerViewController选择数组至少有一个选择,我们将self.selectedFriend属性设置为朋友列表选择中的第一个对象。如果有多个选择返回,我们将self.myWall属性重置为true

LBFriendPickerViewController被关闭时,如果self.myWall属性设置为false,我们将显示带有朋友名字作为新故事接收者的发布界面;否则,不显示任何内容。

最后一步是向发布故事界面添加墙接收者。更新publishCurrentBook方法以检查self.myWall属性。如果该属性设置为false,这意味着用户正在尝试在朋友的墙上发布。因此,我们需要使用self.selectedFriend属性收集朋友的 Facebook ID。这些信息需要添加到之前为displayWebDialod方法定义的信息中。

if (!self.myWall) {
        [params setObject:self.selectedFriend.id forKey:@"to"];
        self.myWall = YES;
}

以下代码片段展示了应用程序如何使用朋友的 Facebook ID 设置参数to,这将改变新故事的接收者。

以下截图显示了最终结果:

FBWebDialog – 在朋友的墙上发布

Facebook 原生对话框

我们多次提到,苹果为 iOS6 及以后版本引入了 Facebook 集成。在这个版本的 iOS SDK 中,Facebook 工程师引入了原生组件来与平台交互;例如,FBNativeDialogs。框架原生组件基于SLComposeViewController

FBNativeDialog提供了更好的用户界面和交互,但也有一些限制。例如,目前FBNativeDialog无法在朋友的墙上发布。

首先,正如我们之前所预料的,当前的 iOS 设备需要设置一个 Facebook 账户才能使用原生组件。

创建一个新的方法displayNativePostDialog,如下面的代码片段所示:

- (BOOL)displayNativePostDialog
{
    // You can get an img from any source: camera or image library
    UIImage *img = [UIImage imageNamed:@"book.jpg"];
    NSString *bookTitle = [NSString stringWithFormat:@"Checkout %@", self.book.title];

    bool displayNativeDialog = [FBNativeDialogs presentShareDialogModallyFrom:self
                                                                  initialText:bookTitle
                                                                        image:img
                                                                          url:nil
                                                                      handler:^(FBNativeDialogResult result, NSError *error) {}];
    return displayNativeDialog;
}

当当前 iOS 设备与 Facebook 账户相关联时,此方法返回true。此方法使用图像来创建新故事。您可以将图像拖放到当前项目中,并使用imageNamed方法引用它。您还可以使用 iOS API 从相机或媒体库获取图片。还有可能使用它们的 URL 上传多张图片。有关 Facebook 本地对话框的更多详细信息,请参阅developers.facebook.com/docs/reference/ios/3.6/class/FBNativeDialogs/

我们将在publishCurrentBook方法中调用displayNativeDialog方法作为第一条指令。如果该方法返回false,表示当前设备没有 Facebook 集成,我们将调用displayWebDialog。新的publishCurrentBook方法看起来如下代码片段:

- (void)publishCurrentBook
{
    BOOL displayNativePostDialog = [self displayNativePostDialog];

    // NO FACEBOOK INTEGRATION
    if (!displayNativePostDialog) {
        // Create dictionary for Facebook web dialog
        NSString *name = [NSString stringWithFormat:@"Checkout %@", self.book.title];
        NSString *caption = [NSString stringWithFormat:@"Score %@", self.book.vote];
        NSString *description = self.book.review;
        NSString *pictureUrl = @"http://www.iconpot.com/icon/thumbnail/open-book-vector.jpg";

        NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                       name, @"name",
                                       caption, @"caption",
                                       description, @"description",
                                       pictureUrl, @"picture",
                                       nil];

        if (!self.myWall) {
            [params setObject:self.selectedFriend.id forKey:@"to"];
            self.myWall = YES;
        }

        [self displayWebPostDialog:params];
    }
}

以下截图显示了本地分享对话框的外观:

图片

本地分享对话框

上述截图显示了通过displayWebDialog代码在左侧设置图像的本地对话框。本地对话框提供了通过点击朋友按钮更改受众的能力,并通过点击添加位置传递用户当前位置的信息。我们还可以将 Facebook 相册与我们即将上传的图片关联起来。

图片

使用 Facebook 的本地分享对话框更新故事

上述截图显示了使用 Facebook 本地对话框更新的故事。不幸的是,帖子没有报告我们的社交应用程序的名称和书籍信息的一部分。

为了增加我们的应用程序在 Facebook 平台上的可见性,我们绝对应该选择 Web 对话框。

摘要

在本章中,我们学习了如何使用新 Facebook SDK 的两个重要组件:本地和 Web 对话框。我们使用了这两个组件在用户的墙或其朋友的墙上发布内容。我们学习了在执行发布操作之前请求和检查公共权限。我们还实现了一种在用户新闻源上发布信息的方法。

本章的一个重要部分集中在如何使用 Storyboard 创建社交发布界面并在视图控制器之间传递信息。

如果我们想要定制用户体验并当然在用户的动态中推广我们的应用程序,Web 对话框绝对推荐。

第六章。Facebook Graph API

在本章中,我们将深入研究 Facebook Graph API。

注意

为了访问 Facebook iOS SDK API 参考,请访问 developers.facebook.com/docs/reference/api/

新的API应用程序编程接口)是由 Facebook 工程师开发的,以取代旧的REST表示状态传输)网络服务。Graph API 是获取和存储 Social Graph 内数据的主要工具。它基于低级 HTTP 动词(GET、POST、PUT 等)。Facebook SDKs 也是基于 Graph API 的。

通过 Graph API 可用的功能

使用 Graph API,我们有权访问所有必要的权限下的 Social Graph 信息。重要的是要理解,Facebook 的一些 API 有使用限制,以防止滥用,例如,下载图片。

当我们从核心图结构读取数据时,我们有以下功能可用:

  • 图片: 这些是个人资料图片。

  • 选择结果: 使用过滤器,可以控制哪些字段包含在响应中。

  • 分页: 这是定义响应数据限制的能力。这实际上非常有用,例如,当我们尝试下载用户时间线信息时。

  • 搜索: 它提供了搜索的能力;然而,请求需要定义一个搜索查询和对象类型。

  • 权限和登录协议: 这些是使用 Graph API 访问敏感数据所必需的。

Graph APIs 提供了从用户的个人时间线发布和删除信息的能力。我们还可以通过提供RSVP、创建相册、写笔记和引用链接与事件进行交互。

Graph API 的一个重要特性是接收实时更新的能力。

developers.facebook.com/docs/reference/api/realtime/

当应用程序订阅特定对象的更新时,我们需要定义一个回调 URL。Facebook 平台将在订阅对象发生变化时调用该 URL。

Graph API 探索器

学习如何使用 Graph API 的最佳方式是通过 Graph Explorer。Graph API Explorer 是一个调试工具,它通过模拟 Graph API 调用帮助开发者理解如何使用 Graph API。

为了访问探索工具,请访问 developers.facebook.com/tools/explorer

第一次访问 Graph Explorer 时,调试工具将显示我们的 Facebook 账户idname。以下截图显示了 Graph API Explorer 界面:

Facebook 动态提供访问令牌,并允许我们访问私有数据。我们可以在查询输入字段下方的面板中输入自己的查询并查看结果。左侧的栏提供响应的数据过滤;我们可以决定在查询响应中显示哪些字段。

探索工具提供了许多功能,我强烈建议您查看它们,因为它们不会在本书中介绍。

使用 Facebook iOS SDK 中的 Graph API

为了在我们的社交应用中使用 Graph API,我们将使用一个名为 FBRequestConnection 的组件。

之前提到的类提供了方便的方法来执行 Graph API 调用,并完美处理响应,因为它将与社交平台创建单个 HTTP 连接。FBRequestConnection 仅在当前 FBSession 打开且具有有效令牌时工作。

FBRequestConnection 的职责如下:

  • 为您的 Graph API 请求创建正确的 URI 并将正确的 URN 附加到基础 Graph Facebook URL (graph.facebook.com/)

  • 获取当前活动的 FBSession,提取相关的安全令牌,并将安全令牌附加到 Graph API 请求

  • 处理连接开始/结束/取消和批量请求

使用 FBRequestConnection,我们有几种方法来执行 Graph API 请求。执行此类请求的所有方法都需要 FBRequestHandler 作为输入参数。

typedef void (^FBRequestHandler)(
FBRequestConnection *connection,
id result,
NSError *error);

以下 Graph API 方法可供我们方便使用:

  • + (FBRequestConnection *)startForMeWithComplentionHandler (FBRequestHandler)handler: 它执行一个请求以获取用户信息 (/me)。它使用通过 FBSession activeSession 获取的活动会话。

  • + (FBRequestConnection *)startForMyFriendWithComplentionHandler (FBRequestHandler)handler: 它执行一个请求以获取用户的朋友 (/me/friends)。此操作需要一个活动会话。

  • + (FBRequestConnection *) startForPlacesSearchAtCoordinate:(CLLocationCoordinate2D)coordinate radiusInMeters:(NSInteger)radius resultsLimit:(NSInteger)limit searchText:(NSString*)searchText completionHandler (FBRequestHandler)handler: 它返回与 searchText` 字符串匹配的、由坐标和半径定义的特定区域的地点。我们需要为从该请求返回的结果数量定义一个限制。

  • + (FBRequestConnection*)startForPostStatusUpdate:(NSString *)message completionHandler (FBRequestHandler)handler: 它执行一个请求,在用户的个人时间轴上发布状态更新。

  • + (FBRequestConnection*)startForUploadPhoto:(UIImage *)photo completionHandler (FBRequestHandler)handler: 它执行一个 POST 请求来上传照片。

每次我们尝试执行 Graph API 请求时,我们都使用 Graph API 探索工具来检查响应。

在接下来的章节中,我们将使用一些 FBRequestConnection 方法来构建和执行 Graph API 请求。

下面的示例与迄今为止我们构建的应用程序没有直接关联;因此,它们可以很容易地用于不同的项目。

获取用户信息

在第四章显示用户资料中,我们使用了FBLoginView的代理方法来获取和显示用户信息。FBLoginView使用 Graph API 为我们获取了这些信息。

FBRequestConnection允许我们独立于FBLoginView获取用户资料信息,例如,自定义用户界面和登录流程。

- (void)fetchUserInfoWithGraphApi
{
    [FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        if (error) {
            NSString *title = @"Graph API Error";
            NSString *message = @"Error retrieving user information through Graph API";
            UIAlertView *errorGraphAPIMessage = [[UIAlertView alloc] initWithTitle:title
                                                                              message:message
                                                                             delegate:nil
                                                                    cancelButtonTitle:nil
                                                                    otherButtonTitles:@"OK", nil];
            [errorGraphAPIMessage show];
        } else {
            NSLog(@"User information: %@", result);
        }
    }];
}

上述代码展示了startForMeWithComplentionHandler的实现。请求处理程序将检查是否存在任何错误。如果没有错误,处理程序将使用日志界面上的结果变量显示用户资料信息。结果变量中的对象是一个id<FBGraphUser>对象。

注意

更多关于FBGraphUser的信息,请访问

developers.facebook.com/docs/reference/ios/3.6/protocol/FBGraphUser/.

获取用户的好友

在第四章显示用户资料中,我们创建了一个视图控制器来显示用户的好友列表。现在,让我们考虑一个情况,即表格视图不是我们想要的交互类型。我们可能需要自定义我们的界面,并直接从 Facebook 平台获取用户的好友列表信息。

- (void)fetchUserFriendsListWithGraphAPI
{
    [FBRequestConnection startForMyFriendsWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        if (error) {
            NSString *title = @"Graph API Error";
            NSString *message = @"Error retrieving user friends list through Graph API";
            UIAlertView *errorGraphAPIMessage = [[UIAlertView alloc] initWithTitle:title
                                                                           message:message
                                                                          delegate:nil
                                                                 cancelButtonTitle:nil
                                                                 otherButtonTitles:@"OK", nil];
            [errorGraphAPIMessage show];
        } else {
            NSLog(@"Friends information: %@", result);
        }
    }];
}

上述代码展示了startForMyFriendWithComplentionHandler的一个示例。前面的代码向平台发出请求。在这种情况下,我们期望的结果是包含用户好友列表的id<FBGraphUser>

获取用户的照片

获取用户的照片需要访问这些数据的权限。我们首先需要实现用户请求权限;如果成功,我们可以获取用户的照片:

- (void)fetchUserPhotosWithGraphApi
{
    // Ask for user_photos permissions
    NSString *permission = @"user_photos";
    if ([FBSession.activeSession.permissions indexOfObject:permission] == NSNotFound) {
        [FBSession.activeSession requestNewReadPermissions:[NSArray arrayWithObject:permission]
                                         completionHandler:^(FBSession *session, NSError *error) {
            if (!error) {
                [self fetchUserPhotos];
            } else {
                if (error.fberrorCategory == FBErrorCategoryUserCancelled) {
                    NSString *title = @"Permission Error";
                    NSString *message = @"User Photos Permission was not granted";
                    UIAlertView *errorGraphAPIMessage = [[UIAlertView alloc] initWithTitle:title
                                                                                   message:message
                                                                                  delegate:nil
                                                                         cancelButtonTitle:nil
                                                                         otherButtonTitles:@"OK", nil];
                    [errorGraphAPIMessage show];
                }
            }
        }];
    } else { // If permissions present, fetch photos
        [self fetchUserPhotos];
    }
}

上述代码片段展示了如何对用户进行请求以访问照片信息。如果FBSession中已经存在权限,我们可以执行 Graph API 请求;否则,我们必须等待用户给予我们权限。

- (void)fetchUserPhotos
{
    [FBRequestConnection startWithGraphPath:@"/me/photos"
                          completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        if (error) {
            NSString *title = @"Graph API Error";
            NSString *message = @"Error retrieving user photos through Graph API";
            UIAlertView *errorGraphAPIMessage = [[UIAlertView alloc] initWithTitle:title
                                                                           message:message
                                                                          delegate:nil
                                                                 cancelButtonTitle:nil
                                                                 otherButtonTitles:@"OK", nil];
            [errorGraphAPIMessage show];
        } else {
            NSLog(@"User photos information: %@", result);
        }
    }];
}

要获取用户的照片,我们可以使用startWithGraphPath方法。此方法允许我们通过将 URN 作为输入参数传递来自定义我们的 Graph API 请求,例如,/me/photos。结果 URI 将是graph.facebook.com/me/photos

结果变量是一个包含当前用户图片列表的FBGraphObject类型。

发布状态更新

要执行任何发布操作,我们明确需要用户的权限。通过 Graph API 发布状态更新首先需要我们请求正确的权限,一旦获得批准,就在 Facebook 平台上执行请求。

- (void)postStatusUpdateUsingGraphAPI
{
    // Ask for post update permissions
    NSString *permission = @"user_photos";
    if ([FBSession.activeSession.permissions indexOfObject:permission] == NSNotFound) {
        [FBSession.activeSession requestNewPublishPermissions:[NSArray arrayWithObject:permission]
                                              defaultAudience:FBSessionDefaultAudienceFriends
                                            completionHandler:^(FBSession *session, NSError *error) {
                                                if (!error) {
                                                    [self postStatusUpdate];
                                                } else {
                                                    if (error.fberrorCategory == FBErrorCategoryUserCancelled) {
                                                        NSString *title = @"Permission Error";
                                                        NSString *message = @"Publish Action Permission was not granted";
                                                        UIAlertView *errorGraphAPIMessage = [[UIAlertView alloc] initWithTitle:title
                                                                                                                       message:message
                                                                                                                      delegate:nil
                                                                                                             cancelButtonTitle:nil
                                                                                                             otherButtonTitles:@"OK", nil];
                                                        [errorGraphAPIMessage show];
                                                    }
                                                }
                                            }];
    } else { // If permissions present, publish the story
        [self postStatusUpdate];
    }
}

一旦发布更新权限被授予,我们就可以运行postStatusUpdate代码。以下代码片段展示了如何在用户的动态时间轴上发布新的状态更新:

- (void)postStatusUpdate
{
    [FBRequestConnection startForPostStatusUpdate:@"Posting my update through my new app!"
                                completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {

        NSString *title = @"Graph API Success";
        NSString *message = @"Status Update posted";

        if (error) {
            title = @"Graph API Error";
            message = @"Error posting update through Graph API";
        } else {
            NSLog(@"Post information: %@", result);
        }

        UIAlertView *graphAPIMessage = [[UIAlertView alloc] initWithTitle:title
                                                                  message:message
                                                                 delegate:nil
                                                        cancelButtonTitle:nil
                                                        otherButtonTitles:@"OK", nil];
        [graphAPIMessage show];
    }];
}

发布新时间线更新的结果是新的帖子 ID。

图片

发布新照片

发布新照片需要photo_upload权限。以下代码展示了如何请求上传照片权限并在平台上执行请求。

- (void)postPictureUsingGraphAPI
{
    // Ask for post picture permission
    NSString *permission = @"photo_upload";
    if ([FBSession.activeSession.permissions indexOfObject:permission] == NSNotFound) {
        [FBSession.activeSession requestNewPublishPermissions:[NSArray arrayWithObject:permission]
                                              defaultAudience:FBSessionDefaultAudienceFriends
                                            completionHandler:^(FBSession *session, NSError *error) {
                                                if (!error) {
                                                    [self postPhoto];
                                                } else {
                                                    if (error.fberrorCategory == FBErrorCategoryUserCancelled) {
                                                        NSString *title = @"Permission Error";
                                                        NSString *message = @"Upload Photo Permission was not granted";
                                                        UIAlertView *errorGraphAPIMessage = [[UIAlertView alloc] initWithTitle:title
                                                                                                                       message:message
                                                                                                                      delegate:nil
                                                                                                             cancelButtonTitle:nil
                                                                                                             otherButtonTitles:@"OK", nil];
                                                        [errorGraphAPIMessage show];
                                                     }
                                                }
                                            }];
    } else { // If permissions present, upload the photo
        [self postPhoto];
    }
}

当照片上传权限被授予时,我们可以使用postPhoto方法执行 Graph API 请求。以下代码展示了如何使用 Graph API 上传照片:

- (void)postPhoto
{
    // You can get an img from any source: camera or image library
    UIImage *img = [UIImage imageNamed:@"book.jpg"];
    [FBRequestConnection startForUploadPhoto:img
                           completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                               NSString *title = @"Graph API Success";
                               NSString *message = @"Picture uploaded";

                               if (error) {
                                   title = @"Graph API Error";
                                   message = @"Error uplaoding picture through Graph API";
                               } else {
                                   NSLog(@"Picture posted information: %@", result);
                               }

                               UIAlertView *graphAPIMessage = [[UIAlertView alloc] initWithTitle:title
                                                                                         message:message
                                                                                        delegate:nil
                                                                               cancelButtonTitle:nil
                                                                               otherButtonTitles:@"OK", nil];
                               [graphAPIMessage show];
    }];
}

上述代码使用了一个 iOS 项目的图片;然而,我们可以从任何来源获取图片,例如相机或库。请求的结果是 Facebook 平台上的图片 ID。

图片

摘要

在本章中,我们重点关注 Facebook iOS SDK 最重要的部分——Graph APIs。我们学习了如何使用这些 API 与平台进行通信。Graph API 方法为我们提供了灵活性,如果我们不喜欢原生或 Web 组件提供的 GUI,我们可以构建自己的 GUI。

Graph API 探索器是我们实现任何与平台通信之前都应该使用的工具。它将帮助我们理解与社会网络通信的请求和响应格式。

使用原生组件,我们只能使用 Graph API 提供的功能子集。Graph API 是我们用来与平台交互以及获取用户及其朋友信息的强大且灵活的工具。

第七章. 分发您的社交应用

在本章中,我们将回顾一些有用的策略,以分发和使我们的社交应用病毒式传播。

我们将在社交渠道上推广我们的应用;例如应用中心。一个重要的工具是能够通过 Facebook iOS SDK 向我们的朋友发送移动设备邀请。

社交渠道

开发者有多种渠道可以用来分发和推广他们的社交应用。我们可以根据我们构建的应用类型使用不同的策略。在本节中,我们将关注如何通过 Facebook 工具提高我们应用的可见度。

Feed 和 Timeline 是我们社交应用可以使用的两个内置工具。在上一章中,我们实现了在用户的 Timeline 上发布状态更新和新故事的功能。

在本章中,我们将描述如何使用应用中心来提高我们应用的可见度。我们可以利用的一个重要功能是邀请 Facebook 朋友加入我们的应用。

应用中心

我们已经在第一章“Facebook 平台简介”中介绍了 App 中心。在本节中,我们将利用它来扩大我们的社交应用可见度。

应用中心是您应用的主要展示窗口。作为开发者,我们必须利用这个重要的工具。一旦我们的社交应用在应用中心可用,我们的受众潜力可能超过十亿用户。

为了让我们的应用在 Facebook 应用中心列出,我们需要创建应用页面详情。这个页面详情将提供有关使我们的应用独特并吸引最终用户的功能信息。Facebook 在应用获得批准并在应用中心列出之前会审查每个页面详情。

让我们从 Facebook 应用仪表板开始创建我们的应用页面详情。

想了解更多详情,请访问 developers.facebook.com/apps

在左侧栏中,选择我们目前正在工作的应用,然后点击编辑应用按钮。

应用仪表板编辑应用

在左侧栏中选择应用详情,你应该能看到以下截图类似的内容:

应用详情

当输入你的应用信息时,请考虑以下指南:

  • 描述:这在应用中心是唯一的。

  • 详细描述:这个内容应该比描述更详细。

  • 标语:这不应该包含显示名称

  • 隐私政策网址服务条款网址用户支持电子邮件/网址:这些是需要定义的强制字段。

通过应用详情仪表板,您可以自定义您的应用页面详情的外观。

我们需要确保 Facebook 登录 功能已启用,以便在 Facebook 应用中心看到我们的社交应用。我们还将启用 深度链接,这将在本章的“邀请朋友”部分中稍后解释。为了编辑应用设置,我们可以点击左侧栏上的 设置 链接。

图片

应用仪表板左侧栏

选择如图所示的 原生 iOS 应用

图片

iOS 应用设置

当您启用 iOS 集成(Facebook 登录/深度链接)时,您还需要定义 iPhone 应用商店 ID 或 iPad 应用商店 ID。

现在我们已经准备好了所有设置,我们可以回到应用详情页面仪表板,查看网页预览。当我们觉得网页预览可以接受时,我们最终可以提交我们的详情页面以供审查。

图片

提交应用详情页面

在我们能在应用中心看到我们的应用详情页面之前,我们需要等待我们的应用详情页面获得批准。

发送到移动设备

“发送到移动设备”功能是为了让用户在探索 Facebook 网页门户时能够在其设备上安装移动应用程序而引入的。

发送到移动设备是 Facebook 新推出的一个功能,旨在简化移动应用程序安装流程。当用户在浏览应用中心时,他们可以点击 发送到移动设备 按钮。一旦用户点击该按钮,他们将通过他们的移动设备登录 Facebook 移动,Facebook 将向他们的设备发送邀请。通过点击通知,用户将被重定向到应用商店或 Google Play。这是通过 深度链接 设置实现的。

图片

发送到移动设备

邀请朋友

在本节中,我们将描述一个新的应用流程,邀请我们的 Facebook 朋友使用我们的新社交应用。在第三章“连接到 Facebook 用户账户”中,我们构建了 FBFriendPickerViewController 以便我们可以选择多个朋友。在本节中,我们将利用这一功能并构建一个原生和网页对话框,与我们的朋友分享信息。

为了发送应用邀请,我们的 Facebook 应用需要定义 Facebook 应用设置中的“应用在 Facebook 上”设置。访问 Facebook 应用仪表板并选择我们当前的应用。定位到“应用在 Facebook 上”部分,如图所示:

图片

Facebook 应用部分

打开该部分并填写必要的字段,如图所示:

图片

Facebook 应用

如果您没有 Canvas URL,请查看以下链接以创建一个:

developers.facebook.com/docs/appsonfacebook/tutorial/

Canvas URL 是从我们的 iOS 应用向我们的 Facebook 朋友发送邀请所必需的。

现在,我们可以专注于在我们的社交应用中编码邀请功能。

打开 Storyboard 并选择 Facebook 场景。

图片

Facebook 场景

在好友按钮下方创建一个新按钮,如下面的截图所示:

带有邀请好友按钮的 Facebook 场景

使用 实用工具 | 显示属性检查器 通过取消选中 启用 复选框将默认按钮状态更改为禁用。下面的截图显示了属性检查器控制面板:

控制面板—未选中启用复选框

在属性部分下的按钮部分中,更改 状态配置 的背景颜色,如下面的截图所示:

更改背景颜色

下面的截图显示了调整按钮设置的最终结果:

带有禁用邀请好友按钮的 Facebook 场景

打开辅助编辑器并验证 LBFacebookViewController.m 文件是否已打开在您的右侧。

助理编辑—LBFacebookViewController.m

选择 邀请好友 按钮,并在 LBFacebookViewController 中创建一个新动作。这可以通过在键盘上按住 Control 键,并在 .m 文件中拖放蓝色箭头来完成。将新方法命名为 onInviteFriendsClick

onInviteFriendsClick

下面的代码片段显示了 onInviteFriends 方法的代码:

- (IBAction)onInviteFriendsClick:(id)sender {
    [self sendAppInvite];
}

前面的方法调用了 sendAppInvitesendAppInvite 方法将创建一个 Web 对话框组件,允许用户选择要将邀请发送给哪些好友。

- (void)sendAppInvite
{
    [FBWebDialogs presentRequestsDialogModallyWithSession:nil
                                                  message:@"iLikeBook"
                                                    title:@"Try iLikeBook. It's really fun!"
                                               parameters:nil
                                                  handler:^(FBWebDialogResult result, NSURL *resultURL, NSError *error) {
                                                      NSLog(@"Result URL: %@", resultURL);
                                                     if (!error) {
                                                         if (result == FBWebDialogResultDialogNotCompleted) {
                                                             NSLog(@"User canceled request.");
                                                         } else {                
                                                             NSDictionary *urlParams = [self parseURLParams:[resultURL query]];
                                                             if (![urlParams valueForKey:@"request"]) {
                                                                 NSLog(@"User canceled request.");
                                                             } else {
                                                                 NSString *requestID = [urlParams valueForKey:@"request"];
                                                                 NSLog(@"Request ID: %@", requestID);
                                                             }
                                                         }
                                                     } else {
                                                         NSLog(@"Error sending request.");
                                                     } 
     }];
}

前面的代码片段显示了 sendAppInvite 方法的实现。此方法将使用 FBWebDialogs 类实例化一个新的 Web 对话框组件。我们在第五章 在墙上发布 中使用 FBWebDialogs 在用户的 Timeline 上发布新的故事。

presentRequestDialogModallyWithSession 类方法将创建一个带有消息和标题信息的请求对话框。使用处理程序,我们可以检查用户是否完成了或取消了 Web 对话框。它还可以检查 Facebook 请求是否成功或失败。

对于处理程序来说,一个重要的变量是 resultURL。它提供了关于我们请求结果的信息。一旦我们从平台收到响应,我们可以使用 parseURLParams 辅助函数解析 resultURL 信息,以提取新的邀请请求 ID。

// Provided by Facebook SDK Samples
- (NSDictionary*)parseURLParams:(NSString *)query {
    NSArray *pairs = [query componentsSeparatedByString:@"&amp;"];
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
    for (NSString *pair in pairs) {
        NSArray *kv = [pair componentsSeparatedByString:@"="];
        NSString *val =
        [[kv objectAtIndex:1]
         stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        [params setObject:val forKey:[kv objectAtIndex:0]];
    }
    return params;
}

当我们运行应用程序时,点击邀请好友按钮将创建新的对话框,如下面的截图所示:

用于发送邀请的 FBWebDialogs

新对话框允许用户从我们的 Facebook 列表中选择好友,并使用搜索查询来过滤显示的好友列表。

一旦用户点击 发送 按钮,应用程序将向 Facebook 平台发送新的请求,将邀请转发给选定的好友。如果我们的 Facebook 应用程序设置了 Canvas URL 值,Facebook 平台才会向我们的好友显示邀请。

在我们发送邀请后,我们的朋友可以在 Facebook 网页或移动应用上打开邀请。我们对将用户重定向到 App Store 感兴趣,一旦他们在 iOS 设备上点击 Facebook 通知。

图片

Facebook 通知

一旦用户点击 Facebook 通知,他们将被重定向到 App Store 以安装我们的新社交应用。

摘要

在本章中,我们学习了几种使用 Facebook 渠道分发我们的社交应用的方法。

分发我们的社交应用的主要渠道是 Facebook 应用中心。人们将能够根据类别或通过搜索功能发现我们的应用。

应用中心还提供了将链接发送到我们的移动设备以安装应用的功能。因此,如果我们正在使用 Facebook 桌面版浏览应用中心,我们可以通过发送包含应用链接的短信到我们的手机号码,直接安装应用。

让我们不要忘记我们在 Facebook 上最重要的资源,那就是我们的朋友。我们可以轻松地为他们创建邀请,以便分享我们的社交应用。

这些只是如何推广我们的社交应用的例子。我们可能使用自己的网站、Twitter 账户以及任何其他可以增加我们可见性的工具。

第八章. 推广您的社交应用

创建一个好的应用在社交平台世界中取得成功是不够的。同样重要的是,使用不同的渠道推广我们的应用。

我们应该通过确定我们想要接触的用户类型,并制定推广计划来定义我们应用的目标。

了解您的用户

Facebook 平台提供了一个数据分析工具,以了解用户类型以及他们如何使用它。

为了访问洞察力工具,请访问Facebook 应用仪表板并选择我们的社交应用。

点击如图所示的前一个屏幕截图中的编辑设置编辑应用

点击页面左侧栏上的洞察力。以下屏幕截图显示了洞察力工具的概览页面:

概览页面提供了有关我们活跃用户的信息,如下一屏幕截图所示。使用周期过滤器和导出按钮,我们可以将我们的数据导出为Excel逗号分隔值CSV)文件格式。

理解用户如何与我们的应用互动非常重要。基于洞察力,我们可以了解哪些功能在我们用户群体中更受欢迎。这提供了有用的反馈,因此我们可以专注于改进不太受欢迎的功能。以下屏幕截图显示了描述 Facebook 上活动的分享图表:

洞察力工具提供了有助于您了解应用如何吸引用户的信息。

我强烈建议您查看洞察力提供的所有功能,并在应用上线时充分利用它们。

增长您的受众

用户是我们应用最重要的资源。我们拥有的用户越多,越好。然而,尽可能多地增长我们的受众也很重要。

我们探索了一些以下技术来增长我们的受众:

  • 通过应用发布状态更新

  • 邀请 Facebook 朋友使用我们的应用

  • 使用 Facebook 应用中心

我们可以使用其他技术来使我们的应用病毒式传播。我们应该考虑 Facebook 平台提供的所有可用推广渠道。

  • 画布页面:这是我们应用中一个非常重要的浏览窗口。随着应用排名的提升,画布页面将被访问得更多。因此,我们应该仔细关注页面上列出的所有细节。

  • 向朋友推荐:这是从 Facebook 网页直接与朋友分享您应用的直接方式。

  • 开放图:这是一个在 Facebook 平台上产生引人入胜故事的协议,它赋予开发者自定义外观、感觉以及内容以吸引用户的能力。

移动广告

移动广告是 Facebook 平台为开发者和应用管理员提供的一项新功能,用于在Facebook 新闻源上推广他们的应用。使用广告管理器工具,我们可以轻松创建多平台广告。

注意

developers.facebook.com/docs/tutorials/mobile-app-ads/

能够制作出能够触达目标用户的广告,为我们推广移动社交应用提供了强大的工具。

为了使用移动广告,我们需要设置我们的社交应用。在你的社交应用项目中打开LBAppDelegate.m文件。识别applicationDIdBecomeActive方法。每次应用启动或恢复时都会调用此方法。我们需要更新该方法代码以支持移动广告。以下代码片段将使我们的社交应用能够使用移动广告:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
  // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
  [FBSession.activeSession handleDidBecomeActive];
  [FBAppEvents activateApp];
}

首先,我们调用FBsession.activeSession handleDidBecomeActive方法来解决 Facebook 登录流程的会话状态。

FBAppEvents activateApp方法查询 Graph API 以确定应用是否启用了Install归因,并发布 ID 以跟踪成功的安装。

在任务代码完成之后,我们可以继续创建将在用户新闻源上显示的真实移动广告。打开Facebook 仪表板应用,选择当前应用并编辑应用。确保沙盒模式已禁用,并且iPhone 应用商店 ID设置正确。我们可以在Apple 应用商店使用 URL 模板找到我们的App Store IDitunes.apple.com/us/app/my-great-app/APP_STORE_ID

使用您的 App Store 信息自定义之前的 URL。

在左侧栏中选择应用详情

应用详情页面,确保提供了所有必要的信息。我们已经在上一章中处理了此表单的填充。确保显示名称主要图标****75x75已设置。我强烈建议尽可能多地填写信息,以便在移动广告中获得更多信息。

现在,我们可以开始使用 Facebook 的广告创建工具。

注意

www.facebook.com/ads/create

以下截图显示了广告创建工具的着陆页:

在此页面中,您可以宣传 Facebook 平台上存在的任何内容。在这种情况下,我们想要推广我们的应用。选择iLikeBook并开始创建移动广告。

在以下截图您想做什么?中,让我们使用应用详情页面提供的信息创建一个新的移动广告:

在此部分,我们可以选择我们想要推进的活动的类型。我们有三个不同的选项:

  • 获取新用户

  • 增加应用互动

  • 查看高级选项

对于本书的范围,我们将创建获取新用户活动。选择获取新用户单选按钮。

我们现在可以通过“您的广告”部分定制广告的外观和感觉,例如,更改标题、描述和图标。在该部分的右侧,我们可以预览广告。这类广告将出现在Facebook 桌面应用的右侧栏中。

赞助故事部分为开发者提供了创建新闻源广告的能力。新闻源活动是最有效的一种,因为人们可以看到他们的朋友在使用哪些应用程序。

我们活动的下一步是选择我们的受众。作为最佳实践,我建议尽可能广泛地分配受众作为测试案例,然后逐渐缩小范围以确定受众目标。以下截图显示了受众部分。

图片

我们可以根据受众的地理位置、年龄和兴趣来定制我们的活动。

使用平台提供的默认选项,我们有近 1.6 亿人的受众。随着我们添加更多精确的兴趣,受众将减少。以下截图显示了定义精确兴趣条目后的新受众数量:

图片

新的受众大约有 1400 万人。再次强调,出于测试目的,我强烈建议您使用更广泛的受众。如果您只是尝试增加您应用程序的用户数量而没有受众目标,请保留默认设置。

图片

我们现在需要按照以下方式定义活动信息:

  • 账户信息

  • 活动名称、日程安排和预算

作为下一步,我们需要审查我们的广告并批准它。一旦移动广告获得批准,我们将在新闻源和 Facebook 右侧栏中看到我们的新广告。

移动广告为开发者提供了在整个 Facebook 平台上推广应用程序的能力,从桌面计算机到移动设备,使用不同的广告布局。

摘要

在本章中,我们学习了如何推广我们的社交应用程序。首先,我们必须使用 Facebook 平台提供的洞察工具考虑我们的目标受众。我们在上一章中探讨了几个技术。

移动广告是推广我们应用程序的好工具。我们可以设置广告以针对一组特定的人。作为良好实践,如果您要设置移动广告活动,请确保您从一个大目标开始。随着您对受众的了解加深,逐渐缩小目标。

移动广告计划为我们提供了不同价格和选项的活动。最终,通过最大的目标规模,我们可以针对整个 Facebook 社区。

posted @ 2025-10-27 08:49  绝不原创的飞龙  阅读(1)  评论(0)    收藏  举报