解决protobuf不能直接在IOS上使用,利用protobuf-net在IOS上通讯

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

早前在公司突然要把项目移植到IOS上,但是protobuf却出现了不能使用的情况,后来在网上找到了解决方案,感谢那位大神。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

原文连接地址:http://game.ceeger.com/forum/read.php?tid=14359&fid=27&page=1

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

  以下是笔者自己的使用记录,为了方便自己以后使用时再次查看,看不懂的笔者粗语的可以到原文中查看,不喜勿喷-----------~~~-------------~~!!!

首先是下载protobuf-net,当然我当时使用的也是r668版本,有没有什么新的我也没有去查。好了不废话,现在开始进入正题。

第一、

  下载protobuf-net,解压到你想要的目录,按照原文中的意思要把两个Precompile\precompile.exe 以及 ProtoGen\protogen.exe 两个文件加入到环境变量中 , 之后方便使用。笔者第一次使用的时候设置了环境变量但是不知道为什么不管用,后来笔者将他写成了bat文件,只改文件名字和路径解决了一切。

cd C:\Users\Administrator\Desktop\Moblie\protobuf-net\ProtoGen
protogen -i:backstageMessagecontract.proto -o:BackstageMessagecontract.cs -ns:com.czkj.jsys

  这就是笔者写的很挫的bat文件,为了加深记忆,笔者决定再写一次,一切为了伟大程序员使命。

  经过笔者的再次尝试这次设置环境变量成功了,看来笔者以前肯定犯了什么错误。

  这给不懂设置的人看的:http://wenku.baidu.com/link?url=y_hM5UZgCbs4uWPlIq7UPCT4QrwI5QahTo2tPmJRd6jgoQ5NqX6eGiswPnDbR4zhfGFbr3w9RBAhxyGO2DRdtEDtq_GEedPwQ28be5Bixvi

  

  贴上成功的图片。

第二、proto文件书写规则

message MessageContract {
required string contractId = 1;
optional bytes body = 2;
required int64 date = 3;
}

message ReconnectionContract{
optional string sessonid= 1;
}

message ReconnectionResultContract{
required int32 result = 1;
}

message LoginContract{
required int32 versionCode = 1;
required string versionName = 2;
optional string userName = 3;
optional string password = 4;
optional string touristCode = 5;
optional string openId = 6;
optional string TXWMId = 7;
optional string ip= 8;
}

message LoginResultContract{
required int32 result = 1;
optional string sessonid= 2;
optional string userName = 3;
}

  这里解释一下我这个proto的实际用法,MessageContract 其实是作为一个消息总体,他把发送的消息打包到自己的body上,然后自身有一个连接类型辨别contractId ,至于data则是笔者用来记录某项东西用的,具体你们可以自己斟酌要不要。

这里举个栗子(希望大家喜欢)

  比如说像笔者这样子的要做一个登录的连接,可以看到我们有LoginContract和LoginResultContract两个消息体(笔者是个菜鸟,不知道这样叫是否正确)。正如字面上的意思,一个是用来发送登录消息的一个是用来接收登录消息的。可能有的人又会问了,你说的这些我都知道,可是具体怎么用呢。

这里再举个栗子,结合我这个测试的项目

  在我们完成整个打包之后(具体的可以看完下面的再倒回来看)。

  我们生成文件之后,就可以使用我们刚刚的消息体了。废话不多说上图!

  这里我们把这个消息对象实例化,然后给这个消息体赋值,再转化为byte[],再以同样的方式赋值到总消息体上,最后发送出去,具体怎么转化,下面讲到的时候在细说。对了,这里可能有的人会问,为什么你写的是LoginContract出来的却不一样,这里的原因是在你打包的时候,他会把你的消息类重命名成这种类型,也就是说你后面写的消息体也是会按这种结构类型出来(不知道笔者理解有没有错或者写错什么,欢迎指出,感谢万分)。

第三、生成cs文件

  使用protogen 命令行来生成代码 (precompile以及protogen都只能在windows下运行,在mac上可能可以通过mono来运行这个exe,但是没有试过,笔者也还没试过。)

原文的使用例子:

