2012-09-23 70 views
10

面臨兩個錯誤。CoreMIDI/PGMidi iOS6中的虛擬MIDI錯誤

此代碼工作在的iOS 4和5,但更新至6之後,它不工作(

我發現以下,但不知道如何解決它的代碼。

在iOS 6中開始,應用程序必須要使用CoreMIDI的MIDISourceCreate和MIDIDestinationCreate功能在他們的UIBackgroundModes音頻關鍵。如果沒有按鍵,這些函數將返回kMIDINotPermitted(-10844)。

2012年9月23日03:40:04.773 MidiStudio [1017:907]錯誤(創建MIDI虛擬酸ce):-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; 
    } 
} 

回答

13

[只是把我的筆記這裏Kurt的出色答卷。]

首先,這就是所謂的文檔中所有提到的「的iOS 6.0版本說明」。該生產線有云:

開始在iOS 6中,應用程序必須自己 UIBackgroundModes音頻鍵,以便使用CoreMIDI的MIDISourceCreate和 MIDIDestinationCreate功能。如果沒有按鍵,這些功能 將返回kMIDINotPermitted(-10844)。

所以,你需要做的(再次,只是指定什麼庫爾特回答)的唯一事情是這樣的每個目標的plist中

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

注意自我:閱讀發行說明。 –

+1

僅供參考,用戶友好的plist項目名稱是「所需的背景模式」 –

7

你不需要改變任何代碼再次閱讀消息:

在開始iOS 6中,應用程序需要有音頻關鍵在他們UIBackgroundModes

UIBackgroundModesa key in your application's Info.plist。那麼use Xcode to edit your app's Info.plist,併爲這個值鍵是包含字符串audio的數組。

+0

Kurt是對的。然而......如果你的應用程序不在後臺播放,蘋果可能不會讓它通過而不會產生惡意。只要看到這一點,事情就會解決。 – stephen

+0

@stephen最終,即使您的應用已在商店中銷售多年,您也必須證明自己的合理性。除非你永遠不提交更新;) –

1

我的應用程序使用MIDIDestinationCreate發揮MIDI文件和應用程序審查團隊確實創造了一個臭味。他們堅持認爲應用程序必須在後臺播放一些音頻。他們引用「2.16:多任務處理應用程序可能只爲他們的預期目的使用後臺服務:VoIP,音頻播放,位置,任務完成,本地通知等。」

我已經將它們引用到了這裏提到的iOS6發行說明中,並且他們只是繼續說它必須在後臺播放音頻。

我向Apple Developer Technical Support提交了一個請求。希望他們會改變他們團隊遵循的應用程序審查指南。