記錄篇文章http://blog.csdn.net/g1602333924/article/details/52838887
單純的抄襲復制~~~~~~~~~~
一 grpc 的簡介(可參考谷歌http://www.grpc.io/)
1.配置可參考http://www.grpc.io/docs/quickstart/objective-c.html
配置要求:
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.配置好這些內(nèi)容就去下載官網(wǎng)demo
下載:
?$git clone https://github.com/grpc/grpc.git
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.以上是官網(wǎng)的demo,以下是自己的操作
(1)創(chuàng)建Xcode你的工程。創(chuàng)建.podspec 和Podfile
? ? $ pod spec create iOS_Demo?
這樣創(chuàng)建ProtoTest.podspec文件 然后編輯此文件可參考(http://guides.cocoapods.org/syntax/podspec.html)
我的.podspec文件如下:
Pod::Spec.new do |s|
? s.name ? ? ? ? = "ProtoTest"
? s.version? ? ? = "0.0.1"
?s.license? = "New BSD"
?s.homepage = "http://www.grpc.io/"
? s.summary = "HelloWorld example!!!"
? s.source = { :git => 'https://github.com/grpc/grpc.git' }
? s.author ? ? ? ? ? ? = { "" => "1602333924@qq.com" }
? 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內(nèi)容:有幾個重點
# Base directory where the .proto files are.
? src = "../../protos" ? ?#指的就是在你的xcode工程內(nèi)*.xcodeproj當前目錄 上級目錄的上級開始protos文件绊序。
? ?#{src}/*.proto ?指的的protos文件內(nèi)的.proto的內(nèi)容豪嗽。通過終端命令查找編譯。
(2)然后編譯你的podfile($pod init ?#創(chuàng)建podfile ),編譯podfile如下:
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
install! 'cocoapods', :deterministic_uuids => false
target 'ProtoTest' do
pod 'ProtoTest', :path => '.'
end
注意:?pod 'ProtoTest', :path => '.'?是指當前目錄下查詢散劫,ProtoTest.podspec的文件。
然后通過$pod install 進行編譯grpc的庫和內(nèi)容
編譯的庫:
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內(nèi)也就有對應的*.proto ? 對應編譯出來的*.pbobjc.h/*.pbobjc.m/*.pbrpc.h/*.pbrpc.m ?
4.下面就說說如何去利用
類中導入*.pbobjc.h/?*.pbobjc.m? /*.pbrpc.h/*.pbrpc.m ?估蹄,進行利用
比如我發(fā)起的網(wǎng)絡(luò)請求:
? ??NSURL?*url = [NSURL?URLWithString:@"http://115.239.231.164:8080//tv-http/user/verifyPhone"];
?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;//簽名參數(shù)?zyy
? ? ? ? ? ? map SpareParameter= 4;//備用參數(shù)map zyy
? ? ? ? ? ?}
? ?/************************/
[testBaseRequest?setP:@"p->Hello"];
[testBaseRequest?setToken:@"token->hello"];
[testBaseRequest?setSign:@"sign->hello"];
? ? request.HTTPBody?= [testBaseRequest?data]; ?//testBaseRequest轉(zhuǎn)化為data請求數(shù)據(jù)
?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的利用請參考谷歌官網(wǎng)demo,
參考:谷歌?http://www.grpc.io/自己理解著寫的,如發(fā)現(xiàn)有錯誤歡迎指正教導载城。