收到通知时播放声音在开发人员中有效,但在生产中不行



我想在收到特定通知时播放声音,无论是否打开寂静模式。

我将其使用Avoundation框架在DEV模式下工作。因此,在AppDelegate didFinishLaunchingWithOptions方法中,我初始化AVAudioSession

NSError *audioSessionError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&audioSessionError];
[[AVAudioSession sharedInstance] setActive:YES error:&audioSessionError];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
if(audioSessionError) {
    NSLog(@"[AppDelegate] audioSessionError: %@", audioSessionError);
}

我使用didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler方法检查应用程序是否在后台,通知是播放声音的通知。

if(application.applicationState == UIApplicationStateBackground) {        
    NSDictionary *aps = [userInfo objectForKey:@"aps"];
    if([[aps valueForKey:@"category"] isEqualToString:@"alarm"]) {
        NSString *path = [NSString stringWithFormat:@"%@/alarm.wav", [[NSBundle mainBundle] resourcePath]];
        NSURL *soundUrl = [NSURL fileURLWithPath:path];
        NSError *audioPlayerError = nil;
        self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:&audioPlayerError];
        if(audioPlayerError) {
            NSLog(@"[AppDelegate] audioPlayerError: %@", audioPlayerError);
        } else {
            NSLog(@"[AppDelegate] audioPlayer play call");
            [self.audioPlayer play];
        }
    }
    completionHandler(UIBackgroundFetchResultNewData);
} else {
    completionHandler(UIBackgroundFetchResultNoData);
}

设置了info.plist audioremote-notification中的键。

一切都很好,所以我推动了该应用程序,而没有任何更改测试飞行。当该应用程序收到通知时,警报将显示,但是当静音模式打开时,声音不会播放。因此,我再次在开发人员进行了测试,在那里我得到了相同的结果。收到并显示通知,但没有播放声音。

我不知道为什么它在将其推向测试范围之前,然后是生产还是开发工作。每次都会收到通知,只有声音不再播放。

有人知道这是怎么发生的?

所以,我找到了解决问题的解决方案。

AppDelegate.m文件初始化AVAudioSession时,我从

更改了行
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&audioSessionError]; 

to

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&audioSessionError];

使用新选项AVAudioSessionCategoryOptionMixWithOthers,它在开发和生产中起作用。

最新更新