7

我最近将我的 VoIP 应用程序迁移到了 iOS7,但仍然存在一个我无法理解的开放错误。

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

现在,在iOS7中,我只能将声音降低到零之前的最后一步,这意味着音量不能静音。

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

有谁知道怎么回事?

4

3 回答 3

3

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

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

苹果推荐使用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子视图(实际上是MPVolumeSlider的子类UISlider)仍然会在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)。

于 2014-03-02T15:32:47.647 回答
2

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

#import <MediaPlayer/MediaPlayer.h>
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/

于 2013-11-15T09:53:25.163 回答
2

我的 VoIP 应用程序也有同样的问题...

我的解决方案:一切设置好后,将类别设置为播放,

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

然后将其设置回PlayAndRecord,

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

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

于 2014-08-04T18:52:09.630 回答