我刚刚发现适用于 iOS 的 CABTMIDILocalPeripheralViewController
处理用于启用蓝牙 MIDI 可发现性的用户设置。这是
很好,但为了将蓝牙集成到我应用程序的其余部分
网络 MIDI 连接最好能够处理
直接从我的应用程序代码启用,而不是依赖这个不透明的 VC。
有谁知道这是否可能?
最佳答案
没有公共(public) API 来管理此功能。在使用 Instruments 进行调查后,开关似乎导致了 CBPeripheralManager
的实例化。我假设它将设备设置为蓝牙外围设备,并手动将数据传入和传出同样已创建的 MIDIEndpointRef
。
换句话说,没有单线解决方案。如果我沿着这条路走得更远,我会发布代码,除非其他人想试一试......
更新
神奇代码...
- (instancetype)init
{
self = [super init];
if (self) {
_peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
}
return self;
}
//---------------------------------------------------------------------
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
{
if (peripheral.state != CBPeripheralManagerStatePoweredOn) {
return;
}
info(@"_peripheralManager powered on.");
// CBMutableCharacteristic *tx = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:RBL_TX_UUID] properties:CBCharacteristicPropertyWriteWithoutResponse value:nil permissions:CBAttributePermissionsWriteable];
//
rx = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"7772E5DB-3868-4112-A1A9-F2669D106BF3"] properties:CBCharacteristicPropertyRead|CBCharacteristicPropertyWriteWithoutResponse|CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable|CBAttributePermissionsWriteable];
CBMutableService *s = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:@"03B80E5A-EDE8-4B33-A751-6CE34EC4C700"] primary:YES];
s.characteristics = @[rx];
[_peripheralManager addService:s];
NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey : BLE_NAME, CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:@"03B80E5A-EDE8-4B33-A751-6CE34EC4C700"]]};
[_peripheralManager startAdvertising:advertisingData];
}
正是这些 ID 定义了 MIDI 外围设备。更多信息:
Apple 曾经有一个文档在
...不再是了。我很想找到一份旧副本,因为事实证明接收器代码(模拟 CABTMIDICentralViewController
)更难破解...
关于ios - 在没有 CABTMIDILocalPeripheralViewController 的情况下手动在 iOS 上宣传蓝牙 MIDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957448/