面临两个错误。

这段代码在iOS 4和5中有效,但在更新到6后,它不起作用了

我发现了以下内容,但不知道如何在代码中进行修复。

从iOS 6开始,应用程序需要在其UIBackgroundModes中具有音频键,才能使用CoreMIDI的MIDISourceCreate和MIDIDestinationCreate函数。如果不设置键,这些函数将返回kMIDINotPermitted(-10844)。

2012-09-23 03:40:04.773 MidiStudio [1017:907]错误(创建MIDI虚拟源):-10844:Error Domain = NSMachErrorDomain代码= -10844“操作无法完成。(机器错误-10844。 )”

2012-09-23 03:40:04.777 MidiStudio [1017:907]错误(创建MIDI虚拟目标):-10844:Error Domain = NSMachErrorDomain Code = -10844“操作无法完成。(错误-10844。 )”

这是“源”的代码:

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

最佳答案

[只要将我的笔记放在这里,就是Kurt的出色回答。]

首先,在名为“ iOS 6.0发行说明”的文档中提到了所有这些内容。那里的行说:


从iOS 6开始,应用程序必须在其音频键中
UIBackgroundModes,以便使用CoreMIDI的MIDISourceCreate和
MIDIDestinationCreate函数。没有按键设置,这些功能
将返回kMIDINotPermitted(-10844)。


因此,您唯一需要做的事情(同样,只需指定Kurt回答的问题)就是每个目标的plist中的类似内容:

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

08-25 08:33