iOS上的谷歌协议缓冲区(Google protocol buffers on iOS)

2019-06-23 21:17发布

是适用于iOS的metasyntactic静态库。 。 。

http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers

。 。 。 与普通的老C ++编译protofiles兼容? 我不想使用捆绑的编译器生成的OBJ-C。

有什么办法来编译由谷歌为iOS提供的图书馆吗?

Answer 1:

好。 看来,metasyntactic库(或任何其他第三方库)在这种情况下没有必要。 你可以只直接添加谷歌源到项目中。 我发现从尼古拉Ferruzzi在谷歌讨论组如下回答。 。 。

原来答案就在这里。 。 。

http://groups.google.com/group/protobuf/browse_thread/thread/ca4218d7db144252

这个答案的内容与图像,使一个永久记录包含如下...


编辑

由于在试图首次今晚再次,我需要除了那些下面列出几个步骤(这一点也适用protobuf的2.5.0)。

  • 你需要对libz.dylib链接。 您可以设置此在构建阶段>链接二进制与图书馆。
  • 要轻松去除所有的单元测试相关的东西,从谷歌目录外壳使用以下命令find . -name "*unittest*" -exec rm -rf {} \; find . -name "*unittest*" -exec rm -rf {} \;
  • 同时删除该文件夹名为testing
  • 注释#include <google/protobuf/testing/googletest.h>stringprintf.cc
  • 现在仔细按照下面的说明,并就应该可以正常。

我在我的应用程序使用最新版本的..你并不真的需要,如果你熟悉C objc直接++的支持,只有一个,你必须从通过的std ::点串NSData的,反之亦然。 而它很简单。

为了编译和测试伊夫发现是刚刚导入整个谷歌目录在我自己的项目:)最简单的方法(第二次,你可以使自己的框架,但为测试这个程序只是工作)

  • 下载最新版本
  • AUTOGEN配置,让像你刚才建设的MacOSX(你需要命令行工具)。 这样,你最终protoc
    二进制和MacOSX的图书馆(你不需要)
  • 打开你的Xcode的iOS项目
  • 加上“新文件”到你的项目,并选择谷歌目录
  • 谷歌头的目录添加到您的附加包含目录
  • 从protobuffer src目录添加的config.h到您的应用
  • 从谷歌组中删除包含UNITEST一切:)
  • 从谷歌组中删除编译器和Java东西;

你应该能够没有任何链接错误编译。 为了给你一个想法,这是我直接编译

然后你可以使用protoc生成C ++源文件的协议。 与objc使用它们,你必须重命名你的源到文件“毫米”,那么你可以这样做

TO序列化的NSData

