这个代码在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“操作无法完成(Mach error -10844. )”
2012-09-23 03:40:04.777 Midistudio [1017:907]错误(创建MIDI虚拟目的地):-10844:错误域= NSMachErrorDomain代码= -10844“操作无法完成(Mach error -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;
}
}
解决方法
首先,这一切都在文档中被称为“iOS 6.0发行说明”.那条线说:
Beginning in iOS 6,apps need to have the audio key in their
uibackgroundmodes in order to use CoreMIDI’s MIdisourceCreate and
MIDIDestinationCreate functions. Without the key set,these functions
will return kMIDINotPermitted (-10844).
所以你唯一需要做的(再次,只是指出Kurt回答)在每个目标的主张是这样的:
<key>uibackgroundmodes</key>
<array>
<string>audio</string>
</array>