Obj-C-FusionTables 2.0.4

Obj-C-FusionTables 2.0.4

测试已测试
语言语言 Objective CObjective C
许可证 自定义
发布上次发布2016年9月

Arseniy Kuznetsov维护。




  • Arseniy Kuznetsov

Google Fusion Tables 是一种强大的互联网商店大融合和数据访问与可视化的各种方式的结合。虽然仍然被标记为 '实验性',但在 Fusion Tables API v2.0 的成熟度方面已经达到,并为开发者提供了丰富其应用跨多种开发平台的清洁和简单的方法。

在使用 Fusion Tables 时可能会遇到的潜在障碍之一是缺少官方的、专门的 Objective-C API。

Obj-C-FusionTables 是将 Fusion Tables 集成到 iOS 应用中的一种简单且易于使用的解决方案,它是完全基于 Google gtm-oauth2 和 gtm-http-fetcher 库构建的。

博客

Obj-C-FusionTables

安装

使用 CocoaPods,或者 手动设置

手动安装

  • Source/FusionTablesAPISource/GoogeService 文件夹中的所有文件添加到项目目标中。
  • 安装 Google gtm-oauth2 库

设置你的 Google 项目

为了与 Fusion Tables 和其他 Google 服务通信,你需要一个 OAuth 2.0 客户端 ID,当请求 OAuth 2.0 访问令牌时,应用程序将使用此 ID。

你项目的 OAuth 2.0 客户端 ID 可以在详细说明中设置,如 Google 开发者控制台 中所述。这里

在你的项目的 Google API 部分,启用以下 API

api

现在回到你的 Xcode 项目,在适当的位置(例如,在 App 的 Delegate application:didFinishLaunchingWithOptions: 方法中)插入以下代码行

[[GoogleAuthorizationController sharedInstance] registerClientID:<YOUR-OAUTH2-CLIENT_ID>]

示例项目

示例项目是一个通用的 iOS8 应用,它可以在 iPhone 和 iPad 模拟器上运行。其主要目的是展示 Obj-C-FusionTables 的典型用法,例如列出表、创建表、设置地图样式、添加信息窗口模板、执行 SQL 查询、插入和删除行、分享你的融合表格等。

如果您在Google账户中已有Fusion Tables,它们将在示例应用中显示。为了确保您数据的安全性,只有从示例应用内部创建的表格可以修改。

安装pods

在示例项目的目录下,运行

$ pod install

Google项目设置

要运行示例项目,您需要按照设置您的Google项目的上述说明,并在App的Delegate中的application:didFinishLaunchingWithOptions:方法中填写您自己的Google API密钥

使用方法

  • 按照上述方法安装Obj-C-FusionTables
  • 快速浏览Obj-C-FusionTables类,以熟悉概念。如果您已经对Google Fusion Tables API v2.0有所了解,那么大部分内容应该都能理解。
  • FTTable类是Fusion Table资源的Objective-C表示,拥有诸如list....insert....update....delete....等相应的方法。
  • 这同样适用于其他的Fusion Tables资源,如由FTTemplateFTStyle类表示的模板和样式。
  • FTSQLQuery类表示Fusion Table SQL查询资源,具有相应的select...insert...update...delete...等方法。
  • FTSQLQueryBuilder帮助构建各种SQL查询的SQL语句。
  • GoogleAuthorizationController类便捷地包装了Google认证库,提供了简单的登录/注销和认证通用请求到Google服务的简单方法。
  • GoogleServicesHelper提供对相关Google服务的轻量级易用访问,例如网址缩短器或Google Drive ACL。虽然像Google APIs Client这样的库已经覆盖了这些内容的更深度,但它们也会需要非平凡的安装,并引入另一套API。

几个快速代码示例

  • 读取Fusion Table列表
FTTable *ftTable = [[FTTable alloc] init];
ftTable.ftTableDelegate = self;
[ftTable listFusionTablesWithCompletionHandler:^(NSData *data, NSError *error) {
    if (error) {
        NSString *errorStr = [SimpleGoogleServiceHelpers remoteErrorDataString:error];
        NSLog(@"Error Listing Fusion Tables: %@", errorStr);
    } else {
        NSDictionary *ftItems = [NSJSONSerialization JSONObjectWithData:data
                                                                  options:kNilOptions error:nil];
      NSArray *ftTableObjects = [NSMutableArray arrayWithArray:ftItems[@"items"]];
      for (NSDictionary *ftTable in ftTableObjects) {
            NSLog(@"Table Name: %@", ftTable[@"name"]);
            NSLog(@"Table ID: %@", ftTable[@"tableId"]);
        }
    }
}];
  • 插入新的Fusion Table
