为啥我无法获取 UIStatusBarSignalStrengthItemView?

Posted

技术标签:

【中文标题】为啥我无法获取 UIStatusBarSignalStrengthItemView?【英文标题】:Why can not I get UIStatusBarSignalStrengthItemView?为什么我无法获取 UIStatusBarSignalStrengthItemView? 【发布时间】:2018-12-24 17:06:00 【问题描述】:

为了获取 iphone 上的 wifi 或蜂窝信号强度, 我编写了以下代码作为各个站点的参考, 但它没有出现在 IF 声明中 “UIStatusBarSignalStrengthItemView”或“_UIStatusBarCellularSignalView”。

您需要许可吗?

■开发环境

Xcode9.4.1

iPhoneX ios:11.0.1

■Test1.m

#import "Test1.h"
@implementation Test1 : NSObject 

- (int)antennaBar


    NSLog(@"%@",[[[UIApplication sharedApplication]     valueForKeyPath:@"statusBar"] subviews]);

    NSLog(@"antennaBar 1");
    NSLog(@"antennaBar 2");
//    NSArray *subviews = [[[apps valueForKey:@"statusBar"]     valueForKey:@"foregroundView"] subviews];
    NSArray *subviews = nil;
    NSLog(@"antennaBar 3");
    id statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
    NSLog(@"antennaBar 4");
    if ([statusBar isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) 
        NSLog(@"antennaBar 5");
    subviews = [[[statusBar valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
 else 
    NSLog(@"antennaBar 6");
    subviews = [[statusBar valueForKey:@"foregroundView"] subviews];

NSLog(@"antennaBar 7");
NSString *dataNetworkItemView = nil;

NSLog(@"antennaBar 8");
for (id subview in subviews) 

    NSLog(@"Class - %@", NSStringFromClass([subview class]));

    NSLog(@"antennaBar aaaaaaa");
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) 
        NSLog(@"antennaBar bbbbbb");
        dataNetworkItemView = subview;
        break;
    
    if([subview isKindOfClass:[NSClassFromString(@"_UIStatusBarCellularSignalView") class]]) 
        NSLog(@"antennaBar eeeeee");
        dataNetworkItemView = subview;

        int fffff = [subview valueForKey:@"numberOfActiveBars"];
        NSLog(@"fffff=%d",fffff);
        break;
    


for (id subview in subviews)

    NSLog(@"antennaBar cccccc");
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]])
    
        NSLog(@"antennaBar dddddd");
        [(NSNumber*)[subview valueForKey:@"dataNetworkType"] intValue];
    


NSLog(@"antennaBar 9");


