Почему я не могу получить UIStatusBarSignalStrengthItemView?

Чтобы получить уровень сигнала Wi-Fi или сотовой связи на iphone, я написал следующий код в качестве справочного материала для различных сайтов, но он не входит в оператор 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: 0x14e809020: region={\n bottomLeading = \"‹_UIStatusBarRegion: 0x1d013bd00: идентификатор=bottomLeading, enabled=1, displayItems={(\n)}>\";\n extendedLeading = \"‹_UIStatusBarRegion: 0x1d013bbc0: идентификатор=expandedLeading, enabled=0, displayItems={(\n)}>\";\n expandTrailing = \"‹_UIStatusBarRegion: 0x1d013bc60: идентификатор=expandedTrailing, enabled=0, displayItems={(\n)}> \";\n ведущий = \"‹_UIStatusBarRegion: 0x1d013b940: идентификатор=ведущий, включенный=1, displayItems={(\n ‹_UIStatusBarDisplayItem: 0x1d019b450: идентификатор=_UIStatusBarTimeItem.shortTimeDisplayIdentifier, item=‹_UIStatusTimeStatarTimeItem: 0x1d046c идентификатор , view=‹_UIStatusBarStringView: 0x14e825ae0; frame = (14.3333 3.66667; 38.3333 18); text = '12:10'; userInteractionEnabled = NO; layer = ‹_UILabelLayer: 0x1d0281f40>>>\n)}>\";\n таблетка = \"‹_UIStatusBarRegion: 0x1d013b8a0: идентификатор=таблетка, включено=0, displayItems={(\n)}>\";\n systemUpdates = \"‹_UIStatusBarRegion: 0x1d0

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


person user3732298    schedule 17.07.2018    source источник


Ответы (2)


Получение уровня сигнала путем проверки иерархии представлений в строке состояния работало в некоторых предыдущих версиях iOS, что больше не работает с iOS 11. Кроме того, использование внутренних представлений является (и всегда было) основанием для отклонения в обзоре магазина приложений. процесс.

Нет поддерживаемого способа получить уровень сигнала сотовой связи. Источник: комментарий на форуме разработчиков Apple. Единственный поддерживаемый способ получить мощность сигнала Wi-Fi – использовать NEHotspotNetwork signalStrength собственность. Но это свойство доступно только для вспомогательных приложений точки доступа, и для требуется специальное разрешение.

person guru_meditator    schedule 17.07.2018
comment
Действительно, вы не можете получить радиоволны от телекоммуникационной компании, не так ли? И поскольку оно будет отклонено, запрещено ли выпускать приложение? К чему такое слышать, так это потому, что директор должен понимать, что эту функцию использовать нельзя. - person user3732298; 17.07.2018
comment
Я не работаю в Apple, но да, понятно, что это намеренно, они могли бы легко предоставить такой API, если бы захотели. Просто любопытно, для чего вам нужен уровень сигнала? - person guru_meditator; 17.07.2018
comment
Я инженер в игровом проекте нескольких игроков одновременно. Кажется, есть намерение не позволять ему играть в местах, где радиоволны слабы, чтобы вы наслаждались матчем. Поэтому существует спецификация для отображения напряженности радиополя на экране. И я исследую, чтобы понять это. - person user3732298; 17.07.2018
comment
Вместо того, чтобы полагаться на силу сигнала, вы должны подключиться к игровому серверу и проверить, насколько хорошо соединение (задержка, скорость загрузки, загрузки). - person guru_meditator; 18.07.2018
comment
Спасибо, я предложил директору, нет функции получения уровня сигнала. - person user3732298; 22.07.2018

Вы можете получить количество активных баров, сколько их возможно и подключен ли пользователь к Wi-Fi или сотовой связи. (Я считаю, что для этого предназначено свойство «режим» / iVar.)

Я использовал методы inactive и activeColor для установки цветов Wi-Fi и сотовых данных в зависимости от силы сигнала, не используя количество активных полос, потому что это визуально представлено. Конечно, я на взломанном устройстве и сделал его в качестве настройки, и использование этого 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  

Полный интерфейс можно найти здесь, и я могу подтвердить, что он работает на iOS 12.4 для iPhone X, хотя дамп класса взят из 11.1.2. http://developer.limneos.net/?ios=11.1.2&framework=UIKit.framework&header=_UIStatusBarSignalView.h

person i0s_tweak3r    schedule 14.09.2019