在 iOS 8 中隐藏音量 HUD

Posted

技术标签:

【中文标题】在 iOS 8 中隐藏音量 HUD【英文标题】:Hide volume HUD in iOS 8 【发布时间】:2014-10-10 14:52:05 【问题描述】:

ios 8 之前的版本中,有一个隐藏系统音量覆盖的简单技巧。您只需创建一个MPVolumeView 并将其嵌入到您的视图层次结构中的某个位置。这在https://***.com/a/7888977/3943258 和许多其他 Stack Overflow 响应中都有记录。

但是,我发现这个技巧在 iOS 8 中似乎不起作用。我正在努力想办法解决它。有人知道在 iOS 8 中是否有办法做到这一点?

值得注意的是,我正在执行此操作的应用程序有一个活动的AVCaptureSession,而我正在尝试隐藏 HUD(音量按钮充当相机上的快门)。不知道会不会有副作用。

【问题讨论】:

【参考方案1】:

好的,这滥用了私有 API,但我发现它可以工作。

- (void)setVolumeHidden:(BOOL)hidden

    NSString *str1 = @"etSystemV";
    NSString *str2 = @"eHUDEnabled";
    NSString *selectorString = [NSString stringWithFormat:@"s%@olum%@:forAudioCategory:", str1, str2];
    SEL selector = NSSelectorFromString(selectorString);

    if ([[UIApplication sharedApplication] respondsToSelector:selector]) 
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIApplication instanceMethodSignatureForSelector:selector]];
        invocation.selector = selector;
        invocation.target = [UIApplication sharedApplication];
        BOOL value = !hidden;
        [invocation setArgument:&value atIndex:2];
        __unsafe_unretained NSString *category = @"Ringtone";
        [invocation setArgument:&category atIndex:3];
        [invocation invoke];
    

【讨论】:

我的应用会因为使用这种方法而被拒绝吗? 如果 Apple 发现它就可以,但它的混淆方式使其不太可能。 @TimJohnsen,你能解释一下你的代码在做什么吗?谢谢。 这段代码调用了内部的setSystemVolumeHUDEnabledForAudioCategory: 方法,该方法不是公开的,Apple 无法检测到。 这非常适合隐藏 HUD,但是如果您想知道何时按下音量按钮怎么办:听 AVSystemController_SystemVolumeDidChangeNotification 不再起作用了【参考方案2】:

在 iOS 9 中使用 MPVolumeView 有效。

let systemVolumeView = MPVolumeView(frame: CGRectMake(-500, -100, 0, 0))
view.addSubview(systemVolumeView)

【讨论】:

不幸的是,我似乎无法让它工作,是否有任何其他设置我可能会丢失?谢谢 @trdavidson 你是说系统的音量HUD还在上吗?您确定 MPVolumeView 在屏幕视图层次结构中吗? 是的,我初始化 MPVolumeView 甚至不断调用刷新方法以确保它在视图层次结构中。然而,HUD 显示 50% 的时间,这很奇怪。有什么想法吗? 我唯一能想到的是我的应用程序有一个活动的音频会话,它观察 AVAudioSession 的 outputVolume 属性。不确定这会影响它,但值得一试。 知道了,好的,让我看看那里,如果我找到解决方案,我会报告!【参考方案3】:

简化一点的解决方案:

#import <UAObfuscatedString/UAObfuscatedString.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
SEL selector = NSSelectorFromString(NSMutableString.string.s.e.t.S.y.s.t.e.m.V.o.l.u.m.e.H.U.D.E.n.a.b.l.e.d.colon.f.o.r.A.u.d.i.o.C.a.t.e.g.o.r.y.colon);
if ([[UIApplication sharedApplication] respondsToSelector:selector]) 
    [[UIApplication sharedApplication] performSelector:selector withObject:@NO withObject:@"Ringtone"];

#pragma clang diagnostic pop

【讨论】:

以上是关于在 iOS 8 中隐藏音量 HUD的主要内容,如果未能解决你的问题,请参考以下文章

隐藏和显示音量指示器

使用 Swift 以编程方式设置设备音量时隐藏音量 Hud

iPhone如何在按下音量键时隐藏音量覆盖

用 MPMusicPlayerController 防止音量 HUD 出现,可以接受吗?

在 Unity3D 游戏中自定义 iOS 音量 HUD

[IOS] 监听音量变化监听音量按键及隐藏系统音量UI