github源碼地址為https://github.com/Tencent/mars#mars_cn
使用前準(zhǔn)備
將源碼下載到本地健盒,編譯位于源碼文件夾下的/mars/libraries/build_apple.py
python build_apple.py
編譯成功得到
把 mars.framework 作為依賴加入到項(xiàng)目中锄禽,把和 mars.framework 同目錄的后綴名為 rewriteme 的文件名刪掉".rewriteme"和頭文件一起加入到項(xiàng)目中,另外工程還需要導(dǎo)入的文件有:
在Mars源碼文件夾下iOSDemo工程里還有需要導(dǎo)入的文件蝶溶,包括:
使用
xlog組件
xlog組件為日志記錄組件臼勉,使用時(shí)需要在main函數(shù)里初始化:
NSString* logPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:@"/log"];
// set do not backup for logpath
const char* attrName = "com.apple.MobileBackup";
u_int8_t attrValue = 1;
setxattr([logPath UTF8String], attrName, &attrValue, sizeof(attrValue), 0, 0);
// init xlog
#if DEBUG
xlogger_SetLevel(kLevelDebug);
appender_set_console_log(true);
#else
xlogger_SetLevel(kLevelInfo);
appender_set_console_log(false);
#endif
appender_open(kAppednerAsync, [logPath UTF8String], "Test");
在 applicationWillTerminate 函數(shù)中反初始化:
appender_close();
需要注意:
- 保存 log 的目錄請(qǐng)使用單獨(dú)的目錄剪况,不要存放任何其他文件防止被 xlog 自動(dòng)清理功能誤刪烘苹。
- 請(qǐng)把 log 目錄設(shè)上不備份的標(biāo)識(shí)就乓。
- debug 版本下建議把控制臺(tái)日志打開(kāi)泉懦,日志級(jí)別設(shè)為 Debug, release 版本建議把控制臺(tái)日志關(guān)閉稿黍,日志級(jí)別使用 Info.
stn組件
在 didFinishLaunchingWithOptions 函數(shù)中或者使用網(wǎng)絡(luò)之前進(jìn)行初始化:
[NetworkService sharedInstance].delegate = [[NetworkEvent alloc] init];
[[NetworkService sharedInstance] setCallBack];
[[NetworkService sharedInstance] createMars];
[[NetworkService sharedInstance] setClientVersion:200];
[[NetworkService sharedInstance] setLongLinkAddress:@"www.marsopen.cn" port:8081];
[[NetworkService sharedInstance] setShortLinkPort:8080];
[[NetworkService sharedInstance] reportEvent_OnForeground:YES];
[[NetworkService sharedInstance] makesureLongLinkConnect];
[[NetworkStatus sharedInstance] Start:[NetworkService sharedInstance]];
在程序退出時(shí)或需要釋放 stn 時(shí)調(diào)用:
[[NetworkService sharedInstance] destroyMars];
當(dāng)發(fā)生前后臺(tái)切換時(shí)調(diào)用:
[[NetworkService sharedInstance] reportEvent_OnForeground:NO];
[[NetworkService sharedInstance] reportEvent_OnForeground:YES];
程序進(jìn)入后臺(tái)時(shí)選擇NO,程序?qū)⒁氐角芭_(tái)時(shí)選擇YES崩哩。
消息發(fā)送
發(fā)送消息需要具體controller遵循代理UINotifyDelegate
:
-(NSData*)requestSendData
該函數(shù)為將要發(fā)送的數(shù)據(jù)打包巡球,demo中使用的數(shù)據(jù)格式為ProtocolBuffer,我們可以使用json數(shù)據(jù)格式邓嘹。
-(int)onPostDecode:(NSData*)responseData
該函數(shù)為發(fā)送消息后接收到的服務(wù)器返回的消息數(shù)據(jù)解包酣栈。
-(int)onTaskEnd:(uint32_t)tid errType:(uint32_t)errtype errCode:(uint32_t)errcode
該函數(shù)為請(qǐng)求任務(wù)結(jié)束的回調(diào),用于捕捉處理錯(cuò)誤信息汹押。
消息接收
接收消息需要具體controller遵循代理PushNotifyDelegate
:
-(void)notifyPushMessage:(NSData*)pushData withCmdId:(int)cmdId
該函數(shù)為接收消息回調(diào)矿筝,解包數(shù)據(jù)后更新UI。
與服務(wù)端配合
首先來(lái)看官方的兩個(gè)問(wèn)題和答案:
如果我已經(jīng)有現(xiàn)有服務(wù)器端了棚贾,客戶端想使用 Mars窖维,需要服務(wù)器做什么工作?
如果你已經(jīng)深入了解了 Mars妙痹,感覺(jué)自己適合使用 Mars的铸史,需要先理解長(zhǎng)短連協(xié)議和加解包的區(qū)別。不論之前使用的哪種方式怯伊,長(zhǎng)短連的協(xié)議是必須有的琳轿,你需要參照自定義擴(kuò)展把長(zhǎng)短連協(xié)議和服務(wù)器端對(duì)齊, 至于加解包邏輯是在 Req2Buf 和 Buf2Resp 回調(diào)中做的耿芹,給上實(shí)現(xiàn)就可以了崭篡。關(guān)于長(zhǎng)短連協(xié)議的理解和 req2Buf buf2Resp 的理解可以看一個(gè)例子:就像你用 HTTP 發(fā)一個(gè) json 數(shù)據(jù) HTTP 就類似 Mars 的長(zhǎng)短連協(xié)議, json 的組裝和解析就是 req2Buf 和 buf2Resp 來(lái)做的
如果我已經(jīng)有現(xiàn)有服務(wù)器端了吧秕,客戶端想使用 Mars琉闪,客戶端需要注意什么?
longlink_packer.cc中的自定義需要注意寇甸。心跳包的cmdid一定要和服務(wù)器的對(duì)應(yīng)上塘偎,否則可能發(fā)生心跳包超時(shí)導(dǎo)致長(zhǎng)連斷開(kāi)。longlink_complexconnect_need_verify的含義是如果設(shè)為 true 經(jīng)過(guò)心跳包驗(yàn)證的連接才認(rèn)為是成功的連接拿霉。如果你的長(zhǎng)連接建立連接后第一個(gè)包必須是驗(yàn)證包吟秩,該函數(shù)的返回值一定要設(shè)為false。 長(zhǎng)連的鑒權(quán)是會(huì)回調(diào)GetLonglinkIdentifyCheckBuffer這個(gè)函數(shù)绽淘,實(shí)現(xiàn)即可涵防,記得處理回包:OnLonglinkIdentifyResponse,需要區(qū)分開(kāi)長(zhǎng)連接的鑒權(quán)和用戶的登陸。長(zhǎng)連的鑒權(quán)只是用來(lái)表示這個(gè)長(zhǎng)連接是某個(gè)人的,不要用來(lái)做登陸功能壮池。 強(qiáng)調(diào):需要注意偏瓤,mars長(zhǎng)連的請(qǐng)求包和回包的對(duì)應(yīng)關(guān)系的條件是seq一樣,所以服務(wù)器對(duì)請(qǐng)求的回應(yīng)要保證seq一樣椰憋,或者可以自己在longlink_taskmanger.cc里修改(不推薦)厅克。
因此與服務(wù)端配合需要對(duì)齊長(zhǎng)短連協(xié)議以及數(shù)據(jù)的加解包格式,后者在UINotifyDelegate橙依、PushNotifyDelegate
的回調(diào)中實(shí)現(xiàn)证舟,而長(zhǎng)短連協(xié)議的自定義在以下幾個(gè)函數(shù)中實(shí)現(xiàn):
void longlink_pack(uint32_t _cmdid, uint32_t _seq, const void* _raw, size_t _raw_len, AutoBuffer& _packed);
int longlink_unpack(const AutoBuffer& _packed, uint32_t& _cmdid, uint32_t& _seq, size_t& _package_len, AutoBuffer& _body);
void shortlink_pack(const std::string& _url, const std::map<std::string, std::string>& _headers, const AutoBuffer& _body, AutoBuffer& _out_buff);