您的当前位置:首页正文

2018-01-05 google GRPC for Ios X

来源:华拓网

单纯的抄袭复制~~~~~~~~~~

配置要求:

cocoaPods: Version 1.0 or Higher   查看版本 pod --Version

Xcode: version 7.2 or higher    :installed:sh [sudo] xcode-select --instal

Install with Homebrewsh brew install autoconf automake libtool pkg-config

2.配置好这些内容就去下载官网demo

下载:

Install gRPC plugins and libraries:

$cd grpc

$git submodule update--init

$make

$[sudo]make install

Install protoc compiler:

$brew tap grpc/grpc

$brew install google-protobuf

Run the server:

$cd examples/cpp/helloworld

$make

$./greeter_server&

Run the client:

$cd../../objective-c/helloworld

$pod install

Run the client app:

$ openHelloWorld.xcworkspace

3.以上是官网的demo,以下是自己的操作

(1)创建Xcode你的工程。创建.podspec 和Podfile

    $ pod spec create iOS_Demo 

我的.podspec文件如下:

Pod::Spec.new do |s|

  s.name         = "ProtoTest"

  s.version      = "0.0.1"

 s.license  = "New BSD"

  s.summary = "HelloWorld example!!!"

  s.source_files  = "Classes", "Classes/**/*.{h,m}"

  s.exclude_files = "Classes/Exclude"

  s.ios.deployment_target = "7.1"

  s.osx.deployment_target = "10.9"

  # Base directory where the .proto files are.

  src = "../../protos"

  # Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients.

  s.dependency "!ProtoCompiler-gRPCPlugin", "~> 1.0"

  # Pods directory corresponding to this app's Podfile, relative to the location of this podspec.

  pods_root = 'Pods'

  # Path where Cocoapods downloads protoc and the gRPC plugin.

  protoc_dir = "#{pods_root}/!ProtoCompiler"

  protoc = "#{protoc_dir}/protoc"

  plugin = "#{pods_root}/!ProtoCompiler-gRPCPlugin/grpc_objective_c_plugin"

  # Directory where the generated files will be placed.

  dir = "#{pods_root}/#{s.name}"

  s.prepare_command = <<-CMD

    mkdir -p #{dir}

    #{protoc} \

        --plugin=protoc-gen-grpc=#{plugin} \

        --objc_out=#{dir} \

        --grpc_out=#{dir} \

        -I #{src} \

        -I #{protoc_dir} \

        #{src}/*.proto

  CMD

  # Files generated by protoc

  s.subspec "Messages" do |ms|

    ms.source_files = "#{dir}/*.pbobjc.{h,m}", "#{dir}/**/*.pbobjc.{h,m}"

    ms.header_mappings_dir = dir

    ms.requires_arc = false

    # The generated files depend on the protobuf runtime.

    ms.dependency "Protobuf"

  end

  # Files generated by the gRPC plugin

  s.subspec "Services" do |ss|

    ss.source_files = "#{dir}/*.pbrpc.{h,m}", "#{dir}/**/*.pbrpc.{h,m}"

    ss.header_mappings_dir = dir

    ss.requires_arc = true

    # The generated files depend on the gRPC runtime, and on the files generated by protoc.

    ss.dependency "gRPC-ProtoRPC"

    ss.dependency "#{s.name}/Messages"

  end

  s.pod_target_xcconfig = {

    # This is needed by all pods that depend on Protobuf:

    'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1',

    # This is needed by all pods that depend on gRPC-RxLibrary:

    'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',

  }

end

以上.podspec内容:有几个重点

# Base directory where the .proto files are.

  src = "../../protos"    #指的就是在你的xcode工程内*.xcodeproj当前目录 上级目录的上级开始protos文件。

   #{src}/*.proto  指的的protos文件内的.proto的内容。通过终端命令查找编译。

(2)然后编译你的podfile($pod init  #创建podfile ),编译podfile如下:

# Uncomment this line to define a global platform for your project

# platform :ios, '9.0'

platform :ios, '8.0'

install! 'cocoapods', :deterministic_uuids => false

target 'ProtoTest' do

pod 'ProtoTest', :path => '.'

end

注意: pod 'ProtoTest', :path => '.' 是指当前目录下查询,ProtoTest.podspec的文件。

然后通过$pod install 进行编译grpc的库和内容

编译的库:

Downloading dependencies

Using !ProtoCompiler (3.0.0)

Using !ProtoCompiler-gRPCPlugin (1.0.0)

Using BoringSSL (6.0)

Using Protobuf (3.1.0)

Using gRPC (1.0.0)

Using gRPC-Core (1.0.0)

Using gRPC-ProtoRPC (1.0.0)

Using gRPC-RxLibrary (1.0.0)

这样库的就编译好了。并且在你工程中的pod内也就有对应的*.proto   对应编译出来的*.pbobjc.h/*.pbobjc.m/*.pbrpc.h/*.pbrpc.m  

4.下面就说说如何去利用

类中导入*.pbobjc.h/ *.pbobjc.m  /*.pbrpc.h/*.pbrpc.m  ,进行利用

比如我发起的网络请求:

 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

 //    request.timeoutInterval = 0.5;

    request.HTTPMethod = @"POST";

[request addValue:@"application/x-protobuf" forHTTPHeaderField:@"Content-Type"];

    BaseRequest *testBaseRequest = [[BaseRequest alloc] init];    // ProtocBaseRequest.pbobjc.h  中BaseRequest的类,中阐述如

   /********** ProtocBaseRequest.proto如下:**************/

            syntax = "proto3";

             message BaseRequest{

            string token=1;//用户标识 zyy

            string p=2;//加密P zyy

            string sign=3;//签名参数 zyy

            map SpareParameter= 4;//备用参数map zyy

           }

   /************************/

[testBaseRequest setP:@"p->Hello"];

[testBaseRequest setToken:@"token->hello"];

[testBaseRequest setSign:@"sign->hello"];

    request.HTTPBody = [testBaseRequest data];  //testBaseRequest转化为data请求数据

 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfigurationdefaultSessionConfiguration]];

 NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

 if (error)

        {

 NSLog(@"error = %@",error);

        }

 else

        {             

 BaseReply *reply = [[BaseReply alloc ] initWithData:data error:nil];

 BaseReply  *replyOne = [GPBMessage parseFromData:data error:&error]; 

//ProtocBaseReply.proto  生成的就是BaseReply

 NSLog(@"%@",result); 

       }

    }];

[task resume];

以上的利用就是对*.pbobjc.h。

对 *.pbrpc.h的利用请参考谷歌官网demo,