【问题标题】:CoreMIDI/PGMidi Virtual midi error in iOS6iOS6 中的 CoreMIDI/PGMidi 虚拟 MIDI 错误
【发布时间】:2012-09-14 22:59:33
【问题描述】:

面临两个错误。

此代码在 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 Code=-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;
    }
}

【问题讨论】:

    标签: virtual midi coremidi


    【解决方案1】:

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

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

    从 iOS 6 开始,应用程序需要在其 UIBackgroundModes 为了使用 CoreMIDI 的 MIDISourceCreate 和 MIDIDestinationCreate 函数。没有按键,这些功能 将返回 kMIDINotPermitted (-10844)。

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

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

    【讨论】:

    • 仅供参考,用户友好的 plist 条目名称是“必需的背景模式”
    【解决方案2】:

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

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

    UIBackgroundModesa key in your application's Info.plist。所以use Xcode to edit your app's Info.plist,并将该键的值设为包含字符串audio 的数组。

    【讨论】:

    • 库尔特是对的。但是......如果您的应用程序不在后台播放,Apple 可能不会让它通过而不引起注意。只要看到这个,事情就会解决。
    • @stephen 最终,您将不得不证明自己的合理性,即使您的应用程序已经在商店中销售多年。除非你从不提交更新;)
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      相关资源
      最近更新 更多