如何在Mac Qt App中查找非公共API的用法

时间:2012-12-28 22:20:34

标签: macos qt webkit app-store qtwebkit

我们基于qtwebkit的应用程序在提交到mac app store后被苹果拒绝。拒绝的原因之一是使用非公共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 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中的一个或多个可以驻留在a中   您的应用程序附带的库。如果您无权访问   在库的源代码中,您可以搜索已编译的二进制文件   使用“strings”或“otool”命令行工具。 “字符串”工具可以   输出库调用的方法列表和“otool -ov”   将输出Objective-C类结构及其定义的结构   方法。这些技巧可以帮助您缩小范围   有问题的代码驻留。

1 个答案:

答案 0 :(得分:2)

我终于找到了这些所谓的私有api被召唤的地方。它们是从webkit内部调用的。 webkit使用webkit系统接口库,该库直接由apple以编译的静态库+头文件的格式提供。更具体地说,它们是位于src \ 3rdparty \ webkit \ WebKitLibraries路径下的四个文件:

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

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

现在具有讽刺意味的是,由于创建了库的私有api访问权限,任何基于qtwebkit的应用程序都会被苹果拒绝吗?

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