65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Facebook 个性化应用程序

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2012年11月9日

CPOL

7分钟阅读

viewsIcon

13426

如何访问和使用存储在个人 Facebook 个人资料中的数据来个性化应用体验

引言

在本文中,我们将讨论如何访问和使用存储在个人 Facebook 个人资料中的数据来个性化应用体验。能够预测上下文并根据个人偏好提供自定义体验的应用将获得更大、更有意义的用户参与度。

个性化机遇

与 Facebook 集成使开发人员能够构建高度互动、深度社交的应用程序。通过 Facebook 集成,购物应用可以根据个人喜欢的品牌和商店来预测其偏好。游戏可以根据其他游戏的分数和成就来选择玩家的难度级别。音乐应用可以根据个人喜爱的艺术家和场馆来预测其品味。所有这些信息都存在于个人的社交图谱中,并且可以通过 Facebook Graph API 进行访问(前提是个人授予权限)。

请始终记住,人们可以控制自己的数据。我们将讨论在个人不授予(或撤销)应用程序访问数据权限时如何优雅地处理失败,但请务必熟悉 Facebook 的隐私政策

Scrumptious 教程

Scrumptious 教程是 Facebook SDK for iOS 的一部分(Facebook SDK for Android 也有相应的版本)。完成本教程后,您将能够构建使用 Facebook 进行登录和身份验证、从个人 Facebook 个人资料检索信息、展示个人 Facebook 好友、显示附近 Facebook 地点列表以及发布到 Facebook Open Graph 的应用程序。

教程的完整版本可在 Facebook SDK 的 Samples 目录中找到。本文中提到的技术均以该完成样本为起点

个性化 Scrumptious 用户体验

在本教程的第一部分中,我们将根据个人声称会说的语言对 Scrumptious 体验进行简单调整。语言设置在您 Facebook 个人资料“关于”页面的“基本信息”部分。正如您从我的 Facebook 个人资料中看到的,我精通几种常用语言。

首先在 Xcode 中打开 Scrumptious 教程。(您可能希望复制一份,这样就不会修改完成版本,但是,嘿,您也可能想冒险一试!)

修改 Scrumptious 用户界面

首先,让我们修改 Scrumptious 界面,在我们的名字上方包含一个问候语。

打开 SCViewContoller.xib 并将已有的标签稍微向下移动(它是空白的,所以您可能需要四处点击才能找到它)。然后将一个新标签拖放到 Interface Builder 并将其放置在先前标签的上方。在下面的图片中,我将标签的文本设置为“Greeting!”以便您可以看到我做了什么。

在 Project Explorer 中按住 Option 键并单击 SCViewController.m,使其与 XIB 文件并排。按住 Control 键并拖动问候语标签到文件的“@interface”部分,并创建一个名为“greetingLabel”的 Outlet。

最后,在文件的“@implementation”部分合成该属性。

@synthesize greetingLabel = _greetingLabel;

现在,我们的用户界面有一个标签,我们可以用它来问候使用该应用程序的人。让我们根据该人声称会说的语言来改变问候语。

Facebook 权限

在访问个人资料信息之前,应用程序必须首先请求权限,并且个人必须授予权限。当个人使用 Facebook 登录应用程序且应用程序未请求额外权限时,应用程序将获得 基本权限 的访问权,包括个人资料 ID、姓名(名和姓)、用户名、性别和位置。

应用程序可以请求 扩展权限,这将允许应用程序从个人 Facebook 个人资料中检索更多信息或代表个人写入某些类型的数据。每个权限都必须明确请求,并且个人可以选择单独退出其中每个权限。您以前可能见过这样的对话框:

Open Graph 权限 使应用程序能够将某些类型的操作发布到 Facebook Open Graph。(注意:Open Graph 集成在 Scrumptious 教程的第 5 节中有详细介绍)

最后,用户和好友权限 使应用程序能够从某人的 Facebook 个人资料中获取详细信息。这些权限与其他权限略有不同。Facebook 扩展权限允许个人选择退出,而用户和好友权限则不允许。因此,应用程序仅在必要时请求这些权限非常重要。请求额外 Facebook 权限的应用程序与在完成登录过程之前放弃应用程序的人数之间存在相关性。

最后,请记住,只有在创建 Facebook 会话时才能获得读取权限。写入权限(我们不会在本教程中讨论)应在个人即将执行需要这些权限的操作时获得。

请求权限以获取个人信息

