App StoreアプリケーションでプライベートAPIを使用する

ほとんどのiOS開発者は、何らかの形で、Appleのルールに従って、機能を作成することが不可能であるという事実に直面したと思います。 これは多くの場合、特定のメソッドがプライベートセクションに分類されるためです。 それらを使用してアプリケーションを公開しようとすると、拒否されます(Apple Review Guidelinesの段落2.5)。







カットの下で、この制限を部分的に削除する方法を説明します。





この方法でルールの重大な違反を隠すことはできません。アプリケーションの機能から、禁止されているもの(たとえば、bluetooth経由でファイルを転送する)を使用することが明らかだからです。しかし、このメソッドは、標準UI完璧です。



したがって、UISwitchの色を変更したいとしますが、iOS 4では(tintColorがiOS 5で登場しました)。 これは、次のコードを使用して実行できます。



[testSwitch setAlternateColors:true];
      
      





すべてが単純であるように見えますが、このメソッドはUISwitchのドキュメントにはないため、使用できません。 これは、 Objective-Cランタイムの機能を使用して非表示にすることができます



そのため、以下では小さな段階的な指示を示します。

  1. NSStringを分割して、コードアナライザーがその名前全体に気付かないようにします。

     NSString *nameOfMethod = @””; for (NSString *s in [NSArray arrayWithObjects:@"set",@"Alt",@"ernate",@"Colors:",nil]) nameOfMethod = [nameOfMethod stringByAppendingString:s]; const char *nameOfMethodUTF8 = [nameOfMethod UTF8String];
          
          





  2. 目的のメソッドが見つかるまで、UISwitchメソッドを繰り返し処理します。

      SEL methodSel = nil; Method *methods = class_copyMethodList([UISwitch class], &count); i = 0; while(i < count) { SEL s = method_getName(methods[i]); if (0 == strcmp(sel_getName(s), methodNameUTF8String)) { methodSel = s; i = count; } }
          
          





  3. 対応するオブジェクト(testSwitch)の関数を呼び出します。

     if (methodSel != nil) { IMP m_imp = method_getImplementation(methodsList[i]); m_imp(theSwitch, methodSel, YES); } free(methods);
          
          







出来上がり、私たちはこの制限を回避しましたが、この方法を使用する前にAppleがそれをブロックした理由を考慮してください。



PS: App Scannerアプリケーションを使用して、プライベートAPIを使用するためのアプリケーションを確認できます。



All Articles