AppleおよびプライベートAPI

ios iphone iphone-privateapi
AppleおよびプライベートAPI

App Storeの提出物がプライベートAPIの使用についてテストされていることは一般に知られているので、質問をする必要があります…​ 私がそれらを避けるために、プライベートAPIとは何ですか?

  6  2


ベストアンサー

プライベートAPIは、SDKに文書化されていないAPIです。 たとえば、フレームワーククラスは、外部の開発者が使用することを意図していないメソッドを宣言する場合があります。 プライベートAPIの動作は保証されていません。 プラットフォームの今後の更新でメソッドが存在するかどうかさえ確信できません。 その宣言は、一般に配布されているSDKヘッダーファイルではおそらく利用できません。 SDKドキュメントで公的に定義されていることに固執するのであれば、問題ありません。

14


偶然にプライベートAPIを使用するのは難しいでしょう。 これらはSDKドキュメント内に文書化されておらず、XCodeのコード補完の提案には表示されません。

これが最近ニュースになった理由は、いくつかのアプリで使用されるフレームワークの作成者がプライベートAPIを使用したため、フレームワークを含む開発者がアプリを更新したときに拒否されました(これらの開発者がプライベートAPIを使用していなくても、彼らが彼らのアプリケーションに追加したフレームワークはそうしました)。

これは、プライベートAPIを誤って使用する可能性がある唯一の方法です。

5


アプリケーションが拒否されるのは、プライベートAPIだけではありません。 パブリックAPIのドキュメント化されていないメンバーを使用すると、アプリケーションが拒否される可能性があります。 たとえば、three20ライブラリ(修正後)は、_phaseおよびカテゴリ内のUITouchの他のメンバーにアクセスしました。

また、performSelectorを介して_private_メンバーへの呼び出しを検出することもできます。これは、以下も拒否のフラグを立てたためです。

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

さらに厄介なのは、アプリケーションを3.1および3.0の下で動作させ、実行時に3.0で動作させた場合、アプリケーションが拒否される可能性のある3.1のものは一切使用しないことです。 例としては、 UIImagePickerController`の cameraOverlayView`があります(http://ajnaware.wordpress.com/2009/09/24/yet-another-dubious-app-rejection-story/[here]を参照)。 これは一種の不可解です。

3


通常、SDKヘッダーにないためです。 アップルの規則の1つは、アンダースコアを使用してObjCメソッド名を導くことです。

1


アプリを送信する前に使用する優れたツールはApp Scannerです。 プライベートAPIの使用について.appファイルをスキャンし、一致するメソッドシグネチャとそれらのメソッドが含まれるクラスを示します。

1


私のアプリは、プライベートAPIを使用しているため、Appleによって拒否されました。次のコード、

    Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl");

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

    [activeInstance performSelector:@selector(dismissKeyboard)];

1


いわゆる「プライベートAPIの使用」によって拒否されることは難しくありません。 次をコアデータ属性として使用しようとすると、拒否されます。

  • colorIndex

  • 発生

  • id

ロボットがAPIをスキャンする方法を示しています。

0


タイトルとURLをコピーしました