我的最新版本已被Apple应用商店接受,但我在几天后收到了下面引用的通知。
我的应用也使用Rollout.io,我明确询问这是否是问题所在。暂无回应。
如果禁止使用respondsToSelector或performSelector,是否有替换?
亲爱的开发者,
您的应用,扩展程序和/或链接框架似乎包含明确设计的代码,可以在App Review批准后更改应用的行为或功能,但这不符合Apple开发人员计划许可的第3.3.2节协议和App Store审查指南2.5.2。与最初针对App Store进行审核时相比,此代码与远程资源相结合,可以促进应用程序行为的重大更改。虽然您当前可能没有使用此功能,但它有可能加载私有框架,私有方法并启用将来的功能更改。
这包括将任意参数传递给动态方法的任何代码,例如dlopen(),dlsym(), respondsToSelector:,performSelector :,method_exchangeImplementations(),以及运行远程脚本以更改应用程序行为或调用SPI,基于下载脚本的内容。即使远程资源不是故意恶意的,它也很容易被中间人(MiTM)攻击劫持,这可能给你的应用用户带来严重的安全漏洞。
在为您的应用提交下一个更新以供审核之前,请对您的应用进行深入审核并删除符合上述功能的所有代码,框架或SDK。
修改: Apple论坛提到:https://forums.developer.apple.com/thread/73640
答案 0 :(得分:6)
它不是respondsToSelector:,performSelector:被禁止的。禁令是将动态内容作为此方法的参数。例如,这不是禁止的:
if([self.delegate respondsToSelector: @selector(myDelegateMethod)]) {
[self.delegate performSelector: @selector(myDelegateMethod)];
}
但是,此代码可能会被禁止:
NSString *remotelyLoadedString = .... (download from your backend)
[self performSelector: NSSelectorFromString(remotelyLoadedString)];
答案 1 :(得分:2)
2017年3月8日,Apple警告JS注入的所有开发者。这包括像:
这样的图书馆如果您直接使用JSPatch或Rollout.io等服务,则应停止使用它。
如果您使用的是间接依赖JSPatch的第三方,则应该请求不再包含JSPatch的第三方更新版本。
答案 2 :(得分:0)
应用程序商店通知告诉您具体情况。
有关功能未被禁止。禁止使用这些功能来规避应用商店审核流程,并执行调用私有API或下载和执行代码等操作。应用程序商店应用程序需要将它们运行的所有代码编译到其中。它们也不允许使用iOS的私有API。如果未记录API,则不受限制。
我的猜测是,你确切地知道他们在谈论什么,而你 试图绕过这些规则。
如果您没有调用私有API,下载脚本并使用performSelector来调用它们,那么您应该向应用审核委员会提交申诉,详细说明 做什么,以及如何它不违反应用商店指南。如果你真的没有违反规则,并且有正当理由知道你正在做什么,那么你很可能会推翻你的拒绝,但你需要提供完整的披露和令人信服的论据,为什么你正在做的不是打破Apple的规则。
他们的领域,他们的球,他们的规则。如果您不愿意遵守Apple的规则,那么您唯一真正的选择就是尝试为越狱设备分发您的应用程序,但这可能会让您失去开发者计划会员资格。
根据你在下面的评论,听起来问题是你正在使用的框架Rollout.io正在进行js注入,Apple现在禁止它。我建议搜索“Rollout.io iOS app store ban”或类似内容。
答案 3 :(得分:0)
有时人们常常认为上述所有方法都被禁止,但确切的问题是,这些方法仅限于使用在运行时生成的参数。例如,
当我们使用时,
SEL selector = NSSelectorFromString(@"stopProgress");
允许,但
当我们使用时,
SEL selector = NSSelectorFromString(@"%@", runtimeFunction);
不允许!