【移动应用开发技术】记一次技术调研(一) iOS 应用实现 gRPC 调用_第1页
【移动应用开发技术】记一次技术调研(一) iOS 应用实现 gRPC 调用_第2页
【移动应用开发技术】记一次技术调研(一) iOS 应用实现 gRPC 调用_第3页
【移动应用开发技术】记一次技术调研(一) iOS 应用实现 gRPC 调用_第4页
【移动应用开发技术】记一次技术调研(一) iOS 应用实现 gRPC 调用_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】记一次技术调研(一)iOS应用实现gRPC调用

问题

在手机应用的开发中,通常会将复杂的业务逻辑层实现放在服务端,客户端仅负责表现层。但是对于某些手机应用而言,业务逻辑的实现位于服务端反而是不安全的或是不合理的,而是需要将其逻辑直接在手机端实现。

目的

面对不同系统的手机客户端,单独重复实现相同的业务逻辑,并非最佳实践。如何通过第三方语言Go语言将业务逻辑封装成库的形式,并以静态打包的方式提供给不同系统的手机客户端使用,是本次调研的目的。

问题在手机应用的开发中,通常会将复杂的业务逻辑层实现放在服务端,客户端仅负责表现层。但是对于某些手机应用而言,业务逻辑的实现位于服务端反而是不安全的或是不合理的,而是需要将其逻辑直接在手机端实现。目的面对不同系统的手机客户端,单独重复实现相同的业务逻辑,并非最佳实践。如何通过第三方语言Go语言将业务逻辑封装成库的形式,并以静态打包的方式提供给不同系统的手机客户端使用,是本次调研的目的。理想目标图:cdn.xitu.io/2019/7/4/16bbd44a4c33a8ce?w=930&h=427&f=png&s=28182">https://user-gold-<atitle=具体调研内容包括:其中关于gRPC在iOS与Android的实现,本身官方就已经提供了样例。本次调研会用到相关内容,所以将其作为调研的一部分记录下来,方便后来者阅读。调研中所有涉及的项目代码均存放于:liujianping/grpc-apps仓库中,需要的朋友可以直接下载测试。

原文发布在我的个人站点:GitDiG.com.原文链接:iOS应用实现gRPC调用.

原文发布在我的个人站点:GitDiG.com.原文链接:iOS应用实现gRPC调用.1.环境安装作为一名非专职iOS的程序员,经常需要调研陌生的技术或者语言。首先是要克服对于未知的畏惧心理。其实很多东西没那么难,只是需要开始而已。为了完成目标调研,开始第一部分的调研工作。以文字形式记录下来,方便后来者。1.1XCode安装没什么好说的,直接AppStore下载安装。有点慢,一边下载一边准备其它环境。1.2Cocoapod安装类似与其它语言的第三方库管理工具。也没什么好说的,登录官网,按说明安装。$:sudogeminstallcocoapods1.3protoc命令安装因为gRPC的广泛使用,ProtoBuf协议被广泛用于字节编码与解码的协议,其具体指南参考[官网]()。话不多说,安装:$:curl-LOk/protocolbuffers/protobuf/releases/download/v3.5.1/protoc-3.9.0-rc-1-osx-x86_64.zip

$:unzipprotoc-3.9.0-rc-1-osx-x86_64.zip-dproto_buffer&&cdproto_buffer

$:sudocpbin/protoc/usr/local/bin

$:sudocp-Rinclude/google/protobuf//usr/local/include/google/protobuf

$:protoc--version1.4protoc插件安装protoc主要是通过解析.proto格式的文件,再根据具体插件生成相应语言代码。考虑到需要同时实现客户端与服务端的代码,所以必须安装以下三个插件:swift插件安装:$:gitclone/grpc/grpc-swift.git

$:cdgrpc-swift

$:gitcheckouttags/0.5.1

$:make

$:sudocpprotoc-gen-swiftprotoc-gen-swiftgrpc/usr/local/bingo插件安装:前提是需要安装Go语言的开发环境,可参考官网。protoc-gen-go安装详细指南.$:goget-u/golang/protobuf/protoc-gen-go2定义proto接口既然是最简单的调研,就用最简单的Hello服务。创建项目路径并定义:$:mkdirgrpc-apps

$:cdgrpc-apps

$:mkdirproto

$:cat<<EOF>proto/to

syntax="proto3";

optionjava_multiple_files=true;

optionjava_package="com.gitdig.helloworld";

optionjava_outer_classname="HelloWorldProto";

packagehelloworld;

serviceGreeter{

rpcSayHello(HelloRequest)returns(HelloReply){}

}

