2017-07-02 30 views
4

我目前正在測試IOS的私有框架,目前我正試圖弄清楚如何檢查夜班是否啓用。作爲參考,我正在使用的頭文件位於here從頭文件中獲取實例函數

這裏是我使用下面的代碼:

if (!(NSClassFromString(@"CCUINightShiftSectionController"))) { 
      dlopen("System/Library/PrivateFrameworks/ControlCenterUI.framework/ControlCenterUI", RTLD_LOCAL); 
} 

    NSObject *manager = [NSClassFromString(@"CCUINightShiftSectionController") performSelector:NSSelectorFromString(@"_defaultFontTight")]; 

      NSLog(@" ok= %@", manager); 

     } 

從該文件中,我得到了數據_defaultFontTight中的NSLog就好了打印,但我正在掙扎是我該怎麼辦獲取實例功能?更具體地說,下面的所有內容都以-符號開始。我只能從+ 符號中獲得信息。

如果我是轉出_defaultFontTightenabled然後我得到如下:

2017-07-02 18:09:35.382109-0400 Testing[809:96270] +[CCUINightShiftSectionController enabled]: unrecognized selector sent to class 0x1b7d5e420 

任何幫助將不勝感激!

編輯:

我想下面這段代碼:

id myInstance =[NSClassFromString(@"CCUINightShiftSectionController") new]; 
[myInstance performSelector:NSSelectorFromString(@"enabled")]; 

對於一些框架,它得到的實例變量值成功地,而大部分只是返回null或錯誤,如[core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""

回答

1

如果您想調用實例方法,請嘗試先創建一個實例。例如。是這樣的:

id myInstance = [NSClassFromString(@"CCUINNightShiftSectionController") new]; 
... [myInstance someInstanceMethod] ... 

HTH

+0

謝謝您的答覆,但粘貼代碼之後我得到的錯誤'/用戶/馬修/桌面/測試/測試/視圖控制器。 m:38:22:Objective-C指針隱式轉換爲'__strong id *'不允許使用ARC'和'指向非const類型'id'且沒有明確的所有權' – Matt

+0

道歉,答案中的錯字,它是'id myInstance ...''不''' – CRD

+0

好吧,現在第一行工作,但現在我不能得到第二行代碼。在頭文件代碼中有' - (BOOL)啓用;'和' - (id)_aggdKey;'例如,並使用'[myInstance _updateState];'返回'沒有已知的實例方法'enabled'' – Matt

1

請注意,您正在使用私人框架(未記載),以及所引用它的頭文件,對應iOS的10.2,所以一定要做出您在運行相同iOS版本的真實iPhone上進行測試。

您的來電,儘量讓他們像這樣:

id myInstance = [NSClassFromString(@"CCUINightShiftSectionController") new]; 
if ([myInstance respondsToSelector:@selector(someInstanceMethod)]) { 
    [myInstance performSelector:@selector(someInstanceMethod)]; 
} 

而且我注意到,「CCUINightShiftSectionController」正在成爲一個「的UIViewController」的子類,也不會得到很好的初始化採用「新「初始化程序,所以你可能有空或錯誤的結果。

祝你好運,使其工作。

1
  1. 確保私人標題與您的設備的iOS版本匹配。否則,當嘗試實例化不存在的類或未實現的調用方法時,可能會出錯。
  2. 鏈接到您要使用的框架。你不能只分配一個班級。您需要將您的應用程序鏈接到包含該類的框架。否則NSClassFromString將返回nil。他們有多種方式可以做到這一點,但現在dlopen("/System/Library/PrivateFrameworks/ControlCenterUI.framework/ControlCenterUI", RTLD_LAZY)將是最簡單的。

這樣你就可以從私有框架中調用任何你想要的東西。但這並不意味着它會真正起作用。大多數私有API受權利保護,如果沒有越獄,將無法正常工作。並且總是有一個問題來研究如何實際使用它們。你不能只是調用一個隨機方法,並期望它的工作。您可能需要進行一些初始化。解決這個問題的唯一方法是反彙編調用這些方法的方法和應用程序。

1

你可以這樣做。用您想要使用的方法聲明協議。

@protocol TestPrivateMethods <NSObject> 
- (BOOL)enabled; 
@end 

然後做了這種方式:

id myInstance = [NSClassFromString(@"CCUINNightShiftSectionController") new]; 
NSLog(@"enabled %d", [(id<TestPrivateMethods>)myInstance enabled]);