我想在收到特定通知时播放声音,无论是否打开寂静模式。
我将其使用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 audio
和 remote-notification
中的键。
一切都很好,所以我推动了该应用程序,而没有任何更改测试飞行。当该应用程序收到通知时,警报将显示,但是当静音模式打开时,声音不会播放。因此,我再次在开发人员进行了测试,在那里我得到了相同的结果。收到并显示通知,但没有播放声音。
我不知道为什么它在将其推向测试范围之前,然后是生产还是开发工作。每次都会收到通知,只有声音不再播放。
有人知道这是怎么发生的?
所以,我找到了解决问题的解决方案。
在AppDelegate.m
文件初始化AVAudioSession
时,我从
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&audioSessionError];
to
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&audioSessionError];
使用新选项AVAudioSessionCategoryOptionMixWithOthers
,它在开发和生产中起作用。