2012-10-25 5 views
11

Gestartet eine Cocos2D 2.1-Vorlage (ohne Physik-Engine) in Xcode 4.5, für iOS gezielten 6 und iPad. In der CDAudioManager.m-Datei den folgenden Code ...Cocos2D 2.1: "Delegate" deprecated in iOS 6. Wie kann ich für diese AVAudioSession den Delegaten festgelegt haben?

AVAudioSession* session = [AVAudioSession sharedInstance]; 
session.delegate = self; // Which is what is automatically generated by the template. 

... erzeugt die folgende Warnung ...

"delegate deprecated: first deprecated in iOS 6" 

So gehe ich in den Apfel Entwickler-Dokumentation, und es sagt, unter "delegate", "Veraltet in iOS 6.0. Verwenden Sie stattdessen die Benachrichtigungen, die im Abschnitt Benachrichtigungen dieser Klasse beschrieben werden."

http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioSession_ClassReference/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instp/AVAudioSession/delegate

Problem ist, es es wie sieht alles wir zu tun versuchen - meine Unerfahrenheit zu vergeben - gesetzt, um die Delegierten für die AVAudioSession zur CDAudioManager Instanz selbst. Wie erreichen die Benachrichtigungen das? Oder bin ich nur falsch über das Ziel des oben genannten Codes?

Antwort

17

Der Fehler, den Sie in ausführen ist in diesem Codeblock

AVAudioSession* session = [AVAudioSession sharedInstance]; 
session.delegate = self;// <-------- DEPRECATED IN IOS 6.0 

die Warnung zum Schweigen bringen, diese zwei Zeilen, um diese Änderung:

[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

Hoffnung, das hilft.

+10

"Warum" ist das richtig? – Jonny

+0

Apple hat die Einstellung des Delegaten und des AVAudioSessionDelegate-Protokolls in iOS 6 eingestellt und nun müssen Sie stattdessen die Benachrichtigungen über das NSNotification Center abhören. – geekinit

+9

Diese Antwort sieht unvollständig aus. –

9

fand ich eine Poast dazu auf den Cocos2D-iPhone.org Foren. Obwohl ich es nicht vollständig verstehe - aber ich arbeite daran - scheint es zumindest zeitweise für das Problem zu sorgen. Was er tat, war diese Methode in der CDAudioManger.m Datei schreiben:

-(void) releaseBufferForFile:(NSString *) filePath { 
    int bufferId = [self bufferForFile:filePath create:NO]; 
    if (bufferId != kCDNoBuffer) { 
     [soundEngine unloadBuffer:bufferId]; 
     [loadedBuffers removeObjectForKey:filePath]; 
     NSNumber *freedBufferId = [[NSNumber alloc] initWithInt:bufferId]; 
     [freedBufferId autorelease]; 
     [freedBuffers addObject:freedBufferId]; 
    } 
} 
@end 

- (void) interruption:(NSNotification*)notification 
{ 
    NSDictionary *interuptionDict = notification.userInfo; 
      NSNumber* interuptionTypeValue = [dict valueForKey:AVAudioSessionInterruptionTypeKey]; 
    NSUInteger interuptionType = [interuptionTypeValue intValue]; 

    if (interuptionType == AVAudioSessionInterruptionTypeBegan) 
     [self beginInterruption]; 
#if __CC_PLATFORM_IOS >= 40000 
    else if (interuptionType == AVAudioSessionInterruptionTypeEnded) 
     [self endInterruptionWithFlags:(NSUInteger)[interuptionDict valueForKey:AVAudioSessionInterruptionOptionKey]]; 
#else 
    else if (interuptionType == AVAudioSessionInterruptionTypeEnded) 
     [self endInterruption]; 
#endif 
} 

Dann ersetzt er:

AVAudioSession *session = [AVAudioSession sharedInstance]; 
session.delegate = self; 

mit diesem:

[AVAudioSession sharedInstance]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:nil]; 

Hier ist der Link: http://www.cocos2d-iphone.org/forum/topic/49956

Falls und wenn ich eine bessere Entwicklung zu verstehen, was dieser Code tut, werde ich sicher sein, t bearbeiten sein Beitrag.

+0

Ich habe CDAudioManager nicht.m – CroiOS

+0

Der Link, den Sie zeigten, spricht auch über Probleme mit der Verwendung dieses neuen Formulars der NSNotification Center, wirft einen Bad Access Fehler in dieser Zeile mit iOS 5.0 ... sooo was wäre eine konkrete Lösung? Sie schlagen vor, eine Überprüfung der iOS-Version durchzuführen und den Code entsprechend zu übertragen. –

+1

+1 für "poast". – Jonny

0

Ich habe nicht getestet, aber nach diesem Beitrag: http://www.cocos2d-iphone.org/forums/topic/cdaudiomanager-line-402-delegate-is-deprecated/#post-390211

float osVersion = [[UIDevice currentDevice].systemVersion floatValue]; 
if (osVersion >=6.0) 
{ 
[AVAudioSession sharedInstance]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:nil]; 
} 
else 
{ 
AVAudioSession* session = [AVAudioSession sharedInstance]; 
session.delegate = self; 
} 

D.h. Abhängig von der iOS-Version wird eine andere Code-Laufzeit ausgelöst.

Nun, meine App ist iOS 6.0+ ohnehin nur so ich gerade gehe:

[AVAudioSession sharedInstance]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:nil]; 

Und meine Daumen kreuzen.

10

Statt wie für den Umgang mit Delegierten Verwendung Benachrichtigung über folgt

[AVAudioSession sharedInstance]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:nil]; 

- (void) interruption:(NSNotification*)notification 
    { 
    NSDictionary *interuptionDict = notification.userInfo; 

    NSUInteger interuptionType = (NSUInteger)[interuptionDict valueForKey:AVAudioSessionInterruptionTypeKey]; 

    if (interuptionType == AVAudioSessionInterruptionTypeBegan) 
     [self beginInterruption]; 

    else if (interuptionType == AVAudioSessionInterruptionTypeEnded) 
     [self endInterruption]; 
}