iOS アプリ開発に関連するトピックを提供しています。

センターデータを可視化する VisualizationKit

Android の AR Sensor というアプリに触発され、iOS でも同様にセンサーデータを可視化するためのコードを公開しました。

github.com

AR Sensor と同じように、Wifi、Cellular、磁気、Bluetooth の強度を検出し ARKit を使用して空間上に球体を配置します。計測ボタンを押すと一定時間ごとに強度を計測するので、端末を適度に動かし続ければ綺麗に可視化することができます。

https://github.com/watanabetoshinori/VisualizationKit/raw/master/Preview/Preview1.png

Wifi 強度の取得

残念ながら iOS では Wifi *1や Cellular の電波強度を取得する方法に制限があるため、AR Sensor と同レベルの可視化にまでは到達できていません。現在は、端末上部のステータスバーに表示されているアンテナ画像を参照して Wifi 強度を取得しています。不思議なことに、iPhone X や XS などのノッチのある端末よりも、従来のノッチのない端末の方がより正確な値を取得できるようです。

private func getWiFiNumberOfActiveBars() -> Int? {
        guard let containerBar = UIApplication.shared.value(forKey: "statusBar") as? UIView else {
            return nil
        }
        
        guard let statusBarMorden = NSClassFromString("UIStatusBar_Modern"),
            containerBar.isKind(of: statusBarMorden),
            let statusBar = containerBar.value(forKey: "statusBar") as? UIView else {
                return nil
        }
        
        guard let foregroundView = statusBar.value(forKey: "foregroundView") as? UIView else {
            return  nil
        }
        
        var numberOfActiveBars: Int?
        
        for view in foregroundView.subviews {
            for v in view.subviews {
                if let statusBarWifiSignalView = NSClassFromString("_UIStatusBarWifiSignalView"), v .isKind(of: statusBarWifiSignalView) {
                    if let val = v.value(forKey: "numberOfActiveBars") as? Int {
                        numberOfActiveBars = val
                        break
                    }
                }
            }
            
            if let _ = numberOfActiveBars {
                break
            }
        }
        
        return numberOfActiveBars
    }

*1:未検証ですが NetworkExtension を使用すればより詳細な Wifi 強度を取得できるかもしれません