2013-03-25 10 views
9

Więc since Apple is now rejecting apps that access UDID, na obecnym projektem naszej firmy, musimy wyeliminować wszystkich interfejsów API, które sprawiają, że wywołanie tej właściwości:Jak wykryć, czy zewnętrzne biblioteki wywołują [UIDevice currentDevice] uniqueIdentifier]?

[[UIDevice currentDevice] uniqueIdentifier] 

wyeliminowaliśmy wszystkie połączenia w naszym własnym kodzie, ale muszą mieć pewność, że wiele zewnętrznych bibliotek, z których korzystamy, nie wykonuje wywołań do tej właściwości.

Jaka jest najbardziej niezawodna metoda określania, czy biblioteka wywołuje tę właściwość?

Z góry dziękuję!

+0

Czy zewnętrzne biblioteki są otwarte? – cubuspl42

+0

Większość bibliotek nie jest open source. –

+0

Kontrola ta odpowiedź: http://stackoverflow.com/a/9894190/440060 – Mar0ux

Odpowiedz

14

Oprócz użycia otx (która wydaje się być niestabilna) jedną z opcji jest ustawienie symbolicznego punktu przerwania dla tej metody, a następnie uruchomienie aplikacji przez chwilę i zobacz, czy ją trafisz.

Konfiguracja symboliczną przerwania dla tej metody będzie wyglądać następująco:

enter image description here

Jeśli kiedykolwiek uderzył przerwania, można dowiedzieć się, kto nazywa go otwierając konsolę debuggera i wpisując bt. W tym przypadku wywołanie pochodzi z mojego application:didFinishLaunchingWithOptions: ale działa bez względu na to, który nazwał go:

(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

Dziękuję, świetnie się spisałeś! Jedyny problem z tym, jak przypuszczam, polega na tym, że może go wychwycić tylko wtedy, gdy faktycznie wywołuje funkcję, a nie, jeśli ma ** potencjał **, aby to nazwać. –

+0

+1 Wielkie dzięki za to !! Oszczędził nam to potencjalnie 1 tydzień, pomagając nam złapać bibliotekę, którą przegapiliśmy! –

1

może być trudno wiarygodnie ustalić, czy biblioteka zamkniętym źródłem jest faktycznie wywołanie metody, ale istnieje kilka sposobów, dzięki którym można sprawdzić, czy mogą one być :

  • Korzystanie strings aby sprawdzić, czy „uniqueidentifier” pojawia się w bibliotece, niezależnie od tego, w jaki sposób jest on wykorzystywany:

    $ strings libFoo.a | grep uniqueIdentifier

  • Korzystanie nm lub otool (patrz this answer)

  • Korzystanie otx (patrz this answer)

Podejścia te mogą pomóc podkręcić potencjalnych inwokacje, że ustawienie przerwania może przegapić.

3

Aby rozwinąć na odpowiedź Quinna:

  • strings wymienia wszystkie symbole w skompilowanego obiektu lub w bibliotece, w kolejności od pierwszego pojawienia się na klasy. Jeśli widzisz w wyjściu uniqueIdentifier, możliwe, że wywołują inną metodę o tej nazwie. Ale jeśli zobaczysz currentDevice na wyjściu natychmiast po nim uniqueIdentifier, to prawie na pewno dzwonią pod numer [[UIDevice currentDevice] uniqueIdentifier]. Możliwe, że te dwie linie nie będą sekwencyjne, jeśli biblioteka wczytuje wcześniej plik.
  • otool -ov zawiera listę wszystkich klas, metod i importów w bibliotece. Jeśli wymienia uniqueIdentifier, prawdopodobnie oznacza to, że biblioteka definiuje własną metodę o tej nazwie. Spójrz na odniesienie w kontekście.U dołu każdej klasy zobaczysz sekcję taką jak Contents of (__DATA,__objc_classrefs) section, która zawiera listę importów. Jeśli numer _OBJC_CLASS_$_UIDevice jest wymieniony wśród importów dla klasy, którą odnalazłeś odwołując się do uniqueIdentifier, istnieje duża szansa, że ​​klasa wywoła -[UIDevice uniqueIdentifier].
  • Dane wyjściowe nm są w tym celu podobne do otool. W szczególności nie będzie wyświetlać połączeń z numerem uniqueIdentifier, ale pokaże Ci, jakie klasy importują .
Powiązane problemy