假设你的消息被称为包

 - (NSData *)getDataForPacket:(Packet *)packet { std::string ps = packet->SerializeAsString(); return [NSData dataWithBytes:ps.c_str() length:ps.size()]; 

来读取的NSData

 - (Packet *)getPacketFromNSData:(NSData *)data { char raw[[data length]]; Packet *p = new Packet; [data getBytes:raw length:[data length]]; p->ParseFromArray(raw, [data length]); return p; } 


Answer 2:

你可以到一个Xcode 5项目中使用的CocoaPods通过添加以下行到你的Podfile增加对谷歌协议缓冲器支持。

pod 'GoogleProtobuf', '~> 2.5.0'

这将会把C ++版本的protobuf代码为波德为您的项目。 这也将添加protoc编译器的文件夹中Pods/GoogleProtobuf/bin/protoc您的项目中。

您可以在项目中创建自动的转换一个自定义生成规则.proto文件转换成.ph.{h,cc}文件。 这里是我是怎么做的:

设置一个生成规则“过程的源文件名称相符:* .proto使用自定义脚本”。 该脚本应包括以下内容:

cd ${INPUT_FILE_DIR}
${SRCROOT}/Pods/GoogleProtobuf/bin/protoc --proto_path=${INPUT_FILE_DIR} ${INPUT_FILE_PATH} --cpp_out=${INPUT_FILE_DIR}/cpp

设置输出文件,包括以下内容:

$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.h
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.cc

任何.proto您的包含文件在您的项目现在会自动转换为C ++,然后编译作为构建的一部分。



Answer 3:

编辑 :我已经回答了这个较早,但被主持人删除。 所以我已经包括从教程一些代码。

该教程的答案发布上述这几乎是一样的- 在iOS和Mac的Objective-C的使用谷歌协议缓冲器

按照learnvst的答案给出的步骤,并参阅了陷阱的意见。 我跟着除了完全相同的步骤

谷歌头的目录添加到您的附加包含目录加入我的头搜索路径src /目录,而不是谷歌的目录。

此外,当我做了#import xyz.pb.h该项目没有建设。 当我重新命名.m文件到.mm我是能够建立。 这一点在本教程中提到的非常微妙的:P。

基本上,这是导入任何.pb.h文件的任何.m文件,应以延长.mm改名

下面是本教程的一些内容 -

原型文件

package kotancode;

enum ZombieType {
    SLOW = 0;
    FAST = 1;
}

message ZombieSighting {
    required string name = 1;
    required double longitude = 2;
    required double latitude = 3;
    optional string description = 4;
    required ZombieType zombieType = 5 [default = SLOW];
}

ZombieSightingMessage.h

// -- ZombieSightingMessage.h - note my C++ object is not in the public interface.
#import <Foundation/Foundation.h>

@interface ZombieSightingMessage : NSObject
- (void)doSomething;
@end

ZombieSightingMessage.mm

// -- ZombieSightingMessage.mm
#import <UIKit/UIKit.h>
#import "ZombieSightingMessage.h"
#import "zombie.pb.h"

@implementation ZombieSightingMessage

- (void)doSomething {
    // Doing random stuff with a UIView here to show the mixing
    // of C++ and Objective-C/Cocoa syntax in the same file...
    UIView *uiView = [[UIView alloc] init];
    [uiView setCenter:CGPointMake(20, 10)];

    // instantiate my protobuf-generated C++ class.
    kotancode::ZombieSighting *zombieSighting = new kotancode::ZombieSighting();
    zombieSighting->set_name("Kevin");
    zombieSighting->set_description("This is a zombie");
    zombieSighting->set_latitude(41.007);
    zombieSighting->set_longitude(21.007);
    zombieSighting->set_zombietype(kotancode::ZombieType::FAST);

    // Some small tomfoolery required to go from C++ std::string to NSString.
    std::string x = zombieSighting->DebugString();
    NSString *output = [NSString stringWithCString:x.c_str() encoding:[NSString defaultCStringEncoding]];
    NSLog(@"zombie: %@", output);

    // Instantiate another zombie from the previous zombie's raw bytes.
    NSData *rawZombie = [self getDataForZombie:zombieSighting];
    kotancode::ZombieSighting *otherZombie = [self getZombieFromData:rawZombie];

    // Dump the second zombie so we can see they match identically...
    NSString *newOutput = [NSString stringWithCString:otherZombie->DebugString().c_str() encoding:[NSString defaultCStringEncoding]];
    NSLog(@"other zombie: %@", newOutput);

    // Grimace all you want, but this is C++ and we need to clean up after ourselves.
    free(zombieSighting);
    free(otherZombie);

}

// Serialize to NSData. Note this is convenient because
// we can write NSData to things like sockets...
- (NSData *)getDataForZombie:(kotancode::ZombieSighting *)zombie {
    std::string ps = zombie->SerializeAsString();
    return [NSData dataWithBytes:ps.c_str() length:ps.size()];
}

// De-serialize a zombie from an NSData object.
- (kotancode::ZombieSighting *)getZombieFromData:(NSData *)data {
    int len = [data length];
    char raw[len];
    kotancode::ZombieSighting *zombie = new kotancode::ZombieSighting;
    [data getBytes:raw length:len];
    zombie->ParseFromArray(raw, len);
    return zombie;
}

@end

编辑 :我使用的Xcode 4.5。 我跟所有的步骤后,即使我得到一个连接错误。

符号未找到i386硬件架构

由于这个我不能运行模拟器的代码。 但它的工作实际设备上



Answer 4:

我猜根据实际的问题我的意见是值得张贴作为一个答案:

我使用所提供的原生的OBJ代码生成的稍作修改的版本Booyah

它支持重复的开箱但为了使用需要将PBArray类型(基本上是类型的C缓冲液)转换为NSObjects的阵列,它代表ObjC快速枚举字段 - 无论是NSNumber的或对象的protobuf的消息。 你可以看到在更新后的快速列举的示例代码这一变化 。 你还可以添加一个类别上PBArray称为toObjects。

我只是用标记生成的代码-fno-objc-arc ,但你可以得到电弧,并从2.5的支持booyah引入请求 。

的方向是建立相当不错的,但如果人们想在我使用的范畴,我怎么建成的protobuf-objc插件更明确的指示,如何为类前缀(例如IXMyProtoMessage而不是MyProtoMessage)的支持或如何生成代码让我知道,我会尽量留出时间来写了一个帖子。 我使用它与很多跨项目依赖的> 50个原文件。

该库的一个弱点是,它不包括对所生成的代码,这样做类似的消息转换为NSDictionary中典型的Protobuf反射API会做一些哈克的东西与objC运行时(代码不遵循典型KV合规性)或写来自确实有反射API(我这样做是使用Python +的Jinja2)PROTOS自定义代码生成器。 或者 - 更好,但类似的困难,并增加反射API来代码生成器)。



文章来源: Google protocol buffers on iOS