【问题标题】:How to get wifi signal strength using [[UIApplication sharedApplication] valueForKey:@"statusBar"] on ios13?如何在 ios13 上使用 [[UIApplication sharedApplication] valueForKey:@"statusBar"] 获取 wifi 信号强度?
【发布时间】:2019-08-09 20:12:20
【问题描述】:

由于未捕获的异常 'NSInternalInconsistencyException' 导致 [[UIApplication sharedApplication] valueForKey:@"statusBar"] 行发生崩溃,原因:'App 在 UIApplication 上调用了 -statusBar 或 -statusBarWindow。必须更改此代码,因为不再有状态栏或状态栏窗口。

但没有提到如何获取 wifi 信号强度或其他状态栏信息,如网络栏。 如果有任何其他 API 或方法可以获取这些信息,有人可以建议我吗?

【问题讨论】:

  • [[UIApplication sharedApplication] valueForKey:@"statusBar"] 等代码从未有效。永远不要试图深入研究类的私有 API。随着时间的推移,它永远不会结束。
  • 你知道有什么方法可以让所有信息出现在 iPhone 状态栏上吗?

标签: crash wifi statusbar ios13


【解决方案1】:
    UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
    if ([statusBarManager respondsToSelector:@selector(createLocalStatusBar)]) {
        UIView *_localStatusBar = [statusBarManager performSelector:@selector(createLocalStatusBar)];
        if ([_localStatusBar respondsToSelector:@selector(statusBar)]) {
            _statusBar = [_localStatusBar performSelector:@selector(statusBar)];
            NSLog(@"?%@",[[[[_statusBar valueForKey:@"_statusBar"] valueForKey:@"_currentAggregatedData"] valueForKey:@"_wifiEntry"] valueForKey:@"displayValue"]);
        }
    }

【讨论】:

  • 您好,请阅读 stackoverflow 指南并修改您的答案。由于您还需要解释答案,因此仅发布代码不是一个好方法。
【解决方案2】:
    id statusBar;
    if (@available(iOS 13.0, *)) {
        UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
        if ([statusBarManager respondsToSelector:@selector(createLocalStatusBar)]) {
            UIView *localStatusBar = [statusBarManager performSelector:@selector(createLocalStatusBar)];
            if ([localStatusBar respondsToSelector:@selector(statusBar)]) {
                statusBar = [localStatusBar performSelector:@selector(statusBar)];
            }
        }

        if (statusBar) {
            id currentData = [[statusBar valueForKeyPath:@"_statusBar"] valueForKeyPath:@"currentData"];
            id wifiEntry = [currentData valueForKeyPath:@"wifiEntry"];
            id cellularEntry = [currentData valueForKeyPath:@"cellularEntry"];
            if (wifiEntry && [[wifiEntry valueForKeyPath:@"isEnabled"] boolValue]) {
                signalStrength = [[wifiEntry valueForKeyPath:@"displayValue"] intValue];
                signalStrength = signalStrength == 3 ? 4 : signalStrength;
            } else if (cellularEntry && [[cellularEntry valueForKeyPath:@"isEnabled"] boolValue]) {
                signalStrength = [[cellularEntry valueForKey:@"displayValue"] intValue];
            }
        }
        return signalStrength;
    }

【讨论】:

  • 以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2013-09-20
  • 2015-05-13
  • 1970-01-01
相关资源
最近更新 更多