CoreMIDI/PGMidi Ошибка виртуального midi в iOS6

Столкнувшись с двумя ошибками.

Этот код работал в iOS 4 и 5, но после обновления до 6 он не работает (

Я нашел следующее, но не знаю, как его исправить в коде.

Начиная с iOS 6, приложения должны иметь звуковой ключ в своих UIBackgroundModes, чтобы использовать функции CoreMIDI MIDISourceCreate и MIDIDestinationCreate. Без набора ключей эти функции вернут kMIDINotPermited (-10844).

2012-09-23 03: 40: 04.773 MidiStudio [1017: 907] Ошибка (создайте виртуальный источник MIDI): -10844: Ошибка домена = NSMachErrorDomain Code = -10844 "Операция не может быть выполнена. (Ошибка Mach -10844.)"

2012-09-23 03: 40: 04.777 MidiStudio [1017: 907] Ошибка (создание виртуального адресата MIDI): -10844: домен ошибки = код NSMachErrorDomain = -10844 "Операция не может быть выполнена. (Ошибка Mach -10844.)"

Вот код для 'source':

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

Ответ 1

[Просто положил мои заметки на Курт отличный ответ.]

Во-первых, все это упоминается в документе под названием "Примечания к выпуску iOS 6.0". В строке там говорится:

Начиная с iOS 6, приложения должны иметь звуковой ключ в своем UIBackgroundModes для использования CoreMIDIs MIDISourceCreate и Функции MIDIDestinationCreate. Без набора ключей эти функции вернет kMIDINotPermited (-10844).

Итак, единственное, что вам нужно сделать (опять же, просто указав, что ответил Курт), - это что-то вроде этого в каждом целевом plist:

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

Ответ 2

Вам не нужно менять код. Прочтите это сообщение еще раз:

Начиная с iOS 6, приложения должны иметь звуковой ключ в своих UIBackgroundModes

UIBackgroundModes ключ в вашем приложении Info.plist. Поэтому использовать Xcode для редактирования вашего приложения Info.plist и сделать значение для этого ключа массивом, содержащим строку audio.

Ответ 3

Мое приложение использует MIDIDestinationCreate для воспроизведения midi файла, и команда просмотра приложений действительно создает вонь. Они настаивают на том, что приложение должно воспроизводить аудио в фоновом режиме. Они цитируют: "2.16: приложения для многозадачности могут использовать только фоновые службы для их предполагаемых целей: VoIP, воспроизведение аудио, местоположение, завершение задачи, локальные уведомления и т.д."

Я упомянул их о примечаниях к выпуску iOS6, упомянутых здесь, и они просто продолжают возвращаться, говоря, что они должны воспроизводить аудио в фоновом режиме.

Я отправил запрос в Техническую поддержку Apple Developer. Надеемся, они изменят рекомендации по обзору приложений, которые следуют их команды.