在swift中接入微信開源庫Mars


1 介紹

1.1 mars

mars是微信官方的跨平臺跨業務的終端基礎組件。 php

  • comm:能夠獨立使用的公共庫,包括 socket、線程、消息隊列、協程等;
  • xlog:高可靠性高性能的運行期日誌組件;
  • SDT: 網絡診斷組件;
  • STN: 信令分發網絡模塊,也是 Mars 最主要的部分。

1.2 protobuf

protobuf: Google's data interchange format. protobuf是google提供的一個開源序列化框架,相似於XML,JSON這樣的數據表示語言,其最大的特色是基於二進制,所以比傳統的XML表示高效短小得多。雖然是二進制數據格式,但並無所以變得複雜,開發人員經過按照必定的語法定義結構化的消息格式,而後送給命令行工具,工具將自動生成相關的類,能夠支持php、java、c++、python等語言環境。經過將這些類包含在項目中,能夠很輕鬆的調用相關方法來完成業務消息的序列化與反序列化工做。java

2 建立framework

2.1 生成framework

// 下載 mars 倉庫: 
git clone https://github.com/Tencent/mars.git
// 切換到 libraries路徑
cd mars-master/mars/libraries
// 執行python腳本
python build_apple.py
	提示輸入保存文件夾的前綴:(隨意)
	input prefix for save directory. like trunk,br,tag:
	選擇build的類型: 1表明iphone版mars(其中包括xlog)
	Enter menu:
	build mars for iphone.
複製代碼

success...

2.2 引入framework

// log_crypt.cc.rewriteme, log_crypt.h 這兩個文件已被廢棄,可直接刪除python

// 刪除.rewriteme的後綴
共三個文件log_crypt.cc.rewriteme(廢棄),longlink_packer.cc.rewriteme, shortlink_packer.cc.rewriteme
// 拖入工程,並添加庫
SystemConfiguration, CoreTelephony, Foundation, libz.tbd, libresolv9.tbd

複製代碼

2.3 xlog

/// 添加文件(demo中有)
LogHelper.h(.mm)、LogUtil.h(.mm), appender-swift-bridge.h(.mm)
/// 橋接頭文件添加
#import "appender-swift-bridge.h"

// 配置xlog, 參數分別表明:debug時記錄的級別,release時記錄的級別,保存文件的相對路徑,文件前綴
JinkeyMarsBridge().initXlogger(...)
// 自定義log
JinkeyMarsBridge().log(...)
複製代碼

在didFinishLaunchingWithOptions配置xlog 在applicationWillTerminate中destoryc++

2.4 引入protobuf

2.4.1 生成.pb.swift

// 安裝protobuf
brew install protobuf
// 安裝swift-protobuf-plugin
	git clone https://github.com/apple/swift-protobuf.git
	cd swift-protobuf
	swift build -c release -Xswiftc -static-stdlib

// 將.proto文件轉換成.swift
protoc --swift_out=. name.proto
複製代碼

寫了個shell,能夠批量將當前文件夾下的全部.proto轉換成對應的.pb.swift 地址爲install.sh,可直接雙擊使用 內容以下:git

cd $(cd `dirname $0`; pwd)

for i in find *.proto
do
    if [ $i == "find" ]; then
        continue
    fi
    protoc --swift_out=. $i
    echo "生成文件:$i.pb.swift"
done
複製代碼

2.4.2 引入.pb.swift

swift-protobuf: Plugin and runtime library for using protobuf with Swiftgithub

// pod引用
pod 'SwiftProtobuf'
// 將.pb.swift添加到工程中(不用添加.proto)
// 使用
var con = Conversation()
con.name = "ashen"
con.notice = "for test"
// 傳輸時,直接傳遞data數據
let data = try? con.serializedData()
複製代碼

2.5 添加橋接文件(可選)

因爲該framework是C++寫的,對於不會C++的人(好比我)來講, 調用是個很大的問題, 能夠經過demo中的相關文件 + swift-oc橋接頭文件直接轉換成swift能夠直接調用的類 shell

相關文件

3 xlog文件解析

3.1 安裝python依賴庫.

首先須要查看本身的python版本, decode_mars_crypt_log_file.py只在python2.+下支持,3.+不能正常運行swift

安裝依賴庫pyelliptic, 若是同時存在2.+ 和3.+ 版本,請使用pip2 pyelliptic的最新版本1.5.8,存在bug, 須要指定版本爲1.5.7bash

pip install pyelliptic==1.5.7

複製代碼

3.2 解密logger日誌

// 切換到crypt文件夾
cd mars/mars/log/crypt
// 解密logger
python2 decode_mars_crypt_log_file.py logger_20171205.xlog
// logger_20171205.xlog.log 即爲解密出的log日誌
複製代碼

fix bugs:

  • ImportError: No module named pyelliptic微信

    緣由:沒有正確安裝pyelliptic的依賴庫

    解決: pip2 install pyelliptic==1.5.7

    若是安裝後依然報錯,多是因爲安裝了多個版本的python,pyelliptic並無安裝在2.+的python下. 在MacOS上, 若是同時安裝了2.+ 和3.+的python, pip2 和pip3 分別表明安裝到2.+ 和3.+的庫中. 因此能夠經過pip2 install pyelliptic==1.5.7 安裝

  • AttributeError: dlsym(0x7fc443f02f50, EVP_CIPHER_CTX_reset): symbol not found 緣由: pyelliptic的最新版本1.5.8的bug 解決: 使用1.5.7版本

    pip uninstall pyelliptic
    pip install pyelliptic==1.5.7
    複製代碼

資源

參考: Swift 接入微信 Mars_Xlogger 填坑指南——Jinkey 原創

相關文章
相關標籤/搜索