【问题标题】:Is this considered as using private functions in iPhone dev, and thus illegal?这是否被视为在 iPhone 开发中使用私有功能,因此是非法的?
【发布时间】:2010-11-26 03:41:06
【问题描述】:

我正在尝试禁用 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 拒绝吗?

【问题讨论】:

    标签: iphone uiwebview scroll private api


    【解决方案1】:

    这样做会不会简单很多:

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

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

    【讨论】:

    • 我是这样做的,我的应用还是被拒绝了。
    • 你确定是为了这个?在 iOS 5 中,可以通过 Web 视图上的属性访问 scrollView,因此这不再是什么大问题了。
    • 某些 - 他们提到了 setScrollingEnabled 的名称。知道关于 5.0 很有用,谢谢。我目前正在为 4.0 及更高版本构建。
    • 没有。这也行不通。不应调用该函数(适用于 iOS 6)。改用这个scrollView.scrollEnabled = FALSE;
    【解决方案2】:

    我的应用因为使用了 setScrollingEnabled 而被拒绝,所以当心!

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          这行得通——

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

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

          我发现,如果将 WebView 嵌入到 UIScrollView 中并将 userInteractionEnabled 设置为 false,则 javascript 解决方案会阻止 WebView 正常工作,从而阻止 WebView 中的链接可点击。

          【讨论】:

            【解决方案6】:

            这可能是有问题的,但不是拒绝的原因,只要您在/如果找不到方法时有后备行为。更严重的滥用已经过去了。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 我想知道如何“获取屏幕外 UIWebView 的内容并将其显示在普通的 UIIMage 视图中”。有什么建议吗?
              • 你可以使用-renderInContext。如果您需要更多详细信息,请开始一个新问题,因为很难在 cmets 中发布代码。
              猜你喜欢
              • 1970-01-01
              • 2013-06-20
              • 2018-09-04
              • 1970-01-01
              • 2013-12-08
              相关资源
              最近更新 更多