2009-11-20 19 views
6

Ora che è noto che gli invii di App Store sono stati testati per l'utilizzo di API private, ho bisogno di porre la domanda ... cos'è esattamente un'API privata in modo che io possa evitarli?API Apple e private

risposta

14

Un'API privata è un'API non documentata nell'SDK. Ad esempio, una classe framework potrebbe dichiarare un metodo che non è destinato ad essere utilizzato da sviluppatori esterni. Il comportamento di un'API privata non è garantito. Non puoi nemmeno essere sicuro che il metodo sarà lì nei futuri aggiornamenti della piattaforma. Probabilmente la sua dichiarazione non è disponibile nei file di intestazione SDK distribuiti pubblicamente. Se ti attieni alle cose definite pubblicamente nella documentazione dell'SDK, sarai OK.

+0

Va bene. Grazie a tutti per le risposte veloci! – RyJ

+0

Quindi, piuttosto che chiamare un metodo all'interno di un'API privata, qual è la differenza tra la creazione del proprio metodo che fa la stessa cosa? Ho ragione nel dire che non è il problema di chiamare certi metodi API, è il fatto che stai provando a fare cose che non vuoi che tu faccia? –

+0

@Nick Non necessariamente. Affinché un'app venga approvata da Apple, devi disporre di entrambi i seguenti elementi: 1. Esegui solo le operazioni da cui non ti hanno impedito, indipendentemente dal metodo. 2. Farli attraverso un meccanismo valido. Ci possono essere cose che vanno bene in generale, ma non è possibile chiamare direttamente un'API privata per ottenerle. Il rituale è che un'API privata potrebbe cambiare nelle versioni future e interrompere la tua app, mentre la scrittura di un metodo personalizzato su un'API pubblica non dovrebbe interrompersi con un aggiornamento iOS. –

1

Generalmente dalla loro assenza dalle intestazioni SDK. Una delle convenzioni di Apple è di portare i nomi dei metodi ObjC con caratteri di sottolineatura.

5

Troverai difficile utilizzare un'API privata per sbaglio. Non sono documentati nei documenti SDK e non vengono visualizzati nei suggerimenti di completamento del codice di XCode.

La ragione per questo è diventato notizia recente è il creatore di un quadro utilizzato da diverse applicazioni utilizzata un'API privata, in modo che quando gli sviluppatori che incluso il suo quadro aggiornato le loro applicazioni, sono stati respinti (anche se gli sviluppatori non hanno usato un API privata, il framework che hanno aggiunto alla loro applicazione ha fatto).

Questo è l'unico modo per utilizzare accidentalmente un'API privata.

+0

quale struttura era? –

+1

Era nel framework dei tre20, ma il problema è stato risolto da tempo. Questa risposta ha più di due anni. – mmc

0

Non è difficile essere rifiutati dal cosiddetto "utilizzo di API private". Cercate di usare quanto segue come attributo di Core Data e sarebbe rifiutato:

  • ColorIndex
  • verificarsi
  • id

Essa mostra come il robot esegue la scansione del API.

3

Non sono solo le API private che possono causare il rifiuto dell'applicazione. L'utilizzo di membri non documentati di un'API pubblica può causare il rifiuto della tua richiesta. Ad esempio, la libreria three20 (da fixed) ha avuto accesso a _phase e ad altri membri di UITouch all'interno di una categoria.

Essi possono anche rilevare le chiamate al privati ​​ membri attraverso performSelector, come seguito anche segnalato un rifiuto:

UIWindow* window = [UIApplication sharedApplication].keyWindow] 
return !![window performSelector:@selector(firstResponder)]; 

più inquietante, se fate il vostro lavoro di applicazione ai punti 3.1 e 3.0 e in fase di esecuzione in 3.0 non usi nessuna delle cose 3.1 la tua applicazione può ancora essere rifiutata. Un esempio potrebbe essere il cameraOverlayView di UIImagePickerController (vedere here). Questo è un po 'sconcertante.

1

Un ottimo strumento da utilizzare prima di inviare la tua app è App Scanner. Si esegue la scansione del file .app per uso privato API e mostra quale metodo firme corrispondano e quali classi questi metodi sono in

collegamento -.>http://www.chimpstudios.com/appscanner/

+0

Sembra che questo sito sia inattivo. Qualcuno sa di altre app che eseguono funzionalità simili? – rvijay007

1

La mia app è stata respinta da Apple a causa dell'utilizzo di API private .Qui è il codice,

Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl"); 

    id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)]; 

    [activeInstance performSelector:@selector(dismissKeyboard)];