2009-11-20 5 views
6

Теперь, когда общеизвестно, что представления приложений в App Store проверяются на использование частных API-интерфейсов, мне нужно задать вопрос ... что такое частный API, чтобы я мог их избежать?API Apple и private API

ответ

14

Закрытый API - это API, который не задокументирован в SDK. Например, класс framework может объявить метод, который не предназначен для использования сторонними разработчиками. Поведение частного API не гарантируется. Вы даже не можете быть уверены, что этот метод будет присутствовать в будущих обновлениях платформы. Его объявление, вероятно, недоступно в общедоступных файлах заголовков SDK. Если вы придерживаетесь общедоступных вещей в документации SDK, все будет в порядке.

+0

Хорошо круто. Спасибо всем за быстрые ответы! – RyJ

+0

Чтобы вместо вызова метода в частном API, какая разница в том, что вы создаете свой собственный метод, который делает то же самое? Правильно ли я говорю, что это не проблема вызова определенных методов API, это факт, что вы пытаетесь делать то, что они не хотят делать? –

+0

@Nick Не обязательно. Чтобы приложение получило одобрение Apple, вы должны иметь оба следующих варианта: 1. выполнять только те действия, от которых они не ограничивали вас, независимо от метода. 2. Делать их через действительный механизм. В целом могут быть вещи, которые можно делать вообще, но вы не можете напрямую обращаться к частному API для их выполнения. Ритуал - это частный API, который может изменяться в будущих версиях и разбивает ваше приложение, тогда как создание пользовательского метода в общедоступном API не должно прерываться с обновлением iOS. –

1

Как правило, их отсутствие из заголовков SDK. Одна из конвенций Apple заключается в том, чтобы привести имена методов ObjC с символами подчеркивания.

5

Вам будет сложно использовать частный API случайно. Они не документированы в документах SDK, и они не отображаются в предложениях по завершению кода XCode.

Причина, по которой это стало новостью недавно, является создателем структуры, используемой несколькими приложениями, использующими частный API, поэтому, когда разработчики, включившие его фреймворк, обновили свои приложения, они были отклонены (хотя разработчики THOSE не использовали частный API, которые они добавили в свое приложение).

Это единственный способ, по которому вы могли бы использовать частный API случайно.

+0

какой каркас был? –

+1

Это было в трехмерной структуре, но проблема уже давно устранена. Этот ответ старше двух лет. – mmc

0

Нетрудно получить отклонение от так называемого «использования частного API». Попробуйте использовать следующее в качестве атрибута основных данных, и это будет отвергнуто:

  • ColorIndex
  • появление
  • ID

Он показывает, как робот сканирует API.

3

Это не просто частные API, которые могут привести к отклонению вашего приложения. Использование недокументированных членов публичного API может привести к тому, что ваше приложение будет отклонено. Например, библиотека три20 (с фиксированной) обратилась к _фазе и другим членам UITouch в пределах категории.

Они также могут обнаружить вызовы частных членов через performSelector, а также следующее помечено отказ:

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

Более тревожным, если вы сделаете вашу работу приложения под 3.1 и 3.0, а во время выполнения в 3.0 вы не используете ни одно из 3.1, ваше приложение все еще может быть отклонено. Примером может служить cameraOverlayView от UIImagePickerController (см. here). Это немного озадачивает.

1

Отличный инструмент для использования перед отправкой приложения App Scanner. Она сканирует файл .app для частного использования API и показывает, что сигнатуры методов совпадают, и какие классы этих методов в

ссылка -.>http://www.chimpstudios.com/appscanner/

+0

Похоже, что этот сайт либо не работает. Кто-нибудь знает о каких-либо других приложениях, которые выполняют аналогичную функциональность? – rvijay007

1

Моего приложение было отклонено из-за яблоком с использованием личного API .Существует код,

Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl"); 

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

    [activeInstance performSelector:@selector(dismissKeyboard)];