【问题标题】:Are performSelector and respondsToSelector banned by App Store?App Store 禁止 performSelector 和 respondsToSelector 吗?
【发布时间】:2017-03-08 02:43:51
【问题描述】:

我的最新版本已被 Apple 应用商店接受,但几天后我收到了下面引用的通知。

我的应用也使用 Rollout.io,我明确询问这是否是问题所在。还没有回复。

如果responsToSelector或performSelector被禁止了,有没有替代品?

尊敬的开发者,

您的应用、扩展程序和/或链接框架似乎包含明确设计的代码,这些代码能够在应用审核批准后更改您的应用的行为或功能,这不符合 Apple 开发者计划许可的第 3.3.2 节协议和 App Store 审查指南 2.5.2。与最初为 App Store 审查时相比,此代码与远程资源相结合,可以促进对应用行为的重大更改。虽然您目前可能没有使用此功能,但它有可能加载私有框架、私有方法并启用未来的功能更改。

这包括将任意参数传递给动态方法的任何代码,例如 dlopen()、dlsym()、respondsToSelector:、performSelector:、method_exchangeImplementations(),以及运行远程脚本以更改应用程序行为或调用 SPI,基于下载脚本的内容。即使远程资源不是故意恶意的,它也很容易被中间人 (MiTM) 攻击劫持,这可能会给您的应用用户带来严重的安全漏洞。

请对您的应用进行深入审查,并删除任何符合上述功能的代码、框架或 SDK,然后再为您的应用提交下一个更新以供审查。

编辑: 苹果论坛提到这一点:https://forums.developer.apple.com/thread/73640

【问题讨论】:

标签: ios app-store respondstoselector


【解决方案1】:

不是responsToSelector:, performSelector: 被禁止的。禁止将动态内容作为此方法的参数。例如,这是不被禁止的:

if([self.delegate respondsToSelector: @selector(myDelegateMethod)]) {
   [self.delegate performSelector: @selector(myDelegateMethod)];
}

但是,此代码可能会被禁止:

NSString *remotelyLoadedString = .... (download from your backend)
[self performSelector: NSSelectorFromString(remotelyLoadedString)];

【讨论】:

    【解决方案2】:

    2017 年 3 月 8 日,Apple 向所有开发者发出 JS 注入警告。这包括以下库:

    • JSPatch
    • Rollout.io
    • AMapFoundation 因为它包括 JSPatch [编辑:他们现在提供了一个没有它的新版本]
    • Bugly 因为它包括 JSPatch [编辑:他们现在提供了一个没有它的新版本]
    • GTSDK 因为它包括 JSPatch [编辑:他们现在提供了一个没有它的新版本]
    • ...

    如果您直接使用 JSPatch 或 Rollout.io 等服务,则应停止使用。

    如果您使用的第三方间接依赖于 JSPatch,您应该请求第三方的更新版本,不再包含 JSPatch。

    【讨论】:

      【解决方案3】:

      dlopen

      dlsym

      respondsToSelector

      执行选择器

      method_exchangeImplementations

      有时有些人曾经认为上述所有方法都被禁止,但确切的问题是,这些方法仅限于使用在运行时生成的参数。例如,

      当我们使用时,

      SEL selector = NSSelectorFromString(@"stopProgress");
      

      允许,但是

      当我们使用时,

      SEL selector = NSSelectorFromString(@"%@", runtimeFunction);
      

      这是不允许的!

      【讨论】:

        【解决方案4】:

        应用商店的通知告诉你具体情况。

        相关功能未被禁止。被禁止的是使用这些功能来规避应用商店审查流程,并执行诸如调用私有 API 或下载和执行代码之类的事情。应用商店应用程序需要将它们运行的​​所有代码编译到其中。他们也不允许使用来自 iOS 的私有 API。如果 API 未记录在案,则属于禁区。

        我的猜测是您确切地知道他们在说什么,并且您正在试图绕过规则。

        如果您不调用私有 API、下载脚本并使用 performSelector 调用它们,那么您应该向应用审查委员会提交申诉,详细说明您正在在做什么,以及如何使用这并不违反应用商店指南。如果您确实没有违反规则并且有正当理由说明您正在做的事情,那么您很可能会推翻您的拒绝,但您需要提供完整的披露和令人信服的论据,说明您为什么要这样做这样做并没有违反 Apple 的规则。

        他们的场地,他们的球,他们的规则。如果您不愿意遵守 Apple 的规则,那么您唯一真正的选择是尝试为越狱设备分发您的应用,但这可能会让您失去开发者计划会员资格。

        编辑:

        根据您在下面的评论,听起来问题在于您正在使用的框架 Rollout.io 正在执行 js 注入,Apple 现在禁止了这种注入。我建议搜索“Rollout.io iOS 应用商店禁令”或类似内容。

        【讨论】:

        • “我猜你很清楚他们在说什么,而你正试图绕过规则。” - 不,我真的不是。我的应用程序尽你所能。但是我内置了 Rollout.io,我怀疑这就是问题所在。
        • 啊。是的,那样就可以了。抱歉,我的假设不好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多