2013-03-25 14 views
9

所以,since Apple is now rejecting apps that access UDID,我們公司目前的項目,我們需要消除撥打電話到該物業的所有API:如何檢測是否有外部庫正在調用[UIDevice currentDevice] uniqueIdentifier]?

[[UIDevice currentDevice] uniqueIdentifier] 

我們已經消除了我們自己的代碼的所有調用,但需要確保我們正在使用的許多外部庫都沒有對這個屬性進行調用。

什麼是最可靠的方法來確定圖書館是否正在調用此屬性?

預先感謝您!

+0

外部庫是否是開源的? – cubuspl42

+0

大多數庫不是開源的。 –

+0

檢查這個答案:http://stackoverflow.com/a/9894190/440060 – Mar0ux

回答

14

除了使用otx(這似乎已經得到片狀)一個選項是設置一個斷點符號上的方法,然後運行了一段時間的應用程序,看看你打它。

配置該方法的象徵性的斷點應該是這樣的:

enter image description here

如果你打的斷點,你可以找出誰打開調試器控制檯,然後輸入bt的說法。在這種情況下,呼叫從我application:didFinishLaunchingWithOptions:來了,但它的作品無論是誰把它稱爲:

(lldb) bt 
* thread #1: tid = 0x1c03, 0x001f4690 UIKit`-[UIDevice uniqueIdentifier], stop reason = breakpoint 1.1 
frame #0: 0x001f4690 UIKit`-[UIDevice uniqueIdentifier] 
frame #1: 0x0000212e MyApp`-[AppDelegate application:didFinishLaunchingWithOptions:](self=0x0747fcb0, _cmd=0x005aec21, application=0x08366300, launchOptions=0x00000000) + 702 at AppDelegate.m:37 
frame #2: 0x00015157 UIKit`-[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 266 
frame #3: 0x00015747 UIKit`-[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1248 
frame #4: 0x0001694b UIKit`-[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 805 
frame #5: 0x00027cb5 UIKit`-[UIApplication handleEvent:withNewEvent:] + 1022 
frame #6: 0x00028beb UIKit`-[UIApplication sendEvent:] + 85 
frame #7: 0x0001a698 UIKit`_UIApplicationHandleEvent + 9874 
frame #8: 0x01f01df9 GraphicsServices`_PurpleEventCallback + 339 
frame #9: 0x01f01ad0 GraphicsServices`PurpleEventCallback + 46 
frame #10: 0x01f1bbf5 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53 
frame #11: 0x01f1b962 CoreFoundation`__CFRunLoopDoSource1 + 146 
frame #12: 0x01f4cbb6 CoreFoundation`__CFRunLoopRun + 2118 
frame #13: 0x01f4bf44 CoreFoundation`CFRunLoopRunSpecific + 276 
frame #14: 0x01f4be1b CoreFoundation`CFRunLoopRunInMode + 123 
frame #15: 0x0001617a UIKit`-[UIApplication _run] + 774 
frame #16: 0x00017ffc UIKit`UIApplicationMain + 1211 
frame #17: 0x00001d42 MyApp`main(argc=1, argv=0xbffff3f8) + 130 at main.m:16 
+1

謝謝你,工作很棒!我想這個唯一的問題是它只能在實際調用函數時才能捕獲它,而不是如果它有**潛在**來調用它。 –

+0

+1非常感謝!通過幫助我們趕上我們錯過的圖書館,它可能爲我們節省了1周的時間! –

1

它可以是難以可靠地確定一個封閉源代碼庫實際上是調用一個方法,但也有一些方法你可以看到,如果他們可能是:

  • 使用strings,看看是否「唯一標識符」出現在圖書館,不管它如何使用:

    $ strings libFoo.a | grep uniqueIdentifier

  • 使用nmotool(見this answer

  • 使用otx(見this answer

這些方法可以幫助打開了,設置一個斷點可能錯過潛在的調用。

3

爲了擴大對奎恩的回答是:

  • strings列出編譯對象或庫,所有的符號,每類首次出現的順序。如果在輸出中看到uniqueIdentifier,則可能是他們正在調用具有該名稱的其他方法。但是,如果您在輸出中看到currentDevice,那麼uniqueIdentifier後面幾乎肯定會調用[[UIDevice currentDevice] uniqueIdentifier]。如果庫在文件中早些時候調用currentDevice,那麼這兩行可能不是順序的。
  • otool -ov列出庫中的所有類,方法和導入。如果列出了uniqueIdentifier,那可能意味着圖書館正在用該名稱定義自己的方法。在上下文中查看參考。在每堂課的最後,你會看到一個如Contents of (__DATA,__objc_classrefs) section的部分列出了進口。如果_OBJC_CLASS_$_UIDevice被列入您發現引用uniqueIdentifier的班級的進口名單中,那麼該班級很有可能撥打-[UIDevice uniqueIdentifier]
  • 爲此,nm的輸出與otool類似。具體來說,它不會顯示您致電uniqueIdentifier,但它會告訴你什麼課程導入。
相關問題