2010-01-07 27 views
8

對於我的個人項目,我試圖檢索iPhone WiFi信號強度。我完全意識到,這是在沒有證件的善良之地,所以請避免從「沒有AppStore」的答案。 :)訪問和使用MobileWiFi.framework

Anywho,我一直在閱讀以前的WiFi網絡掃描儀應用程序(WiFi Stumbler),但恐怕大多數(如果不是全部)反映了過時的SDK文檔。希望這個問題也能爲最新的iPhone SDK 3.1.2提供一些集中/有見地的材料。

這裏是我的不完整/不工作代碼:

.H

void *libHandle; 
void *airportHandle; 
int (*open)(void *); 
int (*bind)(void *, NSString *); 
int (*close)(void *); 
int (*scan)(void *, NSArray **, void *); 

.M

libHandle = dlopen("/System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi",RTLD_LAZY); 

open = dlsym(libHandle, "Apple80211Open"); 
bind = dlsym(libHandle, "Apple80211BindToInterface"); 
close = dlsym(libHandle, "Apple80211Close"); 
scan = dlsym(libHandle, "Apple80211Scan"); 

open(&airportHandle); 
bind(airportHandle, @"en0"); 

NSLog(@"Result %@",libHandle); 

當設備上運行時,它會產生我不斷所謂最喜歡...

異常類型:EXC_BAD_ACCESS(SIGSEGV)

我在想動態加載調用,不加載任何東西。目錄:/System/Library/PrivateFrameworks/僅列出了沒有二進制文件或別名的Info.plist文件。

大概做了一些非常錯誤的事情(錯誤的目錄?)...感謝任何幫助!

另外,作爲跟進。要提取WiFi信息,可能需要執行以下操作:

GetInfoCopy = dlsym(libHandle, "Apple80211GetInfoCopy"); 

而我的問題是1)有沒有人對此有任何好運? 2)你如何獲得一個標題轉儲,就像我在Objective-C庫上使用類轉儲(因爲MobileWifi在C中)?

回答

8

對於任何人誰在跌倒這個問題,這是我的圖書館訪問802.11網絡。儘管Apple宣稱拒絕任何使用私有框架的應用程序,但AppStore上有幾個封閉的WiFi應用程序。使用風險自負。

該庫適用於iPhone SDK 3.1.2。

用途:

SOLStumbler *networksManager = [[SOLStumbler alloc] init]; 
[networksManager scanNetworks]; 

結果:

一個信息的NSDictionary的網絡的NSDictionary。

使用CFShow來瀏覽返回的包含信息的指針。或者調用樣本輸出的描述方法。

+2

被警告。最近,蘋果一直在強制刪除WiFi掃描儀。 – Rev316 2010-03-08 17:04:09

+0

嗨,我在這個代碼中獲取EXC_BAD_ACCESS ... :( – Rajneesh071 2012-08-06 10:18:07

+0

它不存在WiFiManager。bundle/WiFiManager - >破解應用程序 – vualoaithu 2014-04-21 01:53:01

2

我不確定這是否會出現問題,但open/close/bind是已經在使用的名稱(標準C庫)。

該二進制文件不存在,因爲它存儲在dyld shared_cache中(dlopen會成功,因爲該庫在技術上'加載'。然而,我注意到,當你從dl *函數中檢索它們時,你沒有檢查任何libHandle,open,close,bind或scan是否有效。

+0

足夠接近,但良好的通話。 – Rev316 2010-01-09 00:10:47

4

這些Apple80211xxx函數在MobileWiFi.framework中不存在(您可以使用'nm'工具檢查SDK二進制文件)。

(此外,這是不可能的傾倒從二進制C頭,因爲所有類型的信息在編譯過程中去除。你需要扭轉自己的工程,或等待別人這樣做。)

5

更新爲2012年7月(安裝iOS 5.0)的

你正在嘗試使用的代碼是很老。這些東西(例如WiFiManagerMobileWiFi)位於私人框架中。這意味着蘋果可以並經常改變它,或者從操作系統版本轉移到版本。

我在MobileWifi框架上運行nm,並沒有看到任何這些函數名稱。所以,我認爲這就是爲什麼你的代碼失敗。

$ PWD /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/PrivateFrameworks/MobileWiFi.framework

$納米MobileWiFi | grep的80211

$

我想這可能需要在實際設備框架上運行nm,但我沒有浪費我的時間,看着這之後:

Discussion of this framework, and follow-ons.

看起來您現在可以在IPConfiguration框架中找到等效(?)功能。試試這個代碼:

libHandle = dlopen("/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration", RTLD_LAZY); 

我跑了一個越獄的iOS 5.0.1的手機和它的工作(加載dylib,發現幾本Apple80211功能)。從我鏈接到的那個線程看來,您可能需要在越獄手機上安裝/Applications,才能完全正常工作。或者,可能不得不亂用增加一些權利到您的沙盒應用程序。

+0

它不適用於iPhone 5S操作系統7.1,我得到空 – vualoaithu 2014-04-21 01:54:40

+0

是的。通過這個字符串,它在* iOS 7 *上傳遞'if(libHandle == NULL &&(error = dlerror())!= NULL)'。 但不能使它工作。 'scanNetworks'沒有找到任何網絡。 – skywinder 2014-06-19 14:02:21

+0

@skywinder,'scanNetworks'因爲現在的代碼已經有4年了而失敗。正如我在我的回答中所描述的那樣,您必須使用新框架才能獲得相同的功能(並且至少iOS 5以後您必須使用該框架)。如果你試圖用iOS 7來做到這一點,我會推薦發佈[新問題](http://stackoverflow.com/questions/ask)。 – Nate 2014-06-20 08:49:35