2013-03-25 15 views
9

Così, since Apple is now rejecting apps that access UDID, il progetto in corso della nostra azienda, abbiamo bisogno di eliminare tutte le API che fanno una chiamata a questa proprietà:Come rilevare se alcune librerie esterne stanno chiamando [UIDevice currentDevice] uniqueIdentifier]?

[[UIDevice currentDevice] uniqueIdentifier] 

Abbiamo eliminato tutte le chiamate nel nostro proprio codice, ma hanno bisogno di essere sicuri che le numerose librerie esterne che stiamo usando non stanno facendo chiamate a questa proprietà.

Qual è il metodo più affidabile per determinare se una libreria sta chiamando questa proprietà?

Grazie in anticipo!

+0

Le librerie esterne sono open source? – cubuspl42

+0

La maggior parte delle librerie non è open source. –

+0

controllo questa risposta: http://stackoverflow.com/a/9894190/440060 – Mar0ux

risposta

14

A parte l'utilizzo di otx (che sembra essere diventato instabile), un'opzione è impostare un punto di interruzione simbolico su tale metodo e quindi eseguire l'app per un po 'e vedere se lo si colpisce.

Configurazione di un punto di interruzione simbolico per quel metodo sarebbe simile a questa:

enter image description here

Se mai colpire quel punto di interruzione, si può scoprire che lo chiamò aprendo la console debugger e digitando bt. In questo caso la chiamata è venuto dal mio application:didFinishLaunchingWithOptions: ma funziona a prescindere da chi lo chiamò:

(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

Grazie, ha funzionato alla grande! L'unico problema con questo, suppongo, è che può solo prenderlo se effettivamente chiama la funzione, e non se ha il ** potenziale ** di chiamarlo. –

+0

+1 Grazie mille per questo !! Ci ha risparmiato potenzialmente 1 settimana aiutandoci a prendere una biblioteca che ci mancava! –

1

Può essere difficile determinare in modo affidabile se una libreria closed-source è in realtà chiama un metodo, ma ci sono alcuni modi per può vedere se potrebbero essere:

  • Utilizzando strings per vedere se "uniqueIdentifier" appare nella libreria, indipendentemente da come viene utilizzato:

    $ strings libFoo.a | grep uniqueIdentifier

  • Utilizzando nm o otool (vedi this answer)

  • Utilizzando otx (vedi this answer)

Questi approcci possono aiutare a trasformare in potenziali invocazioni che l'impostazione di un punto di interruzione può perdere.

3

Per espandere sulla risposta di Quinn:

  • strings elenca tutti i simboli in un oggetto o una libreria compilata, in ordine di apparizione per classe. Se vedi uniqueIdentifier nell'output, è possibile che stiano chiamando un altro metodo con quel nome. Ma se vedi currentDevice nell'output seguito immediatamente da uniqueIdentifier, allora chiamano quasi sicuramente [[UIDevice currentDevice] uniqueIdentifier]. È possibile che le due linee non siano sequenziali, se la libreria chiama in precedenza currentDevice nel file.
  • otool -ov elenca tutte le classi, i metodi e le importazioni nella libreria. Se elenca uniqueIdentifier, probabilmente significa che la libreria sta definendo il proprio metodo con quel nome. Guarda il riferimento nel contesto.Nella parte inferiore di ogni classe vedrai una sezione come Contents of (__DATA,__objc_classrefs) section che elenca le importazioni. Se _OBJC_CLASS_$_UIDevice è elencato tra le importazioni per la classe trovata con riferimento a uniqueIdentifier, è probabile che la classe stia chiamando -[UIDevice uniqueIdentifier].
  • L'uscita di nm è simile a otool per questo scopo. In particolare, non ti mostrerà le chiamate a uniqueIdentifier, ma ti mostrerà quali classi importano .