Xcode|iPhoneのアンテナピクト・RSSI値を取得してみよう!

スポンサーリンク
Objective-C

20160608_001

Xcode無料だしiPhoneも所有しているなら、好きなコードを書いていいろんな機能を動作させて好きなように使ってみませんか?

と、言ってもちょっとリファレンスに書いてないので???ですが、わかってしまえば超簡単です!

遊ぼうぜ! Xcode

遊んだ環境

Xcode 7.3.1
Mac OS X 10.11.5
iPhone5s iOS9.3.2

初級編

まずは、初級編

アンテナピクト数を取得する

今、表示しているアンテナピクトの数はいくつ?

20160608_002

ピクト数(丸の数)は5個ですね、どうしたら5の値が取得できるか?
Appleのクラスリファレンスには載っていません、

ではどうする?

画面をキャプチャーして数えてみますか?

それでは大変ですよね?

実は、簡単に取得できてしまうんですよね

では、コードです。

- (NSInteger )antennaBar {
    UIApplication *app = [UIApplication sharedApplication];
    NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
    NSString *dataNetworkItemView = nil;
    
    for (id subview in subviews) {
        if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) {
            dataNetworkItemView = subview;
            break;
        }
    }
    
     return  [[dataNetworkItemView valueForKey:@"signalStrengthBars"] intValue];
}

どうですか?

よく見るとわかりますね、そうなんですこんな所に隠れていたんですよ!

RSSI値を取得する

RSSIて何?

FieldTestMode知っていますか?

電話アプリで *3001#12345#* と電話するとFieldTestModeに入りアンテナピクトが数字に変わります。これがRSSIで受診している電波の強さです。

20160608_003

-89がRSSIになります。

これも、アンテナピクトと同じ

- (NSInteger )radioRssi {
    UIApplication *app = [UIApplication sharedApplication];
    NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
    NSString *dataNetworkItemView = nil;
    
    for (id subview in subviews) {
        if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) {
            dataNetworkItemView = subview;
            break;
        }
    }
    
    return  [[dataNetworkItemView valueForKey:@"signalStrengthRaw"] intValue];
}

これで取得できます。

バッテリー残量値を取得する

ステータスバーといえばもう一つ毎日気にしている値がありますよね?
そう、バッテリー残量値を取得します

- (NSInteger)batteryCapacity {
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
NSString *dataNetworkItemView = nil;

for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarBatteryItemView") class]]) {
dataNetworkItemView = subview;
break;
}
}

return [[dataNetworkItemView valueForKey:@"capacity"] intValue];
}

これで取得できてしまいます。

中級編

楽しくなってきましたか?
次は中級編です。

アプリでBluetoothのON/OFFをやっちゃいましょう!

Bluetooth ON

まずは、BluetoothをONにする方法

NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/BluetoothManager.framework"];
BOOL success = [b load];

Class BTDeviceSupport = NSClassFromString(@"BluetoothManager");
id si = [BTDeviceSupport valueForKey:@"sharedInstance"];

[si setEnabled:YES];

なんか??ですよね、説明なしに次行きます。

Bluetooth OFF

OFFです。

NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/BluetoothManager.framework"];
BOOL success = [b load];

Class BTDeviceSupport = NSClassFromString(@"BluetoothManager");
id si = [BTDeviceSupport valueForKey:@"sharedInstance"];

[si setEnabled:NO];

では、簡単に説明します。

フレームワークのファイルを読み込んんでインスタンス化してしてsetEnabledにYES/NOを入れてあげれば、bluetoothがONしたりOFFしたりします。

 

まとめ

どうですか?うまく動作しましたか?
凄く楽しかったでしょう!

なんだ!このメソッド名は?プロパティは?と思いましたか?
謎が多くてワクワクしちゃいましたか?

もっとやりたくなったらclass-dumpで検索すると沢山出てきますので、ぜひ挑戦してみてください。

やっぱ、ちょっと道を外れると楽しいですよね!

サンプルコード

サンプルコードをgithubにあげておきましたので参考にどうぞ。

■Status bar value
https://github.com/Hikaruapp/iOS-statusbarvalue

■Bluetooth Switch
https://github.com/Hikaruapp/iOS-BluetoothSwitch

コメント

タイトルとURLをコピーしました