2012-10-25 9 views
11

Avviato un modello Cocos2D 2.1 (senza motore fisico) in Xcode 4.5, destinato a iOS 6 e iPad. Nel file CDAudioManager.m, il seguente codice ...Cocos2D 2.1: "Delega" deprecato in iOS 6. Come si imposta il delegato per questo AVAudioSession?

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

... genera il seguente avviso ...

"delegate deprecated: first deprecated in iOS 6" 

Così vado alla documentazione per gli sviluppatori di Apple, e si dice sotto "delegato", "Obsoleto in iOS 6.0, utilizzare le notifiche descritte nella sezione Notifiche di questa classe".

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

Il problema è che mi sembra tutto quello che stiamo cercando di fare - perdoni la mia inesperienza - è impostato il delegato per l'AVAudioSession all'istanza CDAudioManager stesso. Come si ottengono le notifiche? O mi sto solo sbagliando sull'obiettivo del codice sopra?

risposta

17

L'errore si esegue in è in questo blocco di codice

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

Per silenziare modificare l'avviso di quei 2 righe a questo:

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

Spero che questo aiuti.

+10

"Perché" è corretto? – Jonny

+0

Apple ha reso obsoleta l'impostazione del delegato e del protocollo AVAudioSessionDelegate in iOS 6 e ora è necessario ascoltare le notifiche tramite NSNotification Center. – geekinit

+9

Questa risposta sembra incompleta. –

9

Ho trovato un po 'di tutto questo sui forum di Cocos2D-iPhone.org. Anche se non lo capisco perfettamente - ma ci sto lavorando - sembra che si occupi del problema, almeno temporaneamente. Quello che ha fatto è stato scrivere questo metodo nel file CDAudioManger.m:

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

Poi sostituito:

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

con questo:

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

ecco il link: http://www.cocos2d-iphone.org/forum/topic/49956

Se e quando svilupperò una migliore comprensione di ciò che questo codice sta facendo, sarò sicuro di modificare t il suo post.

+0

non ho CDAudioManager.m – CroiOS

+0

Il link che hai mostrato parla anche di problemi con l'utilizzo di quel nuovo modulo il centro NSNotification, genera un errore di accesso errato in quella linea con iOS 5.0 ... sooo quale sarebbe una soluzione concreta? suggeriscono di avere un controllo della versione di iOS e di lanciare il codice di conseguenza. –

+1

+1 per "poast". – Jonny

0

non ho ancora testato questo, ma in base a questo post: 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; 
} 

Vale a dire lanciare un runtime di codice diverso a seconda della versione di iOS.

Ora, la mia app è iOS 6.0 e versioni successive solo in ogni caso quindi mi limiterò a andare con:

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

e attraversare i pollici.

10

Invece di utilizzare l'uso di notifica delegato per la gestione come segue

[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]; 
} 
Problemi correlati