之前寫過runtime的一些東西,這次通過runtime獲取一些蘋果官方不想讓你拿到的東西,比如,狀態列內部的控制項屬性。本文將通過runtime帶你一步步拿到狀態列中顯示網路狀態的控制項,然後通過監測該控制項的屬性來獲取當前精確網路狀態,比如2g/3g/4g/wifi。
首先,我們需要拿到狀態列,然後通過runtime去**狀態列內部的組成結構。
1、匯入執行時標頭檔案
#import "objc/message.h2、編寫執行時**,獲取到當前應用程式的所有成員變數
#import "viewcontroller.h"
#import "objc/message.h"
@inte***ce viewcontroller ()
@end
@implementation viewcontroller
} @end
直接執行,可以看到列印結果為:
}執行後可以看到列印結果為:
4、狀態列裡有foregroundview這個成員,應該代表著所有當前顯示的檢視,通過kvc取出它裡面的所有子檢視
for (id child in children)
列印結果為:
5、遍歷陣列,取出用於顯示網路狀態的檢視,並遍歷其內部的所有成員變數
for (id child in children) }}
列印結果為:
6、下面通過kvc,取出datanetworktype
if ([child iskindofclass:nsclassfromstring(@"uistatusbardatanetworkitemview")])列印結果為:
可見,datanetworktype型別是nsnumber,值是5。【以上均為模擬器測試】
經過測試,發現,可能的值為 1,2,3,5 分別對應的網路狀態是2g、3g、4g及wifi。 當沒有網路時,隱藏uistatusbardatanetworkitemview,無法獲取datanetworktype值
總結:以下是完整的**,並經過真機測試:
}nslog(@" class="----%d", type);
}列印出的type數字對應的網路狀態依次是 : 0 - 無網路 ; 1 - 2g ; 2 - 3g ; 3 - 4g ; 5 - wifi
建議: 將獲取的uistatusbardatanetworkitemview儲存起來,定時去取它的datanetworktype,這樣就可以實時監控網路狀態啦(kvo在這裡是行不通的喲)
當然,此方法存在一定的侷限性,比如當狀態列被隱藏的時候,無法使用此方法。
iOS開發 runtime機制
runtime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於c語言,函式的呼叫在編譯的時候會決定呼叫哪個函式 c語言的函式呼叫請看這裡 編譯完成之後直接順序執行,無任何二義性。oc的函式呼叫成為訊息傳送。屬於動態呼叫過程。在編譯的時候並不能決定真正呼叫哪個函式 事實證明,在...
iOS開發中runtime的使用
事實證明 1.傳送訊息 implementation viewcontroller void viewdidload end implementation uiimage image 載入分類到記憶體的時候呼叫 void load 注意 不能在分類中重寫系統方法imagenamed,因為會把系統的功...
iOS開發 runtime的基本使用
runtime的基本使用 1,動態改變例項變數的值 2,交換方法 3,動態新增方法 4,使用runtime為分類新增屬性 1,動態改變例項變數的值 1,動態改變屬性值 void change value name 3,動態新增方法 3,使用runtime 動態新增方法 void add method...