测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | Apache 2 |
发布最后发布 | 2015年11月 |
由Dalton Cherry,Austin Cherry 维护。
WebSocket RFC 6455 客户端库,适用于 iOS 和 OSX。
Jetfire 是一个符合 WebSocket (RFC 6455) 标准的 Objective-C 客户端库,适用于 iOS 和 OSX。
Jetfire 也有一个 Swift 版本,见Starscream
首先需要导入头文件。请参阅安装说明,了解如何将 Jetfire 添加到您的项目中。
#import "JFRWebSocket.h"
导入后,您可以为您的 WebSocket 服务器打开一个连接。请注意,将 socket
作为一个属性使用可能是最好的,这样您的委托就可以保留。
self.socket = [[JFRWebSocket alloc] initWithURL:[NSURL URLWithString:@"ws://localhost:8080"] protocols:@[@"chat",@"superchat"]];
self.socket.delegate = self;
[self.socket connect];
连接后,我们还需要实现一些委托方法。
-(void)websocketDidConnect:(JFRWebSocket*)socket {
NSLog(@"websocket is connected");
}
-(void)websocketDidDisconnect:(JFRWebSocket*)socket error:(NSError*)error {
NSLog(@"websocket is disconnected: %@",[error localizedDescription]);
}
-(void)websocket:(JFRWebSocket*)socket didReceiveMessage:(NSString*)string {
NSLog(@"got some text: %@",string);
}
-(void)websocket:(JFRWebSocket*)socket didReceiveData:(NSData*)data {
NSLog(@"got some binary data: %d",data.length);
}
或者您可以使用块。
self.socket = [[JFRWebSocket alloc] initWithURL:[NSURL URLWithString:@"ws://localhost:8080"] protocols:@[@"chat",@"superchat"]];
//websocketDidConnect
socket.onConnect = ^{
println("websocket is connected")
};
//websocketDidDisconnect
socket.onDisconnect = ^(NSError *error) {
NSLog(@"websocket is disconnected: %@",[error localizedDescription]);
};
//websocketDidReceiveMessage
socket.onText = ^(NSString *text) {
NSLog(@"got some text: %@",string);
};
//websocketDidReceiveData
socket.onData = ^(NSData *data) {
NSLog(@"got some binary data: %d",data.length);
};
//you could do onPong as well.
[socket connect];
委托方法提供了处理来自服务器数据的一种简单方式,但是您如何发送数据呢?
[self.socket writeData:[NSData data]]; // write some NSData over the socket!
writeString 方法与 writeData 相同,但发送文本/字符串。
[self.socket writeString:@"Hi Server!"]; //example on how to write text over the socket!
[self.socket disconnect];
返回套接字是否已连接。
if(self.socket.isConnected) {
// do cool stuff.
}
您还可以用自己定制的自定义头覆盖默认的 WebSocket 头部,如下所示:
[self.socket setHeader:@"Sec-WebSocket-Protocol" forKey:@"someother protocols"];
[self.socket setHeader:@"Sec-WebSocket-Version" forKey:@"14"];
[self.socket setHeader:@"My-Awesome-Header" forKey:@"Everything is Awesome!"];
如果您需要指定一个协议,只需将其添加到初始化中即可。
//chat and superchat are the example protocols here
self.socket = [[JFRWebSocket alloc] initWithURL:[NSURL URLWithString:@"ws://localhost:8080"] protocols:@[@"chat",@"superchat"]];
self.socket.delegate = self;
[self.socket connect];
还有一些其他属性可以修改流。
//set this if you are planning on using the socket in a VOIP background setting (using the background VOIP service).
self.socket.voipEnabled = YES;
//set this you want to ignore SSL cert validation, so a self signed SSL certificate can be used.
self.socket.selfSignedSSL = YES;
Jetfire也支持SSL固定。
self.socket = [[JFRWebSocket alloc] initWithURL:[NSURL URLWithString:@"ws://localhost:8080"] protocols:@[@"chat",@"superchat"]];
NSData *data = ... //load your certificate from disk
so
self.socket.security = [[JFRSecurity alloc] initWithCerts:@[[[JFRSSLCert alloc] initWithData:data]] publicKeys:YES];
//self.socket.security = [[JFRSecurity alloc] initUsingPublicKeys:YES]; //uses the .cer files in your app's bundle
您可以加载您的证书的NSData
数据块,或者如果您想使用公钥,可以使用SecKeyRef
。布尔类型的usePublicKeys
指示是否使用证书进行验证或公钥。如果选择usePublicKeys
,则会自动从证书中提取公钥。
当调用代理方法时可以指定自定义队列。默认情况下使用dispatch_get_main_queue
,因此所有代理方法的调用都会运行在主线程上。需要注意的是,所有WebSocket处理都是在后台线程上进行的,只有修改队列时才会更改代理方法调用。实际处理始终在后台线程上进行,不会暂停您的应用。
var socket = WebSocket(url: NSURL(string: "ws://localhost:8080/")!, protocols: ["chat","superchat"])
//create a custom queue
socket.queue = dispatch_queue_create("com.vluxe.starscream.myapp", nil)
当调用代理方法时可以指定自定义队列。默认情况下使用dispatch_get_main_queue
,因此所有代理方法的调用都会运行在主线程上。需要注意的是,所有WebSocket处理都是在后台线程上进行的,只有修改队列时才会更改代理方法调用。实际处理始终在后台线程上进行,不会暂停您的应用。
//create a custom queue
self.socket.queue = dispatch_queue_create("com.vluxe.jetfire.myapp", nil);
请查看示例目录中的SimpleTest项目,以了解如何设置与WebSocket服务器的简单连接。
安装Jetfire的推荐方法是通过CocoaPods包管理器(类似于大多数库)。
Jetfire需要iOS 5/OSX 10.7或更高版本。
Jetfire基于Apache许可证。