NSLog(@"12345");
id statusBaraaaa = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
NSArray *children = nil;
NSLog(@"23456");
children = [[[statusBaraaaa valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
NSLog(@"34567");
int type = 0;
NSLog(@"45678");
for (id child in children) 
    NSLog(@"56789");
    if ([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) 
        NSLog(@"67890");
        type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
    


if (type == 0) 
    return NO;
else
    return YES;


int aaa = [[dataNetworkItemView valueForKey:@"signalStrengthBars"] intValue];


NSLog(@"aaa=%d",aaa);

return aaa;


@end

■Test1.h

#import <Foundation/Foundation.h>
#import "UIKit/UIKit.h"

@interface Test1 : NSObject
- (int)antennaBar;
@end

■注销

( "<_uistatusbar: region="\n" bottomleading='\"<_UIStatusBarRegion:' identifier="bottomLeading," enabled="1," displayitems="(\n)">\";\n expandLeading = \"<_uistatusbarregion: : identifier="expandedLeading," enabled="0," displayitems="(\n)">\";\n expandTrailing = \"<_uistatusbarregion: identifier="expandedTrailing," enabled="0," displayitems="(\n)">\ ";\nleading = \"<_uistatusbarregion: identifier="leading," enabled="1," displayitems="(\n" item="<_UIStatusBarTimeItem:">, view=<_uistatusbarstringview: frame="(14.3333" text="12:10" userinteractionenabled="NO;" layer="<_UILabelLayer:">>>\n)>\";\n 丸 = \"<_uistatusbarregion: identifier="pill," enabled="0," displayitems="(\n)">\";\n systemUpdates = \"<_uistatusbarregion:>

1

2

3

4

5

7

8

类 - UIView

啊啊啊啊

类 - UIView

啊啊啊啊

类 - UIView

啊啊啊啊

类 - UIView

啊啊啊啊

类 - UIView

啊啊啊啊

类 - UIView

啊啊啊啊

cccccc

cccccc

cccccc

cccccc

cccccc

cccccc

9

12345

23456

34567

45678

56789

56789

56789

56789

56789

56789

【问题讨论】:

【参考方案1】:

虽然通过检查状态栏视图层次结构来获取信号强度在某些早期版本的 iOS 中有效,但从 iOS 11 开始不再有效。 此外,依赖内部观点是(并且一直是)在应用商店审核过程中被拒绝的理由。

不支持获取蜂窝信号强度的方法。来源:comment on Apple Developer Forum。 获取 WiFi 信号强度的唯一受支持方法是使用 NEHotspotNetwork signalStrength 属性。 但此属性仅适用于热点助手应用和requires a special entitlement。

【讨论】:

确实,您不能从电信公司获得无线电波,是吗?又因为会被拒绝,是不是禁止发布申请?为什么会听到这样的事情,因为导演必须明白这个功能是不能用的。 我不为 Apple 工作,但是很明显这是故意的,如果他们愿意,他们可以轻松地提供这样的 API。只是好奇,你需要信号强度做什么? 我是一名工程师,同时从事多个玩家的游戏项目。为了让您享受比赛,似乎有意不让它在无线电波较弱的区域播放。因此,有一个规范在屏幕上显示无线电场强。我正在调查以实现这一点。 您应该连接到游戏服务器并测试连接的好坏(延迟、下载、上传速度),而不是依赖信号强度。 谢谢,我向导演那边提议,没有获取信号强度的功能。【参考方案2】:

您可以检索活跃的酒吧数量、可能的酒吧数量以及用户是否连接到 wifi 或蜂窝网络。 (我相信这就是“模式”属性/ iVar 的用途。)

我使用了 inactive 和 activeColor 方法来根据信号强度设置 wifi 和蜂窝数据的颜色,而不使用活动条的数量,因为它是直观表示的。当然,我在越狱的设备上做了一个调整,使用这个 API 而不很好地隐藏它可能会让你的应用程序被拒绝。但无论如何,请尝试 _UIStatusBarSignalView 以获取您需要的信息(当然仅用于测试目的)。我认为这仅适用于现代状态栏/iPhone X 类型。

    @interface _UIStatusBarSignalView : UIView <_UIStatusBarDisplayable> 
BOOL _smallSize;
BOOL _visible;
long long _numberOfBars;
long long _numberOfActiveBars;
long long _signalMode;
UIColor* _inactiveColor;
UIColor* _activeColor;

 

 @property (assign,nonatomic) long long numberOfBars;                                                            
 //@synthesize numberOfBars=_numberOfBars - In the implementation block
 @property (assign,nonatomic) long long numberOfActiveBars; 
/* You can use this compared to the output of numberOfBars property to get a     
good idea of signal strength. */
//@synthesize numberOfActiveBars=_numberOfActiveBars - In the implementation    
//block
@property (assign,nonatomic) long long signalMode;  
 //...(more to the interface)
@end  

完整的界面可以在这里找到,我可以确认它适用于 iPhone X 的 iOS 12.4,即使类转储来自 11.1.2。 http://developer.limneos.net/?ios=11.1.2&framework=UIKit.framework&header=_UIStatusBarSignalView.h

【讨论】:

以上是关于为啥我无法获取 UIStatusBarSignalStrengthItemView?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法获取 GetType() 的 MethodBody?

为啥我无法使用 DirectInput 获取键盘?

为啥Android有时无法获取位置

为啥我无法从此 jsonp 响应中获取位置?

为啥我无法在 Web Api 中获取标头?

为啥我无法从 ajax 发布请求中获取操作