2010-08-23 10 views
37

Quindi, sappiamo tutti che Apple proibisce l'utilizzo di API private o non documentate nelle app iOS. Non ho alcun problema con questo, perché ci sono validi motivi tecnici per cui questa è una buona idea. Tuttavia, per due volte ho avuto un'app rifiutata per l'utilizzo di API private, quando in realtà non era così. Non è difficile: le API private includono simboli come connectionState, setThumbnail, setOrder e così via. Qualsiasi chiamata effettuata ai metodi denominati come tali verrà contrassegnata come un uso privato dell'API, anche se il metodo chiamato è qualcosa che hai definito tu stesso. Per un programma che fa qualcosa con connessioni, miniature o l'ordine delle cose, i nomi dei metodi sopra menzionati non sono poi così improbabili. Ottenere respinto per questo e dover rinominare un metodo e inviare nuovamente i ritardi di almeno una settimana mentre aspetti una nuova recensione.Verifica autonomamente "utilizzo" API privato?

Quindi c'è un modo, utilizzando nm, discariche di classe dei quadri iOS, ecc per scoprire per lei se i vostri nomi dei metodi conflitti con qualcosa dentro? Se è così, potremmo avere una possibilità di correggere questo prima del rilascio ed evitare inutili rifiuti.

risposta

18

Suggerisco di utilizzare App Scanner. Analizza il tuo file .app per l'utilizzo del metodo API privato. La versione corrente non supporta le variabili di istanza API private ma potrebbe funzionare in una versione futura.

Cattura metodi che sono stati denominati come un metodo API privato, anche se ha la propria implementazione. Inoltre, cattura @selectors nei metodi (proprio come il correttore automatico ufficiale iOS).

link ->https://github.com/ChimpStudios/App-Scanner

+0

Yay, la pagina di download sembra essere incompatibile con Safari sul Mac. Ho dovuto usare Firefox per vedere il pulsante di download. – auco

+0

Funziona bene per me su Safari 5.1 (Mac) – Andrew

+0

App Scanner non cattura il caso quando performSelector: viene chiamato con un selettore che è un metodo privato. Tuttavia, gli strumenti di Apple catturano questo caso. – ThomasW

2

Hai provato ad attivare Validate Build Product nelle impostazioni? Si suppone che esegua tutti i controlli iniziali eseguiti sulla tua app durante il processo di revisione

+4

Sì. Non sei sicuro di cosa esattamente "convalida", ma non è questo. –

+0

Sì, ho appena provato questo e convalidare il prodotto di costruzione non trova il problema. – ThomasW

3

Questo non è esattamente quello che stai cercando, ma Xcode ha due opzioni valide che probabilmente vale la pena provare.

Il primo è un'impostazione di generazione. Non è del tutto chiaro cosa controlli - la documentazione non dice e anche i discorsi del WWDC non sono stati davvero elaborati - ma è potenzialmente utile. La mia ipotesi è che non controlli le API private.

La seconda opzione è nell'organizer. Nella view "App archiviate" puoi inviare la tua app ad Apple per la convalida. Ancora una volta, non riescono a capire esattamente quali sono i controlli, ma capisco che questo è più simile ai test automatici eseguiti prima della revisione "manuale". La mia ipotesi è che questo controlli per le chiamate API private.

+2

Buone idee. L'organizzatore "Convalida" sembra eseguire le stesse verifiche eseguite da Application Loader al momento dell'invio: l'ID del gruppo: s è corretto, il nome del file è valido, ecc. Non si va sull'API privata: s però. –

+1

L'utilizzo dell'API privata è ora incluso, ma non sembra mostrare alcun dettaglio su quale chiamata privata api viene utilizzata o da dove! Sospiro. –

2

Erica Sadun sta attualmente lavorando su qualcosa che lei chiama APIKit, un'utility che analizza il codice e ti avvisa in modo proattivo sull'utilizzo dell'API privata. http://ericasadun.com/2009/12/apikit-goes-beta/#c2

L'unico problema è che non riesco a trovare nulla a che fare con esso ovunque. Apparentemente è in versione beta, ma è stato annunciato circa 8 mesi fa.

Non conosco lo stato corrente o se sia effettivamente disponibile, ma è qualcosa che potresti esaminare. Forse anche provare a contattarla da solo? Erica si blocca nel canale # iphone-dev su IRC su freenode di tanto in tanto, potresti prenderla lì.

+0

Grazie, lo esaminerò. –

+0

L'ho esaminato e penso che il suo script apikit probabilmente non ha funzionato fino in fondo, motivo per cui non è stato rilasciato. Nello specifico, 'nm',' classdump' e gli amici non vedono le proprietà dinamiche dei dati di base, che ovviamente lo fa lo scanner delle mele. È necessario qualcosa che in realtà trovi tutti i selettori usati. 'Stringhe fa il lavoro, ma filtrare tutto questo ** non è ** un selettore è difficile (impossibile?). :/ –

+0

classdump è una versione avanzata di 'otool -ov', tuttavia, it o nm non interferisce quando si chiama un selettore privato con performSelector :. – ThomasW

1

archivio l'applicazione e convalidarlo. Questo passa attraverso la tua app e ti dice cosa c'è che non va. Storia vera, l'ho appena sperimentato io stesso su libxslt/xml.
+ Non perdere tempo su AppScanner (obsoleto) e tutti gli otool -L ecc. (All'inizio non hai idea di quale selettore stai utilizzando sia sbagliato).

Problemi correlati