messageHelloRequest{

stringname=1;

}

messageHelloReply{

stringmessage=1;

}

EOF3.服务端实现在项目目录中创建服务端目录与proto生成目录,同时编写一个简单的服务端:$:cdgrpc-apps

$:mkdirgogo/clientgo/servergo/hello

#生成Go代码到go/hello文件夹

$:protoc-Iprotoproto/to--go_out=plugins=grpc:./go/hello/分别编辑Go版本client与server实现。确认服务正常运行。3.1Go服务端编辑server/server.go文件:packagemain

import(

pb"/liujianping/grpc-apps/go/helloworld"

)

import(

"context"

"fmt"

"log"

"net"

"/grpc"

)

typeHelloServerstruct{}

//SayHellosays'hi'totheuser.

func(hs*HelloServer)SayHello(ctxcontext.Context,req*pb.HelloRequest)(*pb.HelloReply,error){

//createresponse

res:=&pb.HelloReply{

Message:fmt.Sprintf("hello%sfromgo",req.Name),

}

returnres,nil

}

funcmain(){

varerrerror

//createsocketlistener

l,err:=net.Listen("tcp",":50051")

iferr!=nil{

log.Fatalf("error:%v\n",err)

}

//createserver

helloServer:=&HelloServer{}

//registerserverwithgrpc

s:=grpc.NewServer()

pb.RegisterGreeterServer(s,helloServer)

log.Println("serverservingat::50051")

//run

s.Serve(l)

}

运行服务端程序:$:cdgrpc-apps/go

$:gorunserver/server.go

2019/07/0320:31:06serverservingat::500513.2Go客户端编辑client/client.go文件:packagemain

import(

pb"/liujianping/grpc-apps/go/helloworld"

)

import(

"context"

"fmt"

"log"

"/grpc"

)

funcmain(){

varerrerror

//connecttoserver

conn,err:=grpc.Dial("localhost:50051",grpc.WithInsecure())

iferr!=nil{

log.Fatalf("error:%v\n",err)

}

deferconn.Close()

//createclient

client:=pb.NewGreeterClient(conn)

//createrequest

req:=&pb.HelloRequest{Name:"JayL"}

//callmethod

res,err:=client.SayHello(context.Background(),req)

iferr!=nil{

log.Fatalf("error:%v\n",err)

}

//handleresponse

fmt.Printf("Received:\"%s\"\n",res.Message)

}

执行客户端程序:$:cdgrpc-apps/go

$:gorunclient/client.go

Received:"helloJayLfromgo"Go客户端/服务端通信成功。4.iOS项目4.1创建一个最简单的单视图项目创建一个名为iosDemo的单视图项目,选择swift语言,存储路径放在grpc-apps下。完成创建后,正常运行,退出程序。4.2初始化项目Pod在命令行执行初始化:$:cdgrpc-apps/iosDemo

#初始化

$:podinit

$:vimPodfile编辑Podfile如下:#Uncommentthenextlinetodefineaglobalplatformforyourproject

#platform:ios,'9.0'

target'iosDemo'do

#Commentthenextlineifyoudon'twanttousedynamicframeworks

use_frameworks!

#PodsforiosDemo

pod'SwiftGRPC'

end完成编辑后保存,执行安装命令:$:podinstall安装完成后,项目目录发生以下变更:$:gitstatus

Onbranchmaster

Changesnotstagedforcommit:

(use"gitadd<file>..."toupdatewhatwillbecommitted)

(use"gitcheckout--<file>..."todiscardchangesinworkingdirectory)

modified:iosDemo.xcodeproj/project.pbxproj

Untrackedfiles:

(use"gitadd<file>..."toincludeinwhatwillbecommitted)

Podfile

Podfile.lock

Pods/

iosDemo.xcworkspace/

nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")通过命令行openiosDemo.xcworkspace打开项目,对项目中的info.list的以下设置进行修改:https://user-gold-cdn.xitu.io/2019/7/4/16bba772468d910a?w=1592&h=88&f=png&s=63771通过设置,开启非安全的HTTP访问方式。4.3生成gRPCswift代码类似Go代码生成,现在生成swift代码:$:cdgrpc-apps

#创建生成文件存放目录

$:mkdirswift

#生成swift文件

$:protoc-Iprotoproto/to\

--swift_out=./swift/\

--swiftgrpc_out=Client=true,Server=false:./swift/

#生成文件查看

$:treeswift

swift

├──hello.grpc.swift

└──hello.pb.swift4.4将生成代码集成到iOS项目XCode中添加生成代

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论