2010-08-23 16 views
37

Por lo tanto, todos sabemos que Apple prohíbe el uso de API privadas o no documentadas en aplicaciones de iOS. No tengo ningún problema con esto, ya que hay razones técnicas sólidas para explicar por qué esta es una buena idea. Sin embargo, dos veces me han rechazado una aplicación por usar API privadas, cuando este no era realmente el caso. No es difícil: las API privadas incluyen símbolos como connectionState, setThumbnail, setOrder, etc. Cualquier llamada que realice a los métodos nombrados como tales se marcará como un uso privado de la API, incluso si el método que se llama es algo que usted mismo ha definido. Para un programa que hace algo con conexiones, miniaturas o el orden de las cosas, los nombres de método mencionados anteriormente no son tan improbables. Ser rechazado por esto y tener que cambiar el nombre de un método y volver a enviar demora todo por al menos una semana mientras espera una nueva revisión.¿Comprueba usted mismo el "uso" de la API privada?

Entonces, ¿hay una manera, usando nm, vertederos de clase de los marcos de iOS, etc para averiguar por sí mismo si sus nombres de los métodos conflictos con cualquier cosa en allí? Si es así, podríamos tener la oportunidad de corregir esto antes de la publicación y evitar el rechazo innecesario.

Respuesta

18

Sugiero usar el Escáner de aplicaciones. Analiza su archivo .app para el uso privado del método API. La versión actual no es compatible con las variables de instancia privadas de la API, pero eso podría funcionar en una versión futura.

Detectará métodos que han recibido el mismo nombre que un método API privado, incluso si tiene su propia implementación. Además, detectará @selectors dentro de los métodos (al igual que el comprobador automático iOS oficial).

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

+0

Yay, la página de descarga parece ser incompatible con Safari en la Mac. Tuve que usar Firefox para ver el botón de descarga. – auco

+0

Funciona bien para mí en Safari 5.1 (Mac) – Andrew

+0

App Scanner no capta el caso cuando performSelector: se invoca con un selector que es un método privado. Sin embargo, las herramientas de Apple captan ese caso. – ThomasW

2

¿Ha intentado encender Validate Build Product en la configuración? Se supone que debe realizar todas las comprobaciones iniciales realizadas en su aplicación durante el proceso de revisión

+4

Sí. No estoy seguro de qué es exactamente lo que "valida", pero esto no es así. –

+0

Sí, acabo de probar esto y validar el producto de compilación no encuentra el problema. – ThomasW

3

Esto no es exactamente lo que está buscando, pero Xcode tiene dos opciones de validación que probablemente valga la pena intentar.

La primera es una configuración de compilación. No está del todo claro qué comprueba, la documentación no dice e incluso las pláticas de la WWDC no dieron detalles, pero es potencialmente útil. Supongo que no verifica las API privadas.

La segunda opción está en el Organizador. En la vista "Aplicaciones archivadas" puede enviar su aplicación a Apple para su validación. De nuevo, en realidad no establecen exactamente cuáles son los cheques, pero entiendo que esto es más parecido a las pruebas automáticas que ejecutan antes de revisar "manualmente". Mi suposición es que este hace para llamadas privadas a la API.

+2

Buenas ideas. El "Validate" del Organizador parece hacer las mismas comprobaciones que el Cargador de Aplicaciones hace en el envío, que los ID del paquete son correctos, el nombre de archivo es válido, etc. Sin embargo, no vayas a la API privada. –

+1

El uso privado de API ahora está incluido, pero no parece mostrar ningún detalle sobre qué API privada se está utilizando o desde dónde. Suspiro. –

2

Erica Sadun está trabajando actualmente en algo que ella llama APIKit, que es una utilidad que escanea tu código y te advierte proactivamente sobre el uso privado de la API. http://ericasadun.com/2009/12/apikit-goes-beta/#c2

El único problema es que no puedo encontrar nada que ver con eso en ninguna parte. Aparentemente está en beta, pero eso fue anunciado hace 8 meses.

No conozco su estado actual o si está realmente disponible o no, pero es algo que podría investigar. Tal vez incluso intentes contactarla tú mismo? Erica se cuelga en el canal # iphone-dev en IRC en freenode de vez en cuando, es posible que la atrape allí.

+0

Gracias, lo investigaré. –

+0

Lo he estado investigando, y creo que su script de apikit probablemente no funcionó por completo, y es por eso que no se ha publicado. Específicamente, 'nm',' classdump' y sus amigos no ven las propiedades dinámicas de los datos centrales, lo que obviamente hace el escáner Apples. Algo que realmente encuentre todos los selectores usados ​​es necesario. 'Strings' hace el trabajo, pero filtrar todo eso ** no es ** un selector es difícil (¿imposible?). :/ –

+0

classdump es una versión mejorada de 'otool -ov', sin embargo, o nm no capta el caso cuando se llama a un selector privado con performSelector :. – ThomasW

1

Archivo de su aplicación y validarlo. Esto pasa por su aplicación y le dice lo que está mal. La verdadera historia, yo solo la experimenté en libxslt/xml.
+ No pierdas tu tiempo en AppScanner (en desuso) y todas las otool -L etc. (al comienzo no tienes idea de qué selector está utilizando está mal).

Cuestiones relacionadas