2012-09-23 4 views
10

Konfrontiert mit zwei Fehlern.CoreMIDI/PGMidi Virtueller Midifehler in iOS6

Dieser Code funktioniert in iOS 4 und 5, aber nach dem Update auf 6, ist es nicht funktioniert (

ich folgendes festgestellt, aber nicht wissen, wie man es beheben im Code.

Ab iOS 6, müssen Anwendungen, die Audio-Taste in ihrer UIBackgroundModes haben, um die Coremidi MIDISourceCreate und MIDIDestinationCreate Funktionen. Ohne den Schlüsselsatz zu verwenden, werden diese Funktionen geben kMIDINotPermitted (-10.844).

2012-09-23 03: 40: 04.773 MidiStudio [1017: 907] Fehler (Erstelle MIDI virtual sour ce): -10844: Fehlerdomäne = NSMachErrorDomain Code = -10844 "Die Operation konnte nicht abgeschlossen werden. (Mach Fehler -10844.) "

2012-09-23 03: 40: 04.777 MidiStudio [1017: 907] Fehler (MIDI virtuellen Ziel erstellen): -10844: Fehler Domain = NSMachErrorDomain Code = -10844" Die Operation konnte nicht abgeschlossen werden. (. Mach Fehler -10844)“

Hier Code für 'Quelle'.

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

Antwort

13

[Nur meine Notizen hier auf Kurts ausgezeichnete Antwort setzen.]

Zunächst einmal, das alles in dem genannten Dokument erwähnt wird "iOS 6.0 Release Notes." Die Linie dort sagt:

Ab iOS 6, müssen Anwendungen, die Audio-Taste in ihrer UIBackgroundModes haben, um die Coremidi MIDISourceCreate und MIDIDestinationCreate Funktionen zu nutzen. Ohne den Schlüsselsatz geben diese Funktionen kMIDINotPermitted (-10844) zurück.

Das einzige, was Sie brauchen (auch hier nur die Bereiche angeben, antwortete Kurt) zu tun, ist so etwas wie dies in jedes plist Ziel:

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

Hinweis für sich selbst: Lesen Sie die Versionshinweise. –

+1

FYI, der Name des benutzerfreundlichen Plist-Eintrags lautet "Erforderliche Hintergrundmodi" –

7

Sie benötigen keinen Code zu ändern, dass die Nachricht lesen wieder:

in Beginning iOS 6, müssen Anwendungen, die Audio-Taste in ihrer UIBackgroundModes

UIBackgroundModesa key in your application's Info.plist ist haben. So use Xcode to edit your app's Info.plist und den Wert machen, dass Schlüssel ist ein Array mit der Zeichenfolge audio.

+0

Kurt hat Recht. Allerdings ... Apple darf es nicht passieren lassen, ohne dass es stinkt, wenn die App nicht im Hintergrund läuft. Sieh dir das an und die Dinge werden funktionieren. – stephen

+0

@stephen schließlich müssen Sie sich rechtfertigen, auch wenn Ihre App seit Jahren im Laden verkauft wird. Es sei denn, Sie geben niemals ein Update ab;) –

1

Meine app verwendet die MIDIDestinationCreate ein midi zu spielen Datei und das App-Review-Team schaffen in der Tat einen Stink. Sie bestehen darauf, dass die App Audio im Hintergrund abspielen muss. Sie zitieren "2.16: Multitasking-Apps dürfen Hintergrunddienste nur für ihre vorgesehenen Zwecke verwenden: VoIP, Audiowiedergabe, Ort, Aufgabenerfüllung, lokale Benachrichtigungen usw."

Ich habe sie auf die iOS6 Releasenotes verwiesen, die hier erwähnt werden, und sie kommen immer wieder zurück und sagen, dass sie Audio im Hintergrund abspielen müssen.

Ich habe eine Anfrage an den technischen Support von Apple Developer gesendet. Hoffentlich werden sie die App-Review-Richtlinien ändern, denen ihr Team folgt.