通过请求(并接收)user_likes 权限,可以获取有关个人所说语言的信息。让我们首先修改 SCAppDelegate.m 文件中 openSessionWithAllowLoginUI 方法中的原始权限请求调用,以请求 user_likes 权限。

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    return [FBSession openActiveSessionWithReadPermissions:[NSArray
        arrayWithObject:@"user_likes"]

allowLoginUI:allowLoginUI

    completionHandler:^(FBSession
*session, FBSessionState state, NSError *error) {
    [self
sessionStateChanged:session state:state error:error];
    }];
} 

从 Facebook 检索信息

让我们来看看询问个人语言的结果。为此,我们可以使用一个名为 Facebook Graph Explorer 的工具。如下图所示,Graph Explorer 允许我们对 Facebook 图谱运行查询并检索信息。

获得访问令牌后,我们可以运行查询以获取个人的语言列表(在本例中是我)。

{
    "id": "566480611",
    "name": "Prashant Sridharan",
    "languages": [
    {
        "id": "113301478683221",
        "name": "American English"
    },
    {
        "id": "112929422054734",
        "name": "Profanity in American Sign Language"
    },
    {
        "id": "108462045844299",
        "name": "Franglais"
    },
    {
        "id": "113599388650247",
        "name": "Klingon"
    }
]
}

我们获得的是一个 dictionary,然后我们可以对其进行查询。例如,要迭代此列表并打印每种语言的名称,我们只需编写以下 Objective-C 代码:

NSArray *languages = [user objectForKey:@"languages"];
    for (int i = 0; i < [languages count]; i++) {
        NSLog(@"Language: %@", [[languages objectAtIndex:i]
        objectForKey:@"name"]);
   }

使用权限个性化应用程序体验

既然我们知道如何查询 Facebook Graph 获取数据,那么让我们修改我们的应用程序,根据我们看到的语言显示不同的问候语。具体来说,如果此人承认会说克林贡语,我们将提供一个克林贡语的问候语。

为此,我们将在 SCViewController.m 文件中 populateUserDetails 方法的末尾添加以下内容:

[FBRequestConnection
startForMeWithCompletionHandler:^(FBRequestConnection *connection,
    id<FBGraphUser> user,
    NSError *error) {
        if ([user objectForKey:@"languages"]) {
            NSArray *languages = [user objectForKey:@"languages"];
            for (int i = 0; i < [languages count]; i++) {
                NSLog(@"Language: %@", [[languages objectAtIndex:i]
                objectForKey:@"name"]);
            if([[[languages objectAtIndex:i] objectForKey:@"name"] 
                isEqualToString:@"Klingon"]) {
                self.greetingLabel.text = @"Heghlu'meH QaQ jajvam!";
             }
         }
    }
}];

此代码首先确定字典中存在语言元素(毕竟,有些人可能根本没有指定任何语言,在这种情况下结果将为 nil)。然后,它迭代 ID/名称对,寻找名称为“Klingon”的对。如果找到该对,它将问候语的文本更改为“Heghlu'meH QaQ jajvam!”(这是克林贡语中“今天是死的好日子”的短语。根据 Marc Okrand 权威的“克林贡语词典”,克林贡人不喜欢“你好”和“问候”之类的社会礼仪,所以这是我们能做的最好的)。

我们完成的应用程序看起来像这样:

优雅地处理失败

但是,如果某人未授予 user_likes 权限怎么办?在这种情况下,我们的应用程序需要优雅地处理这种情况。我们将首先设置问候语标签的默认值,然后查询使用该应用程序的当前用户的活动权限,看看他们是否提供了该权限。

self.greetingLabel.text = @"Hello";
if (!([FBSession.activeSession.permissions
indexOfObject:@"user_likes"] == NSNotFound)) {
    // include code from previous section here
}

如果他们提供了,我们将执行上一节中的代码。如果他们没有提供,那么问候语标签的默认值已经设置。

个性化:新前沿

这是一个非常初步的示例,展示了如何查询 Facebook Graph 获取数据,然后根据这些信息定制应用程序体验。您决定将此个性化工作推向何种程度取决于您。除了复杂的个性化和推荐算法之外,通过查询信息和构建自定义应用程序行为,您可以做很多事情。但是,请记住要牢记几点:

  1. 不要请求过多权限,否则用户可能会选择退出。始终向用户提供请求这些权限的具体原因。赢得他们的信任。
  2. 不要一次性请求所有权限。随着用户遇到应用程序中需要更多权限的功能,逐步请求更多权限。
  3. 制定明确易懂的政策,向用户解释您将如何以及为何使用他们的数据。

提供情境化和个性化的体验是社交网络的下一个阶段。它将人们的数据转化为更沉浸式的应用程序,但反过来,它要求应用程序开发人员具有创造力、智慧和责任感。回报可能是巨大的,但正如一位智者所说:“能力越大,责任越大。”

© . All rights reserved.