2013-03-25 16 views
9

So since Apple is now rejecting apps that access UDID, auf unserer Firmen aktuellen Projekt, müssen wir alle APIs beseitigen, die einen Aufruf dieser Eigenschaft machen:Wie erkennt man, ob externe Bibliotheken [UIDevice currentDevice] uniqueIdentifier] aufrufen?

[[UIDevice currentDevice] uniqueIdentifier] 

Wir alle Anrufe in unserem eigenen Code beseitigt haben, sondern müssen sicher sein, dass Die vielen externen Bibliotheken, die wir verwenden, rufen diese Eigenschaft nicht auf.

Welche Methode ist am zuverlässigsten, um festzustellen, ob eine Bibliothek diese Eigenschaft aufruft?

Vielen Dank im Voraus!

+0

Sind die externen Bibliotheken Open Source? – cubuspl42

+0

Die meisten Bibliotheken sind nicht Open Source. –

+0

Check diese Antwort: http://stackoverflow.com/a/9894190/440060 – Mar0ux

Antwort

14

Neben der Verwendung von otx (die anscheinend flockig geworden ist) besteht eine Option darin, einen symbolischen Haltepunkt für diese Methode festzulegen und dann die App eine Weile auszuführen und zu sehen, ob Sie sie getroffen haben.

einen symbolischen Haltepunkt für diese Methode konfigurieren würde wie folgt aussehen:

enter image description here

Wenn Sie jemals diesen Haltepunkt erreicht, können Sie herausfinden, wer sie durch Öffnen der Debugger-Konsole aufgerufen und bt eingeben. In diesem Fall kam der Anruf von meinem application:didFinishLaunchingWithOptions: aber es funktioniert, egal wer es genannt:

(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

Vielen Dank, hat super funktioniert! Das einzige Problem dabei ist, dass es es nur abfangen kann, wenn es tatsächlich die Funktion aufruft, und nicht, wenn es das ** Potential ** hat, es aufzurufen. –

+0

+1 Vielen Dank dafür !! Es rettete uns potenziell 1 Woche, indem er uns half, eine Bibliothek zu finden, die wir vermissten! –

1

kann es schwierig sein, festzustellen, zuverlässig, wenn eine Closed-Source-Bibliothek ist eigentlich eine Methode aufrufen, aber es gibt einige Möglichkeiten, wie Sie sehen können, wenn sie könnte sein:

  • strings zu sehen, ob „uniqueidentifier“ in der Bibliothek angezeigt wird, unabhängig davon, wie es verwendet wird:

    $ strings libFoo.a | grep uniqueIdentifier

  • Mit nm oder otool (siehe this answer)

  • Mit otx (siehe this answer)

Diese Ansätze Potenzial Anrufungen aufdrehen kann helfen, dass ein Haltepunkt Einstellung verpassen kann.

3

auf Quinns Antwort zu erweitern:

  • strings listet alle Symbole in einem kompilierten Objekt oder eine Bibliothek, in der Reihenfolge der ersten Auftritt pro Klasse. Wenn Sie in der Ausgabe uniqueIdentifier sehen, ist es möglich, dass sie eine andere Methode mit diesem Namen aufrufen. Aber wenn Sie currentDevice in der Ausgabe sofort gefolgt von uniqueIdentifier sehen, dann rufen sie fast sicher [[UIDevice currentDevice] uniqueIdentifier]. Es ist möglich, dass die beiden Zeilen nicht sequenziell sind, wenn die Bibliothek früher in der Datei currentDevice aufruft.
  • otool -ov listet alle Klassen, Methoden und Importe in der Bibliothek auf. Wenn es uniqueIdentifier auflistet, bedeutet dies wahrscheinlich, dass die Bibliothek eine eigene Methode mit diesem Namen definiert. Sehen Sie sich die Referenz im Kontext an.Am Ende jeder Klasse sehen Sie einen Abschnitt wie Contents of (__DATA,__objc_classrefs) section, der die Importe auflistet. Wenn _OBJC_CLASS_$_UIDevice unter den Importen für die Klasse aufgelistet ist, die Sie gefunden haben, indem Sie auf uniqueIdentifier verwiesen haben, besteht eine gute Chance, dass die Klasse -[UIDevice uniqueIdentifier] aufruft.
  • Der Ausgang von nm ist zu diesem Zweck otool ähnlich. Insbesondere zeigt es Ihnen keine Aufrufe an uniqueIdentifier, aber es zeigt Ihnen, welche Klassen importieren.
Verwandte Themen