10

面临两个错误。

此代码在 iOS 4 和 5 中工作,但更新到 6 后,它不工作(

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

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

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

2012-09-23 03:40:04.777 MidiStudio [1017:907] 错误(创建 MIDI 虚拟目标):-10844:错误域 = NSMachErrorDomain 代码 = -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;
    }
}
4

3 回答 3

14

[只是把我的笔记放在 Kurt 的出色答案上。]

首先,这在名为“iOS 6.0 Release Notes”的文档中都有提及。那里的行说:

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

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

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>
于 2012-09-25T15:17:42.920 回答
7

您无需更改任何代码。再次阅读该消息:

从 iOS 6 开始,应用程序需要在其 UIBackgroundModes 中包含音频键

UIBackgroundModes应用程序 Info.plist 中的一个键。因此,使用 Xcode 编辑您的应用程序的 Info.plist,并使该键的值成为包含字符串的数组audio

于 2012-09-23T03:24:02.453 回答
1

我的应用程序使用 MIDIDestinationCreate 播放 MIDI 文件,而应用程序审查团队确实在制造臭味。他们坚持认为应用程序必须在后台播放一些音频。他们引用“2.16:多任务应用程序只能将后台服务用于其预期目的:VoIP、音频播放、位置、任务完成、本地通知等。”

我已将他们推荐给此处提到的 iOS6 发行说明,他们只是不断回来说它必须在后台播放音频。

我已向 Apple 开发者技术支持提交了请求。希望他们能改变他们的团队遵循的应用审查指南。

于 2014-07-18T16:57:47.753 回答