protogen -i:Test1.proto -i:Test2.proto -i:Test3.proto -o:Output.cs -ns:com.fbmly.model

-i 是输入文件,可以有多个

-o 输出的cs文件, 只能有一个..如果-i有多个 会将所有的代码生成到这一个cs文件当中

-ns 命名空间   最好使用,如果不使用每次生成的默认命名空间是proto的文件名。 

通常来说 只要把所有的数据结构生成到一个cs就行了(要不然使用多个-i , 要不就把所有protobuf定义写在一个proto文件中),这样之后之后操作比较方便一些。

cd C:\Users\Administrator\Desktop\Moblie\protobuf-net\ProtoGen
protogen -i:backstageMessagecontract.proto -o:BackstageMessagecontract.cs -ns:com.czkj.jsys

  这是笔者写的一个bat文件内容,在你的目录里面生成cs文件,笔者这里把文件都丢那里去了,大家可根据喜好自己修改文件路径。后面的-ns是命名空间,请自行定义。

第四、编译dll库(可以直接查看原文)

使用MonoDevelop工具 将上一步生成的cs文件编译成dll库.

1.创建一个新的工程 (File->New->Solution)

2.在弹出的对话框中选择 C# 再选择 Library.

3.在下方填写好工程的名字 (这个名字是生成dll的名字,所以要起好,笔者的是BackstageMessagecontract)

4.点击forward (之后还要点一次ok)

5.删掉默认生成的MyClass.cs文件,有必要的话在AssemblyInfo.cs里填写一些版权信息。

6.将上一步用protogen生成的cs文件 加入到工程 (在左边工程名 上右键 就可以添加)

7.添加protobuf-net引用库

   点击工程的References->Edit References

   然后选择刚才的CoreOnly\ios下的dll库 , 双击库文件就可以加到右边(这里值得一提的是里面包含有不同的平台选择)

 

 (经过笔者的验证,要在安卓上使用的话可以选择mono)

   最后检查下References里面如果有protobuf-net.dll就正确了。

 

 

 

 

8.都做好后, 点击Build->Build All就可以在当前工程生成dll了(dll的路径在你的项目的Debug或者Release文件夹里面)

   不要忘记 debug 和 release的选择 ,测试完后应该重新拿release再编译一次的。

  

第五、预编译序列化库

   上一步生成了数据的dll文件,这一步需要用到上一步的dll文件来生成专门序列化的dll文件。

   ( 上一步生成的dll文件目录,会自动把protobuf-net库文件也复制过来 , 所以只需要记住这一点就行了。 比如你要是复制到其他目录进行操作, 这点会很重要 )

D:
cd D:\Documents\Projects\BackstageMessagecontract\BackstageMessagecontract\bin\Release
C:\Users\Administrator\Desktop\Moblie\protobuf-net\Precompile\Precompile BackstageMessagecontract.dll -o:ProtobufSerialize.dll -t:com.czkj.ProtobufSerializer

  这是笔者的bat在对应路径里面生成我们想要的dll文件。当运行完之后你会发现三个dll都在一起了,然后把他们一起丢进到项目里面去吧。

  笔者使用的是Unity,经过测试之后在Unity编译器中Xcode中和真机上都通过了运行。

最后、代码测试

1.如何序列化数据

  这里消息进行了两次打包,最后才进行消息发送,至于怎么发送什么的都是大神提供的现成的接口,有机会的话再写上一帖,让自己也学习学习。

2.如何反序列化

  笔者这里是使用了大神提供的消息机制,进行消息回调。当服务器返回消息的时候会执行这里的abc,然后反序列化结果,赋值给我们的消息类,然后我们就可以看到登录结果啦。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------笔者第一次写博客,感觉写得真心累呀,程序员真是一个不简单的生物---------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------

时间: 2024-08-25 12:17:28

解决protobuf不能直接在IOS上使用,利用protobuf-net在IOS上通讯的相关文章

iOS 12.3开发者版更新,iOS上划关闭动画回来了

