質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Unity

    4165questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • iOS

    4075questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Objective-C

    1198questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iPhoneのWifiとキャリアの電波強度をプログラムから取得したい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 448

Unityにてゲーム作成をしております、
UI上に現在のWIFIとキャリアの電波強度を表示したいという要望があるので、
Objective-Cのライブラリを作成しようと思っているのですが、
なかなかObjective-Cのコードを見つけられません。

プログラム上から電波強度を取得するにあたり、
知見をお持ちの方いらっしゃいましたらご助言いただけませんでしょうか?

下記のようなサイトは見つけたのですが、ここからどうやってライブラリに落とし込むか
がわかっていません。
Xcode|iPhoneのアンテナピクト・RSSI値を取得してみよう!

■環境
Unity:2018.1.6f1
Xcode:9.4

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

記載頂いているサイトのコードをそのまま実行した場合は、取得出来ないのでしょうか。
ライブラリに落とし込む というのは、具体的には何を求められているのでしょうか。
またどこまで実施してみたのでしょうか。

まずは状況を整理されるのが一番だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/12 14:23

    Unityからネイティブプラグインという機能を使って、.mmファイルのメソッドを呼び出し
    その中で電波強度を取得したものを、Unity側に返すという機能が求められています。

    Static Libraryで作ろうとしたのですが、UIApplication *app = [UIApplication sharedApplication];
    など、いろんな所でエラーが出てきたのでサンプルのソースを.mm から.mに移動させたのですが
    これをどうやって呼び出そうか?と.mm→.m→.mmと結果をもらって返す方法を模索しているところです。

    キャンセル

  • 2018/07/12 19:14

    状況は理解しましたが、もう少しだけ出来ることと出来ないことを整理したほうが良いように感じました。
    まずは、.mmから.mに移動させた理由も少し不明なのですがひとつひとつ理由を考えてみるようしたほうが良いと思います。(ハマっている時こそ、まずは整理して最初からゆっくりと。)
    問題解決だけ目的であれば、上記は不要ではあるのですが・・・。

    > Unityからネイティブプラグインという機能を使って、.mmファイルのメソッドを呼び出し
    > その中で電波強度を取得したものを、Unity側に返すという機能が求められています。

    キャンセル

  • 2018/07/13 20:20

    下記のような、Test1.mというソースを作ってみて、UnityからgetValueメソッドを呼び出して計算結果を
    取得する事はできました。

    ・・が、antennaBarメソッドの場合、
    NSArray *subviews = [[[apps valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; のところで下記エラーが出ました。
    解決方法を模索中です。

    ◼️エラー
    ProductName Uncaught exception: NSUnknownKeyException: [<UIStatusBar_Modern 0x109705cc0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key foregroundView.


    ◼️ソースコード
    //
    // Test1.m
    // Test1

    #import "Test1.h"

    @implementation Test1 : NSObject

    - (int) getValue:(int)nums
    {
    nums = nums + 100;

    return nums;
    }

    - (int)antennaBar
    {

    NSLog(@"antennaBar 1");
    UIApplication *apps = [UIApplication sharedApplication];
    NSLog(@"antennaBar 2");
    NSArray *subviews = [[[apps valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
    NSLog(@"antennaBar 3");
    NSString *dataNetworkItemView = nil;

    NSLog(@"antennaBar 4");
    for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) {
    dataNetworkItemView = subview;
    break;
    }
    }
    NSLog(@"antennaBar 5");

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

    @end

    キャンセル

  • 2018/07/17 09:13

    NSUnknownKeyException と書かれているので、指定したキーに該当する要素が見つからないということだと思います。
    statusBarかforegroundViewだと思いますが、この辺りはデバッグしてひとつひとつ確認すると確認出来ると思います。

    キャンセル

  • 2018/07/17 10:36 編集

    投稿後、調査を重ねて下記のようなソースによって、
    ステータスバーをループで回す事はできるのですが。

    最下部に貼ったログのように、UIStatusBarSignalStrengthItemView と
    _UIStatusBarCellularSignalView のIF文の中には入って来ず
    アンテナバーを取得する事ができませんでした。

    何か権限のようなものが必要なのでしょうか?


    ◼️ソースコード

    - (int)antennaBar
    {

    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(@"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;
    }


    ◼️コンソールログ

    1
    2
    3
    4
    5
    7
    8
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    cccccc
    cccccc
    cccccc
    cccccc
    cccccc
    cccccc
    9
    12345
    23456
    34567
    45678
    56789
    56789
    56789
    56789
    56789
    56789

    キャンセル

  • 2018/07/19 09:11

    subviewsに何が入っているのかは確認済みでしょうか。

    キャンセル

  • 2018/07/22 14:13

    全てUIViewでした。
    下記、スタックオーバーフローで同じような質問をしたところ
    iOS11から取得できなくなったとの事でした。
    そして、そもそもPrivateAPIをリリースアプリイ入れる事自体、
    アップルが認めていない事が調べてわかりました。

    電波強度を取得する機能を削る方向で調整してみる事にしました。

    ■stackoverflow
    https://stackoverflow.com/questions/51373873/why-can-not-i-get-uistatusbarsignalstrengthitemview/51374928?noredirect=1#comment89755746_51374928

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    4165questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • iOS

    4075questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Objective-C

    1198questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。