2010-08-23 6 views
37

Also, wir alle wissen, Apple verbietet die Verwendung von privaten oder undokumentierten APIs in iOS-Apps. Ich habe damit kein Problem, da es gute technische Gründe dafür gibt, warum das eine gute Idee ist. Jedoch habe ich zweimal eine App abgelehnt, die private APIs verwendet, obwohl dies nicht der Fall war. Es ist nicht schwer - die privaten APIs enthalten Symbole wie connectionState, setThumbnail, setOrder und so weiter. Alle Aufrufe an Methoden, die als solche benannt sind, werden als private API-Verwendung gekennzeichnet, selbst wenn die aufgerufene Methode von Ihnen selbst definiert wurde. Für ein Programm, das etwas mit Verbindungen, Thumbnails oder der Reihenfolge der Dinge macht, sind die oben genannten Methodennamen nicht so unwahrscheinlich. Wenn Sie dafür abgewiesen werden und eine Methode umbenennen und erneut einreichen müssen, wird alles um mindestens eine Woche verschoben, während Sie auf eine neue Überprüfung warten.Suchen Sie nach privaten API "Nutzung" selbst?

So ist es eine Möglichkeit, mit nm, Klasse Dumps des iOS-Frameworks, etc., um herauszufinden, selbst wenn Ihre Methodennamen Konflikte mit etwas da drin? Wenn dies der Fall ist, könnten wir eine Chance haben, dies vor der Veröffentlichung zu korrigieren und unnötige Ablehnung zu vermeiden.

Antwort

18

Ich würde vorschlagen, App Scanner zu verwenden. Es analysiert Ihre APP-Datei für die Verwendung privater API-Methoden. Die aktuelle Version unterstützt keine privaten API-Instanzvariablen, die jedoch möglicherweise in eine zukünftige Version integriert werden.

Es fängt Methoden ab, die wie eine private API-Methode benannt wurden, selbst wenn sie über eine eigene Implementierung verfügt. Außerdem werden @Selectors in Methoden erfasst (genau wie beim offiziellen automatischen iOS-Checker).

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

+0

Yay, die Download-Seite scheint mit Safari auf dem Mac nicht kompatibel zu sein. Ich musste Firefox verwenden, um den Download-Button zu sehen. – auco

+0

Funktioniert für mich auf Safari 5.1 (Mac) – Andrew

+0

App Scanner fängt nicht den Fall, wenn performSelector: mit einem Selektor aufgerufen wird, der eine private Methode ist. Apples Tools fangen diesen Fall jedoch ein. – ThomasW

2

Haben Sie versucht, Validate Build Product in den Einstellungen einzuschalten? Es soll alle anfänglichen Überprüfungen Ihrer App während des Überprüfungsvorgangs durchführen.

+4

Ja. Nicht sicher, was genau es "validiert", aber das ist es nicht. –

+0

Ja, ich habe dies gerade getestet und validiere Build-Produkt findet das Problem nicht. – ThomasW

3

Dies ist nicht genau das, wonach Sie suchen, aber Xcode hat zwei Validierungsoptionen, die Sie wahrscheinlich ausprobieren sollten.

Die erste ist eine Build-Einstellung. Es ist nicht ganz klar, was es überprüft - die Dokumentation sagt nicht und sogar die WWDC-Gespräche haben nicht wirklich ausgearbeitet - aber es ist potentiell nützlich. Meine Vermutung ist, dass es nicht nach privaten APIs sucht.

Die zweite Option ist im Organizer. In der Ansicht "Archivierte Apps" können Sie Ihre App zur Validierung an Apple senden. Auch hier ist nicht genau festgelegt, was die Prüfungen sind, aber ich verstehe, dass dies mehr wie die automatisierten Tests sind, die sie vor der "manuellen" Überprüfung ausführen. Meine Vermutung ist, dass diese überprüft für private API-Aufrufe.

+2

Gute Ideen. Der Organisator "Validate" scheint die gleichen Überprüfungen durchzuführen, die Application Loader bei der Einreichung durchführt - dass die Paket-IDs korrekt sind, der Dateiname gültig ist, usw. Nein, gehen Sie auf die private API: s. –

+1

Die Verwendung von privaten APIs ist jetzt enthalten, aber es scheint keine Details darüber zu geben, welcher private API-Anruf verwendet wird oder von wo! Seufzer. –

2

Erica Sadun arbeitet gerade an etwas, das sie APIKit nennt. APIKit ist ein Dienstprogramm, das Ihren Code scannt und Sie proaktiv vor privater API-Nutzung warnt. http://ericasadun.com/2009/12/apikit-goes-beta/#c2

Das einzige Problem ist, dass ich nirgendwo etwas damit zu tun habe. Es ist anscheinend in der Beta, aber das wurde vor ungefähr 8 Monaten angekündigt.

Ich weiß nicht, es ist der aktuelle Status oder ob es tatsächlich verfügbar ist, aber es ist etwas, was Sie untersuchen könnten. Vielleicht sogar versuchen, sie selbst zu kontaktieren? Erica hängt ab und an im # iphone-dev-Kanal im IRC auf freenode hin und wieder, ihr könnt sie dort erwischen.

+0

Danke, ich werde mich darum kümmern. –

+0

Ich habe es untersucht, und ich denke, dass ihr Apikit-Skript wahrscheinlich nicht den ganzen Weg funktioniert hat, weshalb es nicht veröffentlicht wurde. Insbesondere sehen "nm", "classdump" und Freunde keine dynamischen Kerndateneigenschaften, was offensichtlich der Apples-Scanner tut. Etwas, das tatsächlich alle verwendeten Selektoren findet, wird benötigt. 'Strings' macht den Job, aber filtert alles heraus ** ist nicht ** ein Selektor ist hart (unmöglich?). :/ –

+0

Classdump ist eine erweiterte Version von 'Otool -ov', jedoch, es oder nm nicht den Fall, wenn Sie einen privaten Selektor mit performSelector: aufrufen. – ThomasW

1

Archive Ihre Anwendung und validieren. Dies geht durch Ihre App und sagt Ihnen, was falsch ist. Wahre Geschichte, ich habe es gerade selbst auf libxslt/xml erlebt.
+ Verschwenden Sie nicht Ihre Zeit auf AppScanner (veraltet) und alle Otool -L usw. (am Anfang haben Sie keine Ahnung, welche Selektor Sie falsch verwenden).

Verwandte Themen