4月23号凌晨,苹果向开发人员推送了iOS 12.3 Developer beta 3,在高通和苹果和解后,iOS 12.3 Developer beta 3 国行版本清除后台的上滑动画效果终于回归,正式版系统应该也会很快更新. ???? 此次开发者版本大小为384.3MB,尽管更新日志上描述只是常规的Bug修复和改进,但是有国内用户发现,后台清除动画由缩放重新改回上滑. 去年12月,高通向福州市福州市中级人民法院发布初步禁令,要求苹果在"在中国禁售部分iPhone手机",原因是苹果侵

史上最全最完整的IOS 游戏开发 PDF电子书定制下载

<iOS 5游戏开发>作者:(新西兰)James·Sugrue著 页数:191 出版社:北京市:人民邮电出版社 出版日期:2012.08 简介:<iOS5游戏开发>是一本iOS5游戏开发的基础入门书.全书使用通俗易懂的简单实例,带领读者经历构建经典动作游戏的整个周期.读者在本书的阅读过程中,将经历从开发概念.规划设计一直到编写实际代码的全过过程.本书的每一章,都将演示游戏创建过程中的一个逻辑步骤,读者将在其中学习如何创建Sprite,用触摸屏.重力感应器和屏幕游戏棒控制玩家角色等-

ios APP 在 waiting for review时重新上传程序

点击details进入后在link点击binary details,进入之后点击右上角reject this binary,然后就可以重新上传了.ios APP 在 waiting for review时重新上传程序

在MAC上搭建cordova3.4.0的IOS和android开发环境

Hello,大家好,今天给大家说说在mac上搭建cordova3.4.0的iOS和Android开发环境,首先下载cordova,地址:https://cordova.apache.org/#download 下载成功后解压,首先讲一下IOS的: 首先要保证你的Python是可以使用的,且版本正确,没有问题, 然后将cordova-ios拷贝到home路径下,假如我的用户名为karl,我要将项目创建在桌面上,文件夹名为Hi,项目名为Hi,此时调出终端,运行命令: [plain] view pla

iOS基础——通过案例学知识之UITableView(上)

iOS基础--通过案例学知识之UITableView(上) 对于UITableView的知识点特别多,因为它是iOS用得最多控件之一,我会尽我最大努力和语言的组织,将所有知识点介绍到位,今天要实现的效果图 吐槽 与Android对比,可以说跟ListView的实现几乎一样,跟RecyclerView一模一样 Android写起来似乎比iOS复杂一点,因为iOS大部分都被封装好了,这一点iOS做得好 对于iOS的方法的命名只能说又长又臭 知识点包括 UITableView的UITableViewD

关于优酷视频上传失败或暂停之后一直处于上传中或者处理中删除不掉的解决方法

我试了优酷上传的这一块做的很不好,不论是网页还是客户端都有问题,有时候经常出现优酷视频上传失败或暂停之后一直处于上传中或者处理中删除不掉的情况,因为那个视频前面的复选框是disabled的.解决方法就是在网页中右击,然后点击查看元素(我用的是火狐浏览器不同的浏览器有可能是不一样的,有的显示的是"审查元素")之后就把相应的灰色复选框的那个disabled改成abled,然后就可以直接删除了,删除之后刷新就可以看见成功了. (这个想法也来自于之前我同学陈鹏上传不了教务管理系统照片的情况)

iOS开发者必备:自己总结的iOS、mac开源项目及库

UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看“使用方法”. (国人写) XHRefreshControl - XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHou

java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C# 和 java的通信.以及完整的实例代码 java 代码 svn 地址,本人开发工具是NetBeans 8.0.2 使用 maven 项目编译 http://code.taobao.org/svn/flynetwork_csharp/trunk/BlogTest c# 代码 svn 地址 使用的是

iOS 系统架构及常用框架(iOS的系统架构分为四个层次)

1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer).媒体层(Media layer).核心服务层(Core Services layer).核心操作系统层(Core OS layer)如图: (1)触摸层:为应用程序开发提供了各种常用的框架并且大部分框架与界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作.它包括以下这些组件: Multi-Touch Events

ios开发:如何用js调用ios

本文转载至 :http://blog.chinaunix.net/uid-29415710-id-4058564.html - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL * url = [request URL]; if ([[url sche