Как найти использование закрытого API в приложении Mac Qt

Наше приложение на основе qtwebkit отклонено Apple после отправки в магазин приложений Mac. Одна из причин отказа - использование непубличного API. Мне удалось найти шесть из них в исходном коде qtwebkit. Но мне негде найти остальных. Я просмотрел исходный код нашего приложения и весь исходный код QT.

В исходном коде qtwebkit я нашел шесть непубличных API:

CFHTTPCookieStorageSetCookieAcceptPolicy
CFURLCacheCopyResponseForRequest
CFURLResponseGetMIMEType
CFURLResponseCopySuggestedFilename
CFURLCacheSetMemoryCapacity
CFURLCacheSetDiskCapacity

Вот полный список нарушений, обнаруженных Apple:

Использование непубличных API-интерфейсов может привести к ухудшению взаимодействия с пользователем, если эти API-интерфейсы изменятся в будущем, и поэтому не разрешено. В ваше приложение включены следующие закрытые API:

NSAccessibilityCreateAXUIElementRef NSAccessibilityHandleFocusChanged NSAccessibilityUnregisterUniqueIdForUIElement NSAppKitPropertyCreator NSCarbonWindowPropertyTag NSMouseMovedNotification _NSDrawCarbonThemeBezel _NSDrawCarbonThemeListBox _NSPopUpCarbonMenu3 _NXShowKeyAndMain из рамок: '/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit'

AXTextMarkerCreate AXTextMarkerGetBytePtr AXTextMarkerGetLength AXTextMarkerGetTypeID AXTextMarkerRangeCopyEndMarker AXTextMarkerRangeCopyStartMarker AXTextMarkerRangeCreate AXTextMarkerRangeGetTypeID CTLineCreateWithUniCharProvider CoreDragGetCurrentDrag CoreDragSetImage из рамок: '/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices'

GetNativeWindowFromWindowRef TSMGetInputSourceProperty из фреймворка: '/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon'

CFReadStreamSignalEvent _CFAppVersionCheckLessThan _CFBundleSetDefaultLocalization _CFStringGetUserDefaultEncoding из фреймворка: '/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation'

CFHTTPCookieStorageCopyCookiesForURL CFHTTPCookieStorageDeleteCookie CFHTTPCookieStorageGetCookieAcceptPolicy CFHTTPCookieStorageSetCookieAcceptPolicy CFHTTPCookieStorageSetCookies CFURLCacheCopyResponseForRequest CFURLCacheSetDiskCapacity CFURLCacheSetMemoryCapacity CFURLRequestCreateMutableCopy CFURLResponseCopySuggestedFilename CFURLResponseGetExpectedContentLength CFURLResponseGetHTTPResponse CFURLResponseGetMIMEType CFURLResponseGetURL CFURLResponseSetExpectedContentLength CFURLResponseSetMIMEType _CFNetworkHTTPConnectionCacheGetLimit _CFNetworkHTTPConnectionCacheSetLimit _CFURLCacheCopyCacheDirectory _CFURLRequestCreateArchiveList _CFURLRequestCreateFromArchiveList _CFURLResponseCreateArchiveList _CFURLResponseCreateFromArchiveList _CFURLResponseGetSSLCertificateContext _LSGetCurrentApplicationASN _LSSetApplicationInformationItem _kLSDisplayNameKey kCFStreamPropertyCONNECTAdditionalHeaders kCFStreamPropertyCONNECTProxy kCFStreamProp ertyCONNECTProxyHost kCFStreamPropertyCONNECTProxyPort kCFStreamPropertyCONNECTResponse kCFURLResponseExpectedContentLengthUnknown из фреймворка: '/System/Library/Frameworks/CoreServices.framework/Versions/A/

NSPopAutoreleasePool NSPushAutoreleasePool из фреймворка: '/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation'

CARenderCGDestroy CARenderCGNew CARenderCGRender CARenderNotificationAddObserver CARenderNotificationRemoveObserver CARenderServerGetPort CARenderServerStart CARenderUpdateAddContext CARenderUpdateAddRect CARenderUpdateBegin CARenderUpdateAddRect CARenderUpdateBegin CARenderUpdateontext framework/CoreCoreverSupport /

Если в исходном коде вы определили методы с теми же именами, что и упомянутые выше API, мы предлагаем изменить имена методов, чтобы они больше не конфликтовали с частными API Apple, чтобы ваше приложение не было помечено в будущих отправках.

Кроме того, один или несколько из вышеупомянутых API могут находиться в библиотеке, включенной в ваше приложение. Если у вас нет доступа к исходному тексту библиотеки, вы можете выполнить поиск в скомпилированном двоичном файле с помощью инструментов командной строки «strings» или «otool». Инструмент «strings» может выводить список методов, которые вызывает библиотека, а «otool -ov» выводит структуры классов Objective-C и их определенные методы. Эти методы могут помочь вам сузить круг проблем, связанных с кодом.


person Stephen Cheng    schedule 28.12.2012    source источник
comment
Может быть, стоит упомянуть, какую версию Qt вы используете?   -  person Timo Geusch    schedule 29.12.2012


Ответы (1)


Я наконец нашел место, где называются эти так называемые приватные API. Они вызываются изнутри webkit. webkit использует библиотеку системного интерфейса webkit, которая поставляется напрямую из Apple в формате скомпилированной статической библиотеки + заголовочный файл. В частности, это четыре файла, расположенные по пути src \ 3rdparty \ webkit \ WebKitLibraries:

libWebKitSystemInterfaceLeopard.a libWebKitSystemInterfaceLion.a libWebKitSystemInterfaceMountainLion.a libWebKitSystemInterfaceSnowLeopard.a

Мне всегда было интересно, действительно ли это частный api, кто еще мог бы знать, как его вызвать без какой-либо документации? Оказалось, что это само яблоко. Поскольку ни у Nokia, ни у Digia нет исходного кода этих библиотек, они, вероятно, ничего не могут с этим поделать.

Разве это не иронично, что любые приложения на основе qtwebkit будут отклонены Apple из-за частного доступа к API из созданных библиотек?

Пожалуйста, поправьте меня, если я ошибаюсь или что-то упускаю. Я очень надеюсь, что ошибаюсь.

person Stephen Cheng    schedule 14.01.2013
comment
Против какой версии QT вы строите? - person netflux; 19.01.2013
comment
Вы когда-нибудь одобряли свое приложение? - person netflux; 23.03.2013