13

iOS 6 および iPad を対象とした Xcode 4.5 で Cocos2D 2.1 テンプレート (物理エンジンなし) を開始しました。CDAudioManager.m ファイルでは、次のコード...

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

...次の警告が生成されます...

"delegate deprecated:  first deprecated in iOS 6"

そこで、アップルの開発者向けドキュメントにアクセスすると、「デリゲート」の下に「iOS 6.0 で非推奨。代わりに、このクラスの通知セクションで説明されている通知を使用してください」と記載されています。

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

問題は、AVAudioSession のデリゲートを CDAudioManager インスタンス自体に設定することだけです。通知はどのようにこれを達成しますか? それとも、上記のコードの目的について間違っていますか?

4

4 に答える 4

16

発生しているエラーは、このコード ブロックにあります

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

警告を消すには、これらの 2 行を次のように変更します。

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

お役に立てれば。

于 2012-11-09T21:30:17.337 に答える
9

Cocos2D-iPhone.org フォーラムで、これに関する投稿を見つけました。私はそれを完全には理解していませんが、私はそれに取り組んでいますが、少なくとも一時的に問題を処理しているように見えました. 彼が行ったことは、このメソッドを 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
}

それから彼は次のように置き換えました:

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

これとともに:

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

リンクは次のとおりです: http://www.cocos2d-iphone.org/forum/topic/49956

このコードが何をしているのかをよりよく理解できたら、必ずこの投稿を編集します。

于 2012-10-26T18:21:57.867 に答える
0

私はこれをテストしていませんが、この投稿によると: 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;
}

つまり、iOS のバージョンに応じて異なるコード ランタイムをスローします。

さて、とにかく私のアプリは iOS 6.0+ のみなので、次のようにします。

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

そして、親指を交差させます。

于 2013-08-01T01:39:56.510 に答える