这被认为是在iPhone开发中使用私有函数,因此是非法的吗?

时间:2009-09-07 07:07:21

标签: iphone uiwebview scroll private api

我正在尝试禁用UIWebView的滚动,我找到的唯一方法是使用这种方式:

#import <objc/runtime.h>

id scroller = [[Webview subviews] lastObject];
int count;
Method *method = class_copyMethodList([scroller class], &count);
int i;
for (i=0; i<count; i++) {
    if (strcmp(method_getName(method[i]), "setScrollingEnabled:") == 0)
        break;
}
IMP test = method_getImplementation(method[i]);
test(scroller, @selector(setScrollingEnabled:), NO);

这被认为是使用iPhone SDK的非法方式吗?这会导致我的应用程序被App Store拒绝吗?

7 个答案:

答案 0 :(得分:4)

这样做不会简单得多:

if ([scroller respondsToSelector: @selector(setScrollingEnabled:)]) [scroller setScrollingEnabled: NO]

这避免了他们可能扫描你的二进制文件的任何潜在方法调用(不确定他们如何验证'合法性')。它仍然不是100%犹太洁食,但绝对更安全。

答案 1 :(得分:2)

由于使用了setScrollingEnabled,我的应用程序被拒绝了,所以请小心!

他们的消息:“您的应用程序中包含的非公共API是setScrollingEnabled”

答案 2 :(得分:2)

如果方法不在.h文件中,则它是私有的。这是一个非常简单的规则。您需要为简单的消息发送执行任何运行时“shenanigans”的事实应该说明。

答案 3 :(得分:1)

是的,这被认为是非法的。我实际上收到了一个'警告',说setSCrollingEnabled是私有框架的一部分。他们批准了该应用,但表示我需要删除此电话,以便我提交下一次更新。

答案 4 :(得分:1)

这有效 -

UIScrollView *scrollView = [[myWebView subviews] lastObject];
scrollView.scrollEnabled = FALSE;

这解决了问题,同时还保持链接可点击,任何滚动视图嵌入可滚动,并仅使用公共API。

我发现javascript解决方案阻止了WebViews嵌入UIScrollView并将userInteractionEnabled设置为false以防止WebView中的链接被点击,从而无法正常工作。

答案 5 :(得分:0)

这可能是有问题的,但只要你在/无法找到方法时有回退行为,这不是拒绝的原因。有更糟糕的滥用已经过去了。

答案 6 :(得分:0)

好吧,也许他们认为你是用另一种方式做的,比如获取屏幕外UIWebView的内容并将其显示在普通的UIIMage视图中,或者取一个页面的HTML内容限制其大小并将其呈现在UIWebView中。 / p>