由于項(xiàng)目要求客戶端app和服務(wù)器端建立socket長連接,用于接收服務(wù)器端推送的消息。由于服務(wù)器端已經(jīng)使用了Socket.iO庫,所以我在iOS就選擇了Socket.IO-Client-Swift的框架。其他框架已經(jīng)很久沒有維護(hù)所以放棄。在導(dǎo)入和使用過程中遇到了一些問題慢睡。1、oc項(xiàng)目引用Swift的框架Socket.IO-Client-Swift ; 2铡溪、連接過程的設(shè)置和參數(shù)傳遞一睁。
第一步導(dǎo)入Socket.iO的sdk : Socket.IO-Client-Swift
Socket.IO-Client-Swift的Github地址: https://github.com/socketio/socket.io-client-swift
使用cocapods 導(dǎo)入 最新版的sdk
platform :ios, '8.5'
use_frameworks!
target '項(xiàng)目名稱' do
pod 'Socket.IO-Client-Swift', '~> 15.1.0'
end
問題1:由于Socket.IO-Client-Swift 是swift框架所以在oc項(xiàng)目中需要?jiǎng)?chuàng)建橋接文件
解決方案:
1、創(chuàng)建一個(gè)swift文件佃却,并選擇創(chuàng)建橋接文件者吁;
2、在橋接文件中 導(dǎo)入框架 “@import SocketIO;”
3饲帅、在oc 文件中引用橋接文件复凳;
/*導(dǎo)入橋接文件*/
#import "yiren-Bridging-Header.h"
@interface NewSocket : NSObject
@property (strong, nonatomic) SocketIOClient* socket;
@property (strong, nonatomic) SocketManager* manager;
-(void)contect;
@end
第二步 Socket.iO 的使用
1瘤泪、連接
NSString*usetoken = [userDefaults objectForKey:@"userToken"];
/*連接地址*/
NSString*urlStr = [NSString stringWithFormat:@"http://xxx.xxx.com:83"];
NSURL* url = [[NSURL alloc] initWithString:urlStr];
/*傳遞的參數(shù)*/
NSDictionary*dic = [NSDictionary dictionaryWithObject:usetoken forKey:@"token"];
_manager = [[SocketManager alloc] initWithSocketURL:url config:@{@"log": @NO, @"forcePolling": @NO,@"secure":@NO,@"connectParams":dic}];
_socket = _manager.defaultSocket;
/*連接服務(wù)器成功*/
[_socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"連接成功");
}];
[_socket connect];
注意連接服務(wù)器時(shí) config 中的dic 并不是隨意傳的需要使用指定的key值 如果需要連接時(shí)傳遞參數(shù)則需要使用 ConnectParams作物key值。下面是一些key值和作用育八。
case ConnectParams([String: AnyObject]) // 通過字典內(nèi)容連接
case Cookies([NSHTTPCookie]) // An array of NSHTTPCookies. Passed during the handshake. Default is nil.
case DoubleEncodeUTF8(Bool) // Whether or not to double encode utf8. If using the node based server this should be true. Default is true.
case ExtraHeaders([String: String]) // 添加自定義請求頭初始化來請求, 默認(rèn)為nil
case ForcePolling(Bool) // 是否使用 xhr-polling. Default is `false`
case ForceNew(Bool) // 將為每個(gè)連接創(chuàng)建一個(gè)新的connect, 如果你在重新連接時(shí)有bug時(shí)使用.
case ForceWebsockets(Bool) // 是否使用 WebSockets. Default is `false`
case HandleQueue(dispatch_queue_t) // 調(diào)度handle的運(yùn)行隊(duì)列. Default is the main queue.
case Log(Bool) // 是否打印調(diào)試信息. Default is false.
case Logger(SocketLogger) // 可自定義SocketLogger調(diào)試日志.默認(rèn)是系統(tǒng)的.
case Nsp(String) // 如果使用命名空間連接. Must begin with /. Default is `/`
case Path(String) // 如果服務(wù)器使用一個(gè)自定義路徑. 例如: `"/swift/"`. Default is `""`
case Reconnects(Bool) // 是否重新連接服務(wù)器失敗. Default is `true`
case ReconnectAttempts(Int) // 重新連接多少次. Default is `-1` (無限次)
case ReconnectWait(Int) // 等待重連時(shí)間. Default is `10`
case SessionDelegate(NSURLSessionDelegate) // NSURLSessionDelegate 底層引擎設(shè)置. 如果你需要處理自簽名證書. Default is nil.
2对途、接收消息
接收消息是on 后的參數(shù)并不是一定是“notification”,要根據(jù)服務(wù)器端的設(shè)置去使用對應(yīng)的字符串髓棋。
[_socket on:@"notification" callback:^(NSArray * _Nonnull data, SocketAckEmitter * _Nonnull ack) {
}];