1

他の誰かがこの問題についての洞察を持っていることを願っています...

アプリのリソースに読み込まれたカスタム サウンドを再生しようとしています。OpenALスレッドを使用して iPhone で再生するためにオーディオを CAF 形式に変換するで推奨されているように、afconvert ツールを使用してサウンドを作成しました。カスタム サウンド ファイルを作成するために実行する特定のコマンドは次のとおりです。

afconvert ~/Desktop/moof.au ~/Desktop/moof.caf -d ima4 -f caff -v

テスト デバイス (iPhone 5、iOS 7.0、または iPhone 4、iOS 6.1.3) でアプリを実行し、カスタム サウンド ファイルの名前を含むプッシュ通知を送信すると、デバイスは振動しますが、サウンドは再生されません。

ここで少しおかしくなりました... サウンドを再生するメソッドの開始点にブレークポイントを設定し、コードを 1 ステップ実行すると、デバイスはカスタム サウンドを再生し、プッシュ通知に応じて振動します!

問題のコードは次のとおりです。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    // If the app is running and receives a remote notification, the app calls this method to process
    // the notification payload. Your implementation of this method should use the app state to take an
    // appropriate course of action.

    ALog(@"push data package: %@", userInfo);
    NSDictionary *payload = [userInfo objectForKey:@"aps"];
    NSNumber *badgeNumber = [payload objectForKey:@"badge"];
    NSString *soundName = [payload objectForKey:@"sound"];

    // app is in foreground
    if (application.applicationState == UIApplicationStateActive) {
        ALog(@"active");
        if (badgeNumber) {
            application.applicationIconBadgeNumber = [badgeNumber integerValue];
        }
        [self playPushNotificationAlertSound:soundName];
    }
    // app is in background
    else if (application.applicationState == UIApplicationStateBackground) {
        ALog(@"background");
        if (badgeNumber) {
            application.applicationIconBadgeNumber = [badgeNumber integerValue];
        }
        [self playPushNotificationAlertSound:soundName];
    }
    // app was launched from inactive state
    else if ((application.applicationState == UIApplicationStateInactive)) {
        ALog(@"inactive");
        if (badgeNumber) {
            application.applicationIconBadgeNumber = [badgeNumber integerValue];
        }
    }
}

- (void)playPushNotificationAlertSound:(NSString *)soundName
{
    ALog(@"soundName = '%@'", soundName);

    if (![soundName isEqualToString:@"default"]) {

        NSURL *soundURL = [[NSBundle mainBundle] URLForResource:soundName withExtension:@"caf"];

        if (soundURL) {
            CFURLRef soundFileURLRef = (__bridge CFURLRef)soundURL;
            SystemSoundID soundFileObject = 0;
            OSStatus status = AudioServicesCreateSystemSoundID(soundFileURLRef, &soundFileObject);
            if (status == kAudioServicesNoError) {
                AudioServicesPlayAlertSound(soundFileObject);
                AudioServicesDisposeSystemSoundID(soundFileObject);
            }
            ALog(@"soundFileURLRef = %@", soundFileURLRef);
            ALog(@"soundFileObject = %i, status = %i", (unsigned int)soundFileObject, (int)status);
        }
    }
}

そして、ブレークポイントがアクティブになっておらず、カスタム サウンドが再生されていないコンソール ログは次のとおりです。

2013-09-22 11:02:40.123 MyAppUnderDevelopment[2489:60b] push data package: {
    "_" = BlyZ4SOYEeOEc5DiugJ6IA;
    aps =     {
        alert = "Test #1";
        badge = 1;
        sound = moof;
    };
}
2013-09-22 11:02:40.124 MyAppUnderDevelopment[2489:60b] active
2013-09-22 11:02:40.136 MyAppUnderDevelopment[2489:60b] soundName = 'moof'
2013-09-22 11:02:40.138 MyAppUnderDevelopment[2489:60b] soundFileURLRef = file:///var/mobile/Applications/31785684-2EFA-4FEB-95F3-3A6B82B16A4A/MyAppUnderDevelopment.app/moof.caf
2013-09-22 11:02:40.139 MyAppUnderDevelopment[2489:60b] soundFileObject = 4100, status = 0

また、ブレークポイントがアクティブで、シングル ステップで、サウンドが再生されるコンソール ログ:

2013-09-22 11:03:29.891 MyAppUnderDevelopment[2489:60b] push data package: {
    "_" = "I_yGQCOYEeO515DiugJkgA";
    aps =     {
        alert = "Test #2";
        badge = 2;
        sound = moof;
    };
}
2013-09-22 11:03:29.892 MyAppUnderDevelopment[2489:60b] active
2013-09-22 11:03:33.752 MyAppUnderDevelopment[2489:60b] soundName = 'moof'
2013-09-22 11:03:40.757 MyAppUnderDevelopment[2489:60b] soundFileURLRef = file:///var/mobile/Applications/31785684-2EFA-4FEB-95F3-3A6B82B16A4A/MyAppUnderDevelopment.app/moof.caf
2013-09-22 11:03:45.356 MyAppUnderDevelopment[2489:60b] soundFileObject = 4101, status = 0

何がうまくいかないかについての役立つアイデアはありますか?

4

1 に答える 1

1

質問を準備した後、実行した手順が正しく記録されていることを確認するために、一連のテストを実行していました。コードをすばやくシングルステップ実行しているときに、呼び出していることを発見しました...

            AudioServicesPlayAlertSound(soundFileObject);
            AudioServicesDisposeSystemSoundID(soundFileObject);

...このようsoundFileObjectにして、非同期サウンドが再生される前に が破棄されました。短期的な解決策は、soundFileObject を保持プロパティに変更し、遅延インスタンス化を使用して必要に応じて作成することでした。

これが、頭を壁にぶつけている可能性のある他の誰かの助けになることを願っています。

于 2013-09-22T15:29:37.927 に答える