在iOS7上无法使用音量按钮静音

我最近将我的VoIP应用程序迁移到了iOS7,还有一个仍然存在的漏洞,我无法理解。

在VoIP通话中,在iOS6中,您可以按下物理音量按钮以降低音量,降至零。

现在,在iOS7中,我可以将声音降低到零之前的最后一步,这意味着音量无法静音。

我怀疑这是iOS7方面的东西,因为我在iOS6设备上没有相同的IPA问题。

谁知道怎么了?

与我的VoIP应用程序相同的问题…

我的解决方案:设置完所有内容后,将类别设置为“播放”,

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

然后将其设置回PlayAndRecord,

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 

这对我有用,希望这可以帮助遇到同样问题的人。

有点老问题,但我也需要Gui13的问题/评论的解决方案:

我们的应用程序中没有使用任何类型的控件,所有音量交互都基于音量按钮。所以我可以实现这个但是我需要一种方法将它与音量按钮联系起来。 这可能吗?

Apple建议使用MPVolumeView ,所以我想出了这个:

 MPVolumeView *volumeView = [MPVolumeView new]; [self.view addSubview:volumeView]; 

接着:

 __block UISlider *volumeSlider = nil; [[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:[UISlider class]]) { volumeSlider = obj; *stop = YES; } }]; [volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged]; 

有:

 - (void)handleVolumeChanged:(id)sender { NSLog(@"%s - %f", __PRETTY_FUNCTION__, ((UISlider *)sender).value); } 

上面的[MPVolumeView new]代码在MPVolumeView中没有框架,所以它在我们的self.view中不可见,它已被添加为子视图,但重要的是必须添加它!

您还可以使用以下代码初始化MPVolumeView

 MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:self.view.frame]; volumeView.showsRouteButton = NO; volumeView.showsVolumeSlider = NO; [self.view addSubview:volumeView]; 

这也将初始化空的MPVolumeView (即没有RouteButton和VolumeSlider)。

有趣的是UISlider子视图(实际上是MPVolumeSliderMPVolumeSlider的子类)仍将在上面的enumerateObjectsUsingBlock找到。

这种方法也很有趣,因为您可以保存对volumeSlider的引用,并在以后使用它来设置代码或自定义控件的卷:

初始化并添加到您的视图:

 MPVolumeView *volumeView = [MPVolumeView new]; volumeView.showsRouteButton = NO; volumeView.showsVolumeSlider = NO; [self.view addSubview:volumeView]; 

查找并保存对UISlider引用:

 __weak __typeof(self)weakSelf = self; [[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:[UISlider class]]) { __strong __typeof(weakSelf)strongSelf = weakSelf; strongSelf.volumeSlider = obj; *stop = YES; } }]; 

UIControlEventValueChanged添加目标操作:

 [self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged]; 

然后在更改卷(即通过硬件音量控件)时更新自定义控件:

 - (void)handleVolumeChanged:(id)sender { NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value); self.myCustomVolumeSliderView.value = self.volumeSlider.value; } 

并且:

 - (IBAction)myCustomVolumeSliderViewValueChanged:(id)sender { NSLog(@"set volume to: %f", self.myCustomVolumeSliderView.value); self.volumeSlider.value = self.myCustomVolumeSliderView.value; } 

希望这有助于某人(并且Apple不会从MPVolumeView中删除MPVolumeSlider)。

您必须使用applicationMusicPlayer而不是iPodMusicPlayer来设置系统音量:

 #import  musicPlayer = [MPMusicPlayerController applicationMusicPlayer]; musicPlayer.volume = 1; // max volume musicPlayer.volume = 0; // min volume (mute) musicPlayer.volume = 0.0625; // 1 bar on the overlay volume display 

Apple假设他们知道需要管理卷的每一种方式。

实际上,有些情况下我们想要改变音量的控制方式而不强迫用户在屏幕上设置音量滑块(闹钟和媒体播放器会立即浮现在脑海中)。 你可以参考一下

https://developer.apple.com/library/ios/documentation/mediaplayer/reference/MPVolumeView_Class/Reference/Reference.html

http://ios-blog.co.uk/tutorials/controlling-system-output-volume-with-the-mpvolumeview-class-part-one/