【发布时间】:2018-04-26 08:42:11
【问题描述】:
无论是否打开静音模式,我都想在收到特定通知时播放声音。
我让它在开发模式下与 AVFoundation 框架一起工作。所以在 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 的键已设置。
一切正常,所以我在没有对 TestFlight 进行任何更改的情况下推送了应用程序。当应用程序现在收到通知时,会显示警报,但打开静音模式时不会播放声音。所以我再次在开发中测试它,我得到了相同的结果。收到通知并显示,但不播放声音。
我不知道为什么在将其推送到 TestFlight 之前它在开发中工作,之后它是在生产中还是在开发中工作。每次都会收到通知,只有声音不再播放。
有人知道这是怎么发生的吗?
【问题讨论】:
-
当您收到通知时,您的
AVAudioSession设置代码是否真的被调用了? -
@RhythmicFistman 不,但是当我正常启动应用程序时调用它,以便在应用程序进入后台之前启动
AVAudioSession。所以当收到通知时,AVAudioPlayer应该可以玩了,还是我的想法有问题? -
如果您的应用在收到通知时没有运行怎么办?我不知道当通知导致您的应用启动时是否调用
didFinishLaunchingWithOptions。但是,如果它确实导致您的应用程序启动,我不知道您是否可以从后台激活AVAudioSessionCategoryPlayback会话。你还在后台吗?也许有选项AVAudioSessionCategoryOptionMixWithOthers?但这仍然会覆盖静音开关吗?我不知道。我什么都不知道。 -
据我了解,
didFinishLaunchingWithOprions仅在应用程序启动时被调用。因此,当用户通常在前台打开应用程序时调用它。当收到通知并且应用程序处于后台时,只会调用didReceiveRemoteNotification。当应用程序被用户强制退出时,什么都不会被调用,这很好。我只想在应用处于后台时覆盖静音开关。 -
您的
AVAudioSession可能已停用。在玩之前尝试调用setActive(检查错误)?
标签: ios objective-c notifications avfoundation audio-player