¿Cómo se crea un descriptor para una característica mutable?

La documentation para CBMutableDescriptor:initWithType:value: indica pasar un "UUID de 128 bits que identifica la característica" para el parámetro de tipo. Luego, dice que solo debe usar una CBUUIDCharacteristicUserDescriptionString o CBUUIDCharacteristicFormatString para el parámetro de tipo. Finalmente, no hay un método para agregar un descriptor a una característica mutable.

Parece que el parámetro está haciendo dos cosas mutuamente excluyentes. Por un lado, se utiliza para indicar a la O / S a qué característica se aplica el descriptor y, por el otro, se utiliza para establecer el tipo de descriptor. El segundo tiene más sentido, pero ¿cómo agrega el descriptor a la característica?

Ya sea que pase el UUID por la característica o CBUUIDCharacteristicUserDescriptionString , iOS falla con

 Assertion failure in -[CBMutableDescriptor initWithType:value:], /SourceCache/CoreBluetooth_Sim/CoreBluetooth-59.3/CBDescriptor.m:25 

¿Cuál es la forma correcta de crear el CBMutableDescriptor y agregarlo a un CBMutableCharacteristic?

Tienes razón sobre los documentos. Pero para ser claros para todos, aquí hay una cita encontrada en CBDescriptor.h:

… Solo se admiten los descriptores de descripción de usuario y formatting de característica característica. Los descriptores de properties extendidas características y configuration de características de los clientes se crearán automáticamente al publicarse el service principal, según las properties de la característica en sí.

Entonces, en otras palabras, a less que esté configurando esos descriptores, el sistema lo bloqueará (por lo tanto, obtuvo el error de aserción).

Entonces, diga que desea usar el descriptor de descripción de usuario característica, haría:

 CBUUID *yourCharUUID = [CBUUID UUIDWithString:@"c07c5050-15a0-11e3-8ffd-0800200c9a66"];//whatever UUID your using CBMutableCharacteristic *yourCharacteristic = [[CBMutableCharacteristic alloc]initWithType:yourCharUUID properties:CBCharacteristicPropertyWriteWithoutResponse value:nil permissions:perms]; CBUUID *userDescriptionUUID = [CBUUID UUIDWithString:CBUUIDCharacteristicUserDescriptionString];//or set it to the actual UUID->2901 CBMutableDescriptor *yourDescriptor = [[CBMutableDescriptor alloc]initWithType:userDescriptionUUID value:@"myDescriptorValue"]; yourCharacteristic.descriptors = @[yourDescriptor]; 

Hazme saber si tienes alguna pregunta.