2012-09-23 12 views
10

Ante dos errores.CoreMIDI/PGMidi Error midi virtual en iOS6

Este código trabajó en IOS 4 y 5, pero después de la actualización a 6, que no está funcionando (

encontré siguiente, pero no saben cómo solucionarlo en el código.

a partir de iOS 6, aplicaciones necesitan tener la clave de audio en sus UIBackgroundModes con el fin de utilizar las funciones MIDISourceCreate y MIDIDestinationCreate de CoreMIDI. Sin el conjunto de claves, estas funciones devolverán kMIDINotPermitted (-10.844).

2012-09-23 03: 40: 04.773 MidiStudio [1017: 907] Error (Crear MIDI virtual agrio ce): -10844: Dominio de error = NSMachErrorDomain Code = -10844 "No se pudo completar la operación. (Error de Mach -10844) "

2012-09-23 03: 40: 04.777 MidiStudio [1017: 907] Error (Crear destino virtual MIDI): -10844: Dominio de error = NSMachErrorDomain Code = -10844" La operación no pudo ser completado (. Mach error -10844)"

Aquí es código para 'fuente':.

-(void)setVirtualSourceEnabled:(BOOL)virtualSourceEnabled { 
    if (virtualSourceEnabled == self.virtualSourceEnabled) return; 

    if (virtualSourceEnabled) { 
     NSString *name = virtualEndpointName ? virtualEndpointName : [[[NSBundle mainBundle] infoDictionary] valueForKey:(NSString*)kCFBundleNameKey]; 

     OSStatus s = MIDISourceCreate(client, (CFStringRef)name, &virtualSourceEndpoint); 
     NSLogError(s, @"Create MIDI virtual source"); 
     if (s != noErr) return; 

     virtualSourceDestination = [[PGMidiVirtualSourceDestination alloc] initWithMidi:self endpoint:virtualSourceEndpoint]; 

     [delegate midi:self destinationAdded:virtualSourceDestination]; 
     [[NSNotificationCenter defaultCenter] postNotificationName:PGMidiDestinationAddedNotification 
                  object:self 
                  userInfo:[NSDictionary dictionaryWithObject:virtualSourceDestination 
                           forKey:PGMidiEndpointKey]]; 

    } else { 
     [delegate midi:self destinationRemoved:virtualSourceDestination]; 

     [[NSNotificationCenter defaultCenter] postNotificationName:PGMidiDestinationRemovedNotification 
                  object:self 
                  userInfo:[NSDictionary dictionaryWithObject:virtualSourceDestination 
                           forKey:PGMidiEndpointKey]]; 

     [virtualSourceDestination release]; virtualSourceDestination = nil; 
     OSStatus s = MIDIEndpointDispose(virtualSourceEndpoint); 
     NSLogError(s, @"Dispose MIDI virtual source"); 
     virtualSourceEndpoint = NULL; 
    } 
} 

Respuesta

13

[sólo poner mis notas aquí en la excelente respuesta de Kurt.]

En primer lugar, todo esto se menciona en el documento denominado "iOS 6.0 Notas de la versión." La línea no dice:

A partir de iOS 6, aplicaciones necesitan tener la clave de audio en sus UIBackgroundModes con el fin de utilizar funciones MIDIDestinationCreate MIDISourceCreate y de CoreMIDI. Sin la clave establecida, estas funciones devolverán kMIDINotPermitted (-10844).

Así que lo único que tiene que hacer (de nuevo, simplemente especificando lo que respondió Kurt) es algo como esto en plist de cada objetivo:

<key>UIBackgroundModes</key> 
<array> 
    <string>audio</string> 
</array> 
+2

Nota para mí: lea las notas de la versión. –

+1

FYI, el nombre de entrada fácil de usar es "Modos de fondo requeridos" –

7

No es necesario cambiar cualquier código leído ese mensaje nuevo:

A partir de iOS 6, aplicaciones necesitan tener la clave de audio en sus UIBackgroundModes

UIBackgroundModes es a key in your application's Info.plist. Así use Xcode to edit your app's Info.plist, y hacer que el valor de dicha key es una matriz que contiene la cadena audio.

+0

Kurt tiene razón. Sin embargo ... Apple no puede dejarlo pasar sin apesadumbrarse si tu aplicación no se reproduce en segundo plano. Solo mira esto y las cosas funcionarán. – stephen

+0

@stephen eventualmente, tendrá que justificarse, incluso si su aplicación ha estado vendiendo en la tienda durante años. A MENOS QUE nunca envíe una actualización;) –

1

Mi aplicación utiliza la MIDIDestinationCreate jugar un midi el archivo y el equipo de revisión de la aplicación realmente están creando un hedor. Insisten en que la aplicación debe reproducir algo de audio en segundo plano. Citan "2.16: las aplicaciones multitarea solo pueden usar servicios en segundo plano para los fines previstos: VoIP, reproducción de audio, ubicación, finalización de tareas, notificaciones locales, etc."

Los he referido a las notas de la versión de iOS6 mencionadas aquí y siguen volviendo diciendo que debe reproducir el audio en segundo plano.

He enviado una solicitud al Soporte técnico para desarrolladores de Apple. Con suerte, cambiarán las pautas de revisión de la aplicación que sigue su equipo.