jetfire 0.1.5

jetfire 0.1.5

测试已测试
Lang语言 Obj-CObjective C
许可证 Apache 2
发布最后发布2015年11月

Dalton CherryAustin Cherry 维护。



jetfire 0.1.5

Jetfire

WebSocket RFC 6455 客户端库,适用于 iOS 和 OSX。

Jetfire 是一个符合 WebSocket (RFC 6455) 标准的 Objective-C 客户端库,适用于 iOS 和 OSX。

Jetfire 也有一个 Swift 版本,见Starscream

功能

  • 符合所有的Autobahn 测试套件
  • 非阻塞。所有操作都在后台进行,感谢 GCD。
  • 简单的委托模式设计。
  • TLS/WSS 支持。
  • 简单的简洁的代码库,只有几百行代码。

示例

首先需要导入头文件。请参阅安装说明,了解如何将 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];

连接后,我们还需要实现一些委托方法。

websocketDidConnect

-(void)websocketDidConnect:(JFRWebSocket*)socket {
    NSLog(@"websocket is connected");
}

websocketDidDisconnect

-(void)websocketDidDisconnect:(JFRWebSocket*)socket error:(NSError*)error {
    NSLog(@"websocket is disconnected: %@",[error localizedDescription]);
}

websocketDidReceiveMessage

-(void)websocket:(JFRWebSocket*)socket didReceiveMessage:(NSString*)string {
    NSLog(@"got some text: %@",string);
}

websocketDidReceiveData

-(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];

委托方法提供了处理来自服务器数据的一种简单方式,但是您如何发送数据呢?

writeData

[self.socket writeData:[NSData data]]; // write some NSData over the socket!

writeString

writeString 方法与 writeData 相同,但发送文本/字符串。

[self.socket writeString:@"Hi Server!"]; //example on how to write text over the socket!

disconnect

[self.socket disconnect];

isConnected

返回套接字是否已连接。

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];

自签名SSL和VOIP

还有一些其他属性可以修改流。

//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;

SSL固定

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或更高版本。

依赖项

  • Security.framework
  • CFNetwork.framework

待办事项

  • [ ] 完成文档
  • [ ] 添加单元测试

许可

Jetfire基于Apache许可证。

联系

Austin Cherry

Dalton Cherry