2017-05-24 20 views
7

私はApp Storeにいなくても構わないので、プライベートAPIを使用して自分のニーズを満たすことに問題はありません。 私はMobileWiFi. framework to read the RSSI value for the wireless network the phone is currently connected to. I've included thehttps://github.com/Cykey/ios-reversed-headers/tree/c613e45f3ee5ad9f85ec7d43906cf69ee812ec6a/MobileWiFi `ヘッダーを作成し、ブリッジヘッダーを使用して迅速なプロジェクトに組み込み、コードを次のように記述しました。すみません、私は初心者です。プライベートAPIを使用するWiFi RSSIの値を読み取るには

import SystemConfiguration.CaptiveNetwork 
typealias _WiFiManagerClientCreate = @convention(c) (CFAllocator, CInt) -> UnsafeRawPointer 
typealias _WiFiManagerClientCopyDevices = @convention(c) (UnsafeRawPointer) -> CFArray 
typealias _WiFiDeviceClientCopyProperty = @convention(c) (UnsafeRawPointer, CFString) -> CFPropertyList 

if let libHandle = dlopen (Paths.ipConfiguration, RTLD_LAZY) { 
     result = libHandle.debugDescription 

     let _createManagerPtr = dlsym(libHandle, "WiFiManagerClientCreate") 
     let _clientCopyDevicesPtr = dlsym(libHandle, "WiFiManagerClientCopyDevices") 
     let _clientCopyPropertyPtr = dlsym(libHandle, "WiFiDeviceClientCopyProperty") 

     if (_createManagerPtr != nil) && (_clientCopyDevicesPtr != nil) && (_clientCopyPropertyPtr != nil) { 
      let _createManager = unsafeBitCast(_createManagerPtr, to: _WiFiManagerClientCreate.self) 
      let _clientCopyDevices = unsafeBitCast(_clientCopyDevicesPtr, to: _WiFiManagerClientCopyDevices.self) 
      let _clientCopyProperty = unsafeBitCast(_clientCopyPropertyPtr, to: _WiFiDeviceClientCopyProperty.self) 

      let manager = _createManager(kCFAllocatorDefault, 0) 
      let devices = _clientCopyDevices(manager) 
      let client = CFArrayGetValueAtIndex(devices, 0) 

      let data = _clientCopyProperty(client!, "RSSI" as CFString) 
      let rssi = CFDictionaryGetValue(data as! CFDictionary, "RSSI_CTL_AGR") 

      NSLog("RSSI: \(rssi)") 
     } 

     dlclose(libHandle) 
    } 
エラーを生成

fatal error: unexpectedly found nil while unwrapping an Optional value which stems from trying to call _createManager

答えて

6

私はこの回避策を使用して終了:いずれかの資格またはジェイルブレーキング

0

私はそれがiOSの最新バージョンのために可能ではないと思います。 iOS4のみ可能です。

+0

のGithubでdemo projectですが、資格が必要なの、それは非上で動作しますジェイルブレイク電話 –

+0

で動作するはずですので、それは動作しませんように思えますjailbrokenデバイス? – user2323838

+0

いいえ、実行に必要な権限を取得できないため –

3

なし

+ (int) wifiStrength { 
UIApplication *app = [UIApplication sharedApplication]; 
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; 
NSString *dataNetworkItemView = nil; 

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

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

ワークスiPhone Xでのステータスバーは、他のiPhoneと異なっているので、無線LANの情報を取得する方法が異なります。

文書化されていないプロパティ」で取得する方法はありますか?Appleが今後これらのプロパティを変更する可能性があります。 Appleが文書化されていないプロパティのを変更した場合、アプリケーションはクラッシュしますが、それに応じてコードを調整しませんでした。したがって、私たちはSwiftのNSExceptionを処理しなければなりません。

ヘッダーファイルを作成し、Bridging-Header.hに追加します。 あなたがhere:https://gist.github.com/zhihuitang/6d3de0963d96a552d47721a598ca79c8

// 
// OCCatch.h 
// 
// 

#ifndef OCCatch_h 
#define OCCatch_h 

// add the code below to your -Bridging-Header.h 

/** 
#import "OCCatch.h" 
*/ 

// How to use it in Swift? 
/** 
let exception = tryBlock { 
     let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView 
     //...... 
    } 
    if let exception = exception { 
    print("exception: \(exception)") 
    } 
*/ 

#import <Foundation/Foundation.h> 

NS_INLINE NSException * _Nullable tryBlock(void(^_Nonnull tryBlock)(void)) { 
    @try { 
     tryBlock(); 
    } 
    @catch (NSException *exception) { 
     return exception; 
    } 
    return nil; 
} 

#endif /* OCCatch_h */ 

iPhoneXでファイルを見つけることができ、我々はnumberOfActiveBarsが0 iPhoneX以外の他のiPhoneで 3の範囲でのWiFiの、我々はWiFiのRSSIを取得することができます得ることができます。

iPhoneXで

getWiFiNumberOfActiveBars()を使用してください:iPhoneX以外のiPhoneデバイスで

private func getWiFiNumberOfActiveBars() -> Int? { 
    let app = UIApplication.shared 
    var numberOfActiveBars: Int? 
    let exception = tryBlock { 
     guard let containerBar = app.value(forKey: "statusBar") as? UIView else { return } 
     guard let statusBarMorden = NSClassFromString("UIStatusBar_Modern"), containerBar .isKind(of: statusBarMorden), let statusBar = containerBar.value(forKey: "statusBar") as? UIView else { return } 

     guard let foregroundView = statusBar.value(forKey: "foregroundView") as? UIView else { return } 

     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 
      } 
     } 
    } 
    if let exception = exception { 
     print("getWiFiNumberOfActiveBars exception: \(exception)") 
    } 

    return numberOfActiveBars 
} 

を、getWiFiRSSI()を使用してください:

private func getWiFiRSSI() -> Int? { 
    let app = UIApplication.shared 
    var rssi: Int? 
    let exception = tryBlock { 
     guard let statusBar = app.value(forKey: "statusBar") as? UIView else { return } 
     if let statusBarMorden = NSClassFromString("UIStatusBar_Modern"), statusBar .isKind(of: statusBarMorden) { return } 

     guard let foregroundView = statusBar.value(forKey: "foregroundView") as? UIView else { return } 

     for view in foregroundView.subviews { 
      if let statusBarDataNetworkItemView = NSClassFromString("UIStatusBarDataNetworkItemView"), view .isKind(of: statusBarDataNetworkItemView) { 
       if let val = view.value(forKey: "wifiStrengthRaw") as? Int { 
        rssi = val 
        break 
       } 
      } 
     } 
    } 
    if let exception = exception { 
     print("getWiFiRSSI exception: \(exception)") 
    } 
    return rssi 
} 

これまでのところ私は、WiFi RSSIを取得する方法を発見していませんiPhoneXのあなたはそれを行う方法を知っている場合は、私にも教えてください。ありがとう。ここ

は私が構築するためのコードを取得するために管理

関連する問題