测试已测试 | ✓ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布上次发布 | 2017年5月 |
SwiftSwift 版本 | 3.1 |
由Jens Meder维护。
DarkLightning 是一个轻型 Objective-C 库,它允许在 iOS/tvOS 设备(雷电端口、Dock 连接器、USB-C)和 OSX(USB)之间以 480 MBit 的速度进行数据传输,无需越狱您的 iOS/tvOS 设备。它使用 OS X 上的 usbmuxd 服务来打开与 iOS/tvOS 设备的 TCP 套接字连接。
DarkLightning 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "DarkLightning"
包含三个子spec,分别为 iOS
、tvOS
和 OSX
。CocoaPods 会自动根据您开发的平台选择合适的子spec。这意味着如果您在开发 iOS 应用,则 pod "DarkLightning"
和 pod "DarkLightning/iOS"
的效果是一样的。
在 iOS/tvOS 和 OSX 之间打开连接的基本步骤如下所示
JMMobileDevicePort
您可以在 iOS/tvOS 和 OSX 之间发送任意数量的字节。使用 TCP 发送数据。
JMMobileDevicePort* devicePort = [[JMMobileDevicePort alloc]initWithPort:2345];
devicePort.delegate = self;
[devicePort open];
-(void) mobileDevicePort:(nonnull JMMobileDevicePort*)port didReceiveData:(nonnull NSData*)data
{
// Do something with the data
}
NSData* data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding];
[devicePort writeData:data];
JMUSBDeviceManager* manager = [[JMUSBDeviceManager alloc]init];
manager.delegate = self;
[manager start];
一旦您将iOS/tvOS设备连接到Mac或拔出,您将在对应代理方法(deviceManager:deviceDidAttach:
或deviceManager:deviceDidDetach:
)中收到回调。您还会在启动发现时,通过[manager start];
使用代理收到对已连接到OSX的每个iOS/tvOS设备的deviceManager:deviceDidAttach:
的回调。
JMUSBDevice* _myDevice;
...
// Called for every device that is or will be attached to the system
-(void) deviceManager:(nonnull JMUSBDeviceManager*)manager deviceDidAttach:(nonnull JMUSBDevice*)device
{
// Save the device for later usage
_myDevice = device;
}
// Called for every iOS/tvOS device that has been detached from the system
-(void) deviceManager:(nonnull JMUSBDeviceManager*)manager deviceDidDetach:(nonnull JMUSBDevice*)device
{
// Device is no longer attached to the system. Cleanup any connections and references to it.
_myDevice = nil;
}
借助于发现到的JMUSBDevice
和一个端口号,您可以现在建立与iOS/tvOS应用的连接。
注意:端口号需要与您用于在iOS/tvOS上打开JMMobileDevicePort
时使用的端口号相同。
JMUSBDeviceConnection* myDeviceConnection = [[JMUSBDeviceConnection alloc] initWithDevice:_myDevice andPort:2345];
myDeviceConnection.delegate = self;
[myDeviceConnection connect];
完成连接后,请确保正确关闭它。
[myDeviceConnection disconnect];
myDeviceConnection = nil;
-(void) connection:(nonnull JMUSBDeviceConnection*)connection didReceiveData:(nonnull NSData*)data
{
// Do something with the data
}
NSData* data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding];
[_myDeviceConnection writeData:data];
如果您在开发过程中不需要始终连接iOS/tvOS设备,您也可以使用iOS/tvOS模拟器。
在iOS/tvOS模拟器中使用DarkLightning时,无需对iOS/tvOS应用进行任何更改。 :)
要连接到iOS/tvOS模拟器,需要使用JMSimulatorConnection
而不是JMUSBDeviceConnection
。由于JMSimulatorConnection
和JMUSBDeviceConnection
都从同一个基类JMDeviceConnection
继承,因此它们具有相同的接口。代理回调也是相同的。
JMSimulatorConnection* simulatorConnection = [[JMSimulatorConnection alloc]initWithPort:2347];
simulatorConnection.delegate = self;
[simulatorConnection connect];
您还可以使用JMSimulatorConnection
通过网络连接到您的iPhone或iPhone模拟器。
JMSimulatorConnection* simulatorConnection = [[JMSimulatorConnection alloc]initWithHost:@"192.168.1.5" andPort:2347];
DarkLightning采用基于流的传输和接收数据的TCP方法。如果您在一边写入数据块,字节将以正确的顺序到达,但它们可能不是完整的。如果您快速发送数据块,它们甚至可能作为更大的块到达。DarkLightning附带两种数据包协议以编码和解码数据包。每种协议都允许您发送大小为4GB的数据包。
简单数据包协议可用于发送相同类型的数据或与高级协议结合使用。
JMSimpleDataPacketProtocol* packetProtocol = [[JMSimpleDataPacketProtocol alloc]init];
NSData* message = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding];
NSData* packet = [packetProtocol encodePacket:data];
[_myDeviceConnection writeData:packet];
数据包协议对象负责跟踪所有传入数据。如果一个数据包被分割成更小的片段,数据包协议对象会缓存这些数据。下一次您调用 processData:
时,它会尝试重新解密数据包。这个过程会一直持续到所有数据包片段都到达,并且可以重新解码。因此,保留对数据包协议对象的引用是必要的。
JMSimpleDataPacketProtocol* packetProtocol = [[JMSimpleDataPacketProtocol alloc]init];
-(void)mobileDevicePort:(JMMobileDevicePort *)port didReceiveData:(NSData *)data
{
NSArray<NSData*>* packets = [packetProtocol processData:data];
for (NSData* packet in packets)
{
// Do something with the packet
}
}
标记数据包协议可用于发送不同类型的数据,例如,使用一个标记来表示每种类型的数据。
static const uint16_t MESSAGE_TAG = 12345;
static const uint16_t RAW_TAG = 42;
JMTaggedPacketProtocol* packetProtocol = [[JMTaggedPacketProtocol alloc]init];
NSData* messageData = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding];
JMTaggedPacket* packet = [[JMTaggedPacket alloc] initWithData:messageData andTag:MESSAGE_TAG];
NSData* packetData = [packetProtocol encodePacket:data];
[_myDeviceConnection writeData:packetData];
uint8_t data[] = {0x00, 0x01, 0x02, 0x03};
NSData* messageData = [NSData dataWithBytes:data length:sizeof(data)];
JMTaggedPacket* packet = [[JMTaggedPacket alloc] initWithData:messageData andTag:RAW_TAG];
NSData* packetData = [packetProtocol encodePacket:data];
[_myDeviceConnection writeData:packetData];
数据包协议对象负责跟踪所有传入数据。如果一个数据包被分割成更小的片段,数据包协议对象会缓存这些数据。下一次您调用 processData:
时,它会尝试重新解密数据包。这个过程会一直持续到所有数据包片段都到达,并且可以重新解码。因此,保留对数据包协议对象的引用是必要的。
JMTaggedPacketProtocol* packetProtocol = [[JMTaggedPacketProtocol alloc]init];
-(void)mobileDevicePort:(JMMobileDevicePort *)port didReceiveData:(NSData *)data
{
NSArray<JMTaggedPacket*>* packets = [packetProtocol processData:data];
for (JMTaggedPacket* packet in packets)
{
switch(packet.tag)
{
case MESSAGE_TAG:
{
// Do something with the packet data
break;
}
case RAW_TAG:
{
// Do something with the packet data
break;
}
}
}
}
示例(参见 示例 文件夹)是一个简单的消息传递程序,使用 DarkLightning 在 iOS/tvOS 和 OSX 之间发送文本文消息。
注意:在 OSX 部分之前,需要启动 iOS/tvOS 应用。OSX 部分将尝试连接到通过 USB 连接的第一个设备。如果没有已连接的设备,它将尝试连接到 iOS/tvOS 模拟器。
MIT 许可证 (MIT)
版权所有 (c) 2015 Jens Meder
特此授予任何人无限制、免费地获得此软件及其相关文档副本(“软件”)的权利,包括但不限于使用、复制、修改、合并、发布、分发、许可和/或销售软件副本,以及允许向您提供软件的个人做上述事项,前提是须遵守以下条件
上述版权声明和本许可声明必须包含在软件的所有副本或实质部分中。
软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途适用性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论这些责任是由于合同的、侵权性的或其他方式引起的,与软件或软件的使用或其他相关事项有关。