2
0

WFCCNetworkService.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. //
  2. // WFCCNetworkService.h
  3. // WFChatClient
  4. //
  5. // Created by heavyrain on 2017/11/5.
  6. // Copyright © 2017年 WildFireChat. All rights reserved.
  7. //
  8. #ifndef WFCCNetworkService_h
  9. #define WFCCNetworkService_h
  10. #import <Foundation/Foundation.h>
  11. #import "WFCCMessage.h"
  12. #import "WFCCReadReport.h"
  13. #import "WFCCDeliveryReport.h"
  14. extern const NSString *SDKVERSION;
  15. #pragma mark - 通知定义
  16. //群组信息更新通知
  17. extern NSString *kGroupInfoUpdated;
  18. //群组成员更新通知
  19. extern NSString *kGroupMemberUpdated;
  20. //用户信息更新通知
  21. extern NSString *kUserInfoUpdated;
  22. //好友列表更新通知
  23. extern NSString *kFriendListUpdated;
  24. //好友请求信息更新通知
  25. extern NSString *kFriendRequestUpdated;
  26. //设置更新通知
  27. extern NSString *kSettingUpdated;
  28. //频道信息更新通知
  29. extern NSString *kChannelInfoUpdated;
  30. //用户在线状态更新通知
  31. extern NSString *kUserOnlineStateUpdated;
  32. //密聊状态更新通知
  33. extern NSString *kSecretChatStateUpdated;
  34. //密聊消息阅后即焚开始计时
  35. extern NSString *kSecretMessageStartBurning;
  36. //密聊消息阅后即焚完成
  37. extern NSString *kSecretMessageBurned;
  38. //域信息更新通知
  39. extern NSString *kDomainInfoUpdated;
  40. #pragma mark - 枚举值定义
  41. /**
  42. 连接状态
  43. - kConnectionStatusTimeInconsistent 服务器和客户端时间相差太大
  44. - kConnectionStatusNotLicensed 专业版IM服务没有授权或者授权过期,社区版不会有此状态
  45. - kConnectionStatusKickedoff 多端登录被迫下线。
  46. - kConnectionStatusSecretKeyMismatch 密钥错误
  47. - kConnectionStatusTokenIncorrect Token错误
  48. - kConnectionStatusServerDown 服务器关闭
  49. - kConnectionStatusRejected: 被拒绝
  50. - kConnectionStatusLogout: 退出登录
  51. - kConnectionStatusUnconnected: 未连接
  52. - kConnectionStatusConnecting: 连接中
  53. - kConnectionStatusConnected: 已连接
  54. - kConnectionStatusReceiving: 正在与服务同步数据中
  55. */
  56. typedef NS_ENUM(NSInteger, ConnectionStatus) {
  57. kConnectionStatusTimeInconsistent = -9,
  58. kConnectionStatusNotLicensed = -8,
  59. //错误码kConnectionStatusKickedoff是IM服务2021.9.15之后的版本才支持,并且打开服务器端开关server.client_support_kickoff_event
  60. kConnectionStatusKickedoff = -7,
  61. kConnectionStatusSecretKeyMismatch = -6,
  62. kConnectionStatusTokenIncorrect = -5,
  63. kConnectionStatusServerDown = -4,
  64. kConnectionStatusRejected = -3,
  65. kConnectionStatusLogout = -2,
  66. kConnectionStatusUnconnected = -1,
  67. kConnectionStatusConnecting = 0,
  68. kConnectionStatusConnected = 1,
  69. kConnectionStatusReceiving = 2
  70. };
  71. /**
  72. 在双网环境中,获取当前连接的网络类型。仅当长连接建立时是准确的。如果长连接未建立,此值为上一次长连接建立时的值
  73. - kConnectedNetworkType_Main 连接到主网络
  74. - kConnectedNetworkType_Backup 连接到备网络
  75. - kConnectedNetworkType_Unknown 未知
  76. */
  77. typedef NS_ENUM(NSInteger, ConnectedNetworkType) {
  78. kConnectedNetworkType_Main = 1,
  79. kConnectedNetworkType_Unknown = 0,
  80. kConnectedNetworkType_Backup = -1,
  81. };
  82. /**
  83. 平台枚举值
  84. //Platform_Android = 2,
  85. //Platform_Windows = 3,
  86. //Platform_OSX = 4,
  87. //Platform_WEB = 5,
  88. //Platform_WX = 6,
  89. //Platform_Linux = 7,
  90. //Platform_iPad = 8,
  91. //Platform_APad = 9,
  92. */
  93. #define Platform_iOS 1
  94. #define Platform_iPad 8
  95. #pragma mark - 连接状态&消息监听
  96. /**
  97. 连接状态的监听
  98. */
  99. @protocol ConnectionStatusDelegate <NSObject>
  100. /**
  101. 连接状态变化的回调
  102. @param status 连接状态
  103. */
  104. - (void)onConnectionStatusChanged:(ConnectionStatus)status;
  105. @end
  106. /**
  107. 连接状态的监听
  108. */
  109. @protocol ConnectToServerDelegate <NSObject>
  110. /**
  111. 开始连接到服务器的回调
  112. @param host 服务Host
  113. @param ip 服务ip
  114. @param port 服务端口
  115. */
  116. - (void)onConnectToServer:(NSString *)host ip:(NSString *)ip port:(int)port;
  117. /**
  118. 成功连接到服务器的回调
  119. @param host 服务Host
  120. @param ip 服务ip
  121. @param port 服务端口
  122. @param mainNw 是否是主网
  123. */
  124. - (void)onConnected:(NSString *)host ip:(NSString *)ip port:(int)port mainNw:(BOOL)mainNw;
  125. @end
  126. /**
  127. 网络流量使用监听
  128. */
  129. @protocol TrafficDataDelegate <NSObject>
  130. /**
  131. 网络产生流量的回调
  132. @param send 发送的字节数
  133. @param recv 收到的字节数
  134. */
  135. - (void)onTrafficData:(int64_t)send recv:(int64_t)recv;
  136. @end
  137. /**
  138. 消息接收的监听
  139. */
  140. @protocol ReceiveMessageDelegate <NSObject>
  141. /**
  142. 接收消息的回调
  143. @param messages 收到的消息
  144. @param hasMore 是否还有待接受的消息,UI可以根据此参数决定刷新的时机
  145. */
  146. - (void)onReceiveMessage:(NSArray<WFCCMessage *> *)messages hasMore:(BOOL)hasMore;
  147. @optional
  148. - (void)onRecallMessage:(long long)messageUid;
  149. - (void)onDeleteMessage:(long long)messageUid;
  150. /**
  151. 消息已送达到目标用户的回调
  152. @param delivereds 送达报告
  153. */
  154. - (void)onMessageDelivered:(NSArray<WFCCDeliveryReport *> *)delivereds;
  155. /**
  156. 消息已读的监听
  157. */
  158. - (void)onMessageReaded:(NSArray<WFCCReadReport *> *)readeds;
  159. @end
  160. /**
  161. 接收消息前的拦截Filter
  162. */
  163. @protocol ReceiveMessageFilter <NSObject>
  164. /**
  165. 是否拦截收到的消息
  166. @param message 消息
  167. @return 是否拦截,如果拦截该消息,则ReceiveMessageDelegate回调不会再收到此消息
  168. */
  169. - (BOOL)onReceiveMessage:(WFCCMessage *)message;
  170. @end
  171. /**
  172. 会议事件的监听
  173. */
  174. @protocol ConferenceEventDelegate <NSObject>
  175. /**
  176. 会议事件的回调
  177. @param event 事件
  178. */
  179. - (void)onConferenceEvent:(NSString *)event;
  180. @end
  181. @class WFCCUserOnlineState;
  182. /**
  183. 在线事件的监听
  184. */
  185. @protocol OnlineEventDelegate <NSObject>
  186. /**
  187. 在线事件的回调
  188. @param events 事件
  189. */
  190. - (void)onOnlineEvent:(NSArray<WFCCUserOnlineState *> *)events;
  191. @end
  192. @class WFCCUserInfo;
  193. @class WFCCGroupInfo;
  194. /**
  195. 默认头像提供者
  196. */
  197. @protocol WFCCDefaultPortraitProvider <NSObject>
  198. /**
  199. 获取用户的默认头像链接
  200. @param userInfo 用户信息
  201. @return 返回此用户的默认头像
  202. */
  203. - (NSString *)userDefaultPortrait:(WFCCUserInfo *)userInfo;
  204. /**
  205. 获取群组的默认头像链接
  206. @param groupInfo 群组信息
  207. @param memberInfos 群成员用户信息,只用前9名,可以只传入9名成员
  208. @return 返回此用户的默认头像
  209. */
  210. - (NSString *)groupDefaultPortrait:(WFCCGroupInfo *)groupInfo memberInfos:(NSArray<WFCCUserInfo *> *)memberInfos;
  211. @end
  212. #pragma mark - 连接服务
  213. /**
  214. 连接服务
  215. */
  216. @interface WFCCNetworkService : NSObject
  217. /**
  218. 连接服务单例
  219. @return 连接服务单例
  220. */
  221. + (WFCCNetworkService *)sharedInstance;
  222. /**
  223. 连接状态监听
  224. */
  225. @property(nonatomic, weak) id<ConnectionStatusDelegate> connectionStatusDelegate;
  226. /**
  227. 连接到服务监听
  228. */
  229. @property(nonatomic, weak) id<ConnectToServerDelegate> connectToServerDelegate;
  230. /**
  231. 网络流量监听
  232. */
  233. @property(nonatomic, weak) id<TrafficDataDelegate> trafficDataDelegate;
  234. /**
  235. 消息接收监听
  236. */
  237. @property(nonatomic, weak) id<ReceiveMessageDelegate> receiveMessageDelegate;
  238. /**
  239. 会议事件监听
  240. */
  241. @property(nonatomic, weak) id<ConferenceEventDelegate> conferenceEventDelegate;
  242. /**
  243. 在线事件监听
  244. */
  245. @property(nonatomic, weak) id<OnlineEventDelegate> onlineEventDelegate;
  246. /**
  247. 默认头像提供者
  248. */
  249. @property(nonatomic, weak)id<WFCCDefaultPortraitProvider> defaultPortraitProvider;
  250. /**
  251. 当前是否处于登录状态
  252. */
  253. @property(nonatomic, assign, getter=isLogined, readonly)BOOL logined;
  254. /**
  255. 当前的连接状态
  256. */
  257. @property(nonatomic, assign, readonly)ConnectionStatus currentConnectionStatus;
  258. /**
  259. 当前登录的用户ID
  260. */
  261. @property (nonatomic, strong, readonly)NSString *userId;
  262. /**
  263. 服务器时间与本地时间的差值
  264. */
  265. @property(nonatomic, assign, readonly)long long serverDeltaTime;
  266. /**
  267. 当前服务是否连接到了主网络
  268. */
  269. @property (nonatomic, assign, readonly)BOOL connectedToMainNetwork;
  270. /**
  271. 发送日志命令
  272. */
  273. @property (nonatomic, strong)NSString *sendLogCommand;
  274. /**
  275. 开启Log
  276. */
  277. + (void)startLog;
  278. /**
  279. 停止Log
  280. */
  281. + (void)stopLog;
  282. /**
  283. 获取日志文件路径
  284. */
  285. + (NSArray<NSString *> *)getLogFilesPath;
  286. /*
  287. 使用国密加密。注意必须和服务器同时配置,否则无法连接。
  288. */
  289. - (void)useSM4;
  290. /*
  291. 使用AES256加密。注意必须和服务器同时配置,否则无法连接。
  292. */
  293. - (void)useAES256;
  294. /*
  295. 使用TCP的短连接。需要专业版IM服务支持。
  296. */
  297. - (void)useTcpShortLink;
  298. /*
  299. 是否使用TCP的短连接。需要专业版IM服务支持。
  300. */
  301. - (BOOL)isTcpShortLink;
  302. /*
  303. 不使用FTS搜索。仅在connect之前调用有效。
  304. */
  305. - (void)noUseFts;
  306. /**
  307. 设置Lite模式。
  308. Lite模式下,协议栈不存储数据库,不同步所有信息,只能收发消息,接收消息只接收连接以后发送的消息。
  309. 此函数只能在connect之前调用。
  310. @param isLiteMode 是否Lite模式
  311. */
  312. - (void)setLiteMode:(BOOL)isLiteMode;
  313. /**
  314. 获取客户端id
  315. @return 客户端ID
  316. */
  317. - (NSString *)getClientId;
  318. /**
  319. 连接服务器,需要注意token跟clientId是强依赖的,一定要调用getClientId获取到clientId,然后用这个clientId获取token,这样connect才能成功,如果随便使用一个clientId获取到的token将无法链接成功。另外不能多次connect,如果需要切换用户请先disconnect,然后3秒钟之后再connect(如果是用户手动登录可以不用等,因为用户操作很难3秒完成,如果程序自动切换请等3秒)
  320. @param userId 用户Id
  321. @param token 密码
  322. @return 返回上一次活动时间。如果间隔时间较长,可以加个第一次登录的等待提示界面,在等待时同步所有的用户信息/群组信息/频道信息等。
  323. */
  324. - (int64_t)connect:(NSString *)userId token:(NSString *)token;
  325. /**
  326. 断开连接
  327. @param disablePush 是否停止推送,clearSession为YES时无意义。如果为true,session会变成disable状态,token会失效,必须重新获取token才能登录。
  328. @param clearSession 是否清除Session信息,如果清除本地历史消息将全部清除,且token失效无法再次登录,必须重新获取token才能进行登录。
  329. */
  330. - (void)disconnect:(BOOL)disablePush clearSession:(BOOL)clearSession;
  331. /**
  332. 设置服务器地址信息。host可以是IP,可以是域名。如果IM服务是专业版IM服务,需要设置为IM服务绑定的地址。
  333. @param host 服务器地址
  334. */
  335. - (void)setServerAddress:(NSString *)host;
  336. /**
  337. 设置当前设备的device token
  338. @param token 苹果APNs Device Token
  339. */
  340. - (void)setDeviceToken:(NSString *)token;
  341. /**
  342. 设置当前设备的device token,可以指定推送类型,用来对接个推、极光等第三方推送。
  343. @param token 苹果APNs Device Token
  344. @param pushType 推送类型
  345. */
  346. - (void)setDeviceToken:(NSString *)token pushType:(int)pushType;
  347. /**
  348. 设置当前设备的Voip device token
  349. @param token 苹果APNs Device Token
  350. */
  351. - (void)setVoipDeviceToken:(NSString *)token;
  352. /**
  353. 添加消息拦截Filter
  354. @param filter 消息拦截Filter
  355. */
  356. - (void)addReceiveMessageFilter:(id<ReceiveMessageFilter>)filter;
  357. /**
  358. 移除消息拦截Filter
  359. @param filter 消息拦截Filter
  360. */
  361. - (void)removeReceiveMessageFilter:(id<ReceiveMessageFilter>)filter;
  362. /**
  363. 应用已经login且在后台的情况下,强制进行连接,确保后台连接5秒钟,用于voip推送后台刷新等场景。
  364. 应用在前台情况下,此方法无效。
  365. */
  366. - (void)forceConnect:(NSUInteger)second;
  367. - (void)cancelForceConnect;
  368. /*
  369. 设置备选服务地址,仅专业版支持,一般用于政企单位内外网两种网络环境。请参考:https://docs.wildfirechat.cn/blogs/政企内外双网解决方案.html
  370. */
  371. - (void)setBackupAddressStrategy:(int)strategy;
  372. - (void)setBackupAddress:(NSString *)host port:(int)port;
  373. - (ConnectedNetworkType)getConnectedNetworkType;
  374. /*
  375. 设置协议栈短连接User agent。
  376. @param userAgent User agent
  377. */
  378. - (void)setProtoUserAgent:(NSString *)userAgent;
  379. /*
  380. 添加协议栈短连接自定义header,value为空时清除该header。
  381. @param header header
  382. @param value value
  383. */
  384. - (void)addHttpHeader:(NSString *)header value:(NSString *)value;
  385. /*
  386. 设置代理,注意只能支持socks5代理,http代理无法支持,只有专业版支持次功能。
  387. @param host 代理服务域名,host和ip至少要有一个有效值。
  388. @param ip 代理服务IP地址,host和ip至少要有一个有效值。
  389. @param port 代理服务端口
  390. @param username 账户
  391. @param password 密码
  392. */
  393. - (void)setProxyInfo:(NSString *)host ip:(NSString *)ip port:(int)port username:(NSString *)username password:(NSString *)password;
  394. /**
  395. 获取协议栈版本
  396. */
  397. - (NSString *)getProtoRevision;
  398. @end
  399. #endif