我有这个方法,在 myViewController 中添加一个观察者:
-(void) observeSpeakerVolume{
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionNew context:nil];
}
我在 myViewController 的viewdidLoad中调用此方法:
- (void)viewDidLoad {
[self performSelectorInBackground:@selector(observeSpeakerVolume) withObject:nil];
[super viewDidLoad];
}
最后我按如下方式监视观察者:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"outputVolume"]) {
if ([[change valueForKey:@"new"] isEqualToNumber:@0]){
...
} else {
...
}
}
}
一切正常,但只要我的应用程序发送到后台,例如通过点击主页按钮,观察者似乎会被自动删除。
要解决这个问题,我在AppDelegate中执行此操作:
- (void)applicationWillEnterForeground:(UIApplication *)application {
myViewController * wfc = [[myViewController alloc]init];
[wfc observeSpeakerVolume];
}
似乎可以正常工作,然而,在后台和前台之间来回切换几次,最终改变iPhone的音量会使应用程序崩溃。
我尝试在进入后台时手动删除观察者,但这也会导致应用程序崩溃,支持操作系统在进入后台时自动删除观察者的建议。
所以,我假设,我多次添加观察者,但我没有看到,因为当应用程序进入前景时未调用ViewDidLoad。
我的逻辑在这里出了什么问题?
感谢您的见解。
答案 0 :(得分:0)
有点晚,但是我有类似的问题。
如果您致电
[[AVAudioSession sharedInstance] setActive:YES error:nil];
您的应用从后台返回后,例如在
- (void)applicationWillEnterForeground:(UIApplication *)application;
然后观察者将再次工作。