FTTable *ftTable = [[FTTable alloc] init];
ftTable.ftTableDelegate = self;
[ftTable insertFusionTableWithCompletionHandler:^(NSData *data, NSError *error) {
    if (error) {
      NSString *errorStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
          NSLog(@"Error Inserting Fusion Table: %@", errorStr);
    } else {
      NSDictionary *contentDict = [NSJSONSerialization JSONObjectWithData:data
                                                                    options:kNilOptions error:nil];
          NSLog(@"Inserted a new Fusion Table: %@", contentDict);
    }
}];
  • 删除Fusion Table
FTTable *ftTable = [[FTTable alloc] init];
ftTable.ftTableDelegate = self;
[ftTable deleteFusionTableWithCompletionHandler:^(NSData *data, NSError *error) {
    [[SimpleGoogleServiceHelpers sharedInstance] decrementNetworkActivityIndicator];
    if (error) {
        NSString *errorStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"Error Deleting Fusion Table: %@", errorStr);
    }
}];

类似的编码模式适用于Fusion Tables模板和样式。

  • 插入Fusion Table行
FTSQLQuery *ftSQLQuery = [[FTSQLQuery alloc] init];
ftSQLQuery.ftSQLQueryDelegate = self;
[ftSQLQuery sqlInsertWithCompletionHandler:^(NSData *data, NSError *error) {
    if (error) {
        NSString *errorStr = [GoogleServicesHelper remoteErrorDataString:error];
        NSLog (@"Error Inserting Fusion Table Style: %@", errorStr);
    } else {
        NSDictionary *responceDict = [NSJSONSerialization
                                      JSONObjectWithData:data options:kNilOptions error:nil];
        NSArray *rows = responceDict[@"rows"];
        if (rows) {
            NSLog(@"Inserted %d %@", [rows count], ([rows count] == 1) ? @"row" : @"rows");
            NSLog(@"%@", rows);
            NSUInteger lastInsertedRowID = [(NSString *)((NSArray *)[rows lastObject])[0] intValue];
        } else {
            NSLog (@"Error processing Insert Rows response");
        }
    }
}];
  • 删除Fusion Table行
FTSQLQuery *ftSQLQuery = [[FTSQLQuery alloc] init];
ftSQLQuery.ftSQLQueryDelegate = self;
[ftSQLQuery sqlDeleteWithCompletionHandler:^(NSData *data, NSError *error) {
    if (error) {
        NSString *errorStr = [GoogleServicesHelper remoteErrorDataString:error];
        STFail (@"Error Inserting Fusion Table Style: %@", errorStr);
    } else {
        NSDictionary *responceDict = [NSJSONSerialization
                                      JSONObjectWithData:data options:kNilOptions error:nil];
        NSArray *rows = responceDict[@"rows"];
        if (rows) {
            NSUInteger numRowsDeleted = [(NSString *)((NSArray *)[rows lastObject])[0] intValue];
            NSLog(@"Deleted %d %@", numRowsDeleted, (numRowsDeleted == 1) ? @"row" : @"rows");
        } else {
            NSLog (@"Error processing Delete Rows response");
        }
    }
}];

委托者

例如,简要看一下上面的“删除表”代码,第一个快速的问题可能是:“那么表ID是从哪里来的?”由于FTTable类是一个无状态的Web资源表示,一种处理参数化的逻辑方式是通过委托模式。下面的FTTable委托定义如下

@protocol FTDelegate <NSObject>
@optional
- (NSString *)ftTableID;
- (NSArray *)ftColumns;
- (NSString *)ftTitle;
- (NSString *)ftDescription;
- (BOOL)ftIsExportable;
@end

这样更灵活,允许您在应用程序的适当位置实现委托,而不是进入参数化/子类化FTTable类。类似的方法也被用于其他Obj-C-FusionTables核心类,如FTStyleFTTemplate

FTSQLQuery委托者的设计模式略有不同,但本质上遵循相同的设计模式。

@protocol FTSQLQueryDelegate <NSObject>
@optional
- (NSString *)ftSQLSelectStatement;
- (NSString *)ftSQLInsertStatement;
- (NSString *)ftSQLUpdateStatement;
- (NSString *)ftSQLDeleteStatement;
@end

学习特定委托实现的简单方法之一是查看示例项目。显然,这需要一定水平的Fusion Tables API知识,但其Objective-C部分相当简单。以下是一个快速代码示例。

// Sample Fusion Table Title
- (NSString *)ftTitle {
    return @"My new cool table";
}
// Sample Fusion Table Columns Definition
- (NSArray *)ftColumns {
    return @[
     @{@"name": @"entryDate",
       @"type": @"STRING"
       },
     @{@"name": @"entryName",
       @"type": @"STRING"
       },
     @{@"name": @"geometry",
       @"type": @"LOCATION"
       }];
}

当然,了解API的另一种方法是查看Obj-C-FusionTablesTests(见下文)。

测试

这些测试旨在涵盖所有核心的Obj-C-FusionTables API操作。测试案例从创建表、样式、模板、插入示例行开始,到清理所有内容并恢复测试的Google账户到初始状态。

兼容性

Obj-C-FusionTables需要ARC,并针对iOS8及以上版本进行了优化。