2

我们基于 qtwebkit 的应用程序在提交到 mac 应用商店后被苹果拒绝。拒绝的原因之一是使用了非公共 API。我已经在 qtwebkit 的源代码中找到了其中的六个。但我无处可寻其余的。我搜索了我们应用程序的源代码和 QT 的整个源代码。

我在qtwebkit源码中找到的六个非公开api是:

CFHTTPCookieStorageSetCookieAcceptPolicy
CFURLCacheCopyResponseForRequest
CFURLResponseGetMIMEType
CFURLResponseCopySuggestedFilename
CFURLCacheSetMemoryCapacity
CFURLCacheSetDiskCapacity

以下是苹果发现的违规行为的完整列表:

如果这些 API 将来发生变化,使用非公共 API 可能会导致糟糕的用户体验,因此是不允许的。您的应用程序中包含以下非公共 API:

NSAccessibilityCreateAXUIElementRef NSAccessibilityHandleFocusChanged NSAccessibilityUnregisterUniqueIdForUIElement NSAppKitPropertyCreator NSCarbonWindowPropertyTag NSMouseMovedNotification _NSDrawCarbonThemeBezel _NSDrawCarbonThemeListBox _NSPopUpCarbonMenu3 _NXShowKeyAndMain 来自框架:'/System/Library/Frameworks/AppKit.framework/App'Versions/

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 kCFStreamPropertyCONNECTProxyHost kCFStreamPropertyCONNECTProxyPort kCFStreamPropertyCONNECTResponse kCFURLResponseExpectedContentLengthUnknown 从框架:'/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices'

NSPopAutoreleasePool NSPushAutoreleasePool 来自框架:'/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation'

CARenderCGDestroy CARenderCGNew CARenderCGRender CARenderNotificationAddObserver CARenderNotificationRemoveObserver CARenderServerGetPort CARenderServerStart CARenderUpdateAddContext CARenderUpdateAddRect CARenderUpdateBegin CARenderUpdateFinish kCAContextPortNumber 从框架:'/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore'

如果您在源代码中定义了与上述 API 同名的方法,我们建议您更改方法名称,以便它们不再与 Apple 的私有 API 冲突,以避免您的应用程序在以后的提交中被标记。

此外,一个或多个上述 API 可能驻留在应用程序随附的库中。如果您无权访问该库的源代码,则可以使用“strings”或“otool”命令行工具搜索已编译的二进制文件。“strings”工具可以输出库调用的方法列表,“otool -ov”将输出Objective-C类结构及其定义的方法。这些技术可以帮助您缩小有问题的代码所在的位置。

4

1 回答 1

2

我终于追溯到了调用这些所谓的私有 api 的位置。它们是从 webkit 内部调用的。webkit使用的是苹果直接提供的webkit系统接口库,格式为编译后的静态库+头文件。更具体地说,它们是位于路径 src\3rdparty\webkit\WebKitLibraries 下的四个文件:

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

我一直想知道它是否真的是一个私有 api,如果没有任何文档,还有谁知道如何调用它?现在原来是苹果本身。由于 nokia 或 digia 都没有这些库的源代码,因此他们可能无能为力。

现在,由于来自创建的库的私有 api 访问,任何基于 qtwebkit 的应用程序都会被苹果拒绝,这不是很讽刺吗?

如果我错了或遗漏了什么,请纠正我。我真的希望我错了。

于 2013-01-14T04:55:54.793 回答