React Native、JSPatch等被appstore禁止的猜想

大早上就收到了一个苹果发来的邮件,邮件的大致内容就是我应用内使用了JS等热更新方案,通过网络请求会更改应用的界面和功能。主要涉及dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations()这几个函数。我这个应用是以前审核通过的,现在才发,应该是苹果复查的结果,但是只是收到邮件,并没有下架。然后搜索了下,发现JSPatch、RN、WEEX全都炸锅了。

一、RN的回复

从facebook/react-native这个官方回复来看,应该和RN自身没多大关系,应该还是安全的

ide的回复:

到目前为止我听说的事情:许多开发者收到这个邮件,是因为使用了一个叫Rollout.js(译者补充:国内更多的是JSPatch,以及一些直接或间接依赖了JSPatch的第三方库如bugtags、个推等,请关注对应库的更新)的框架,所以请再次检查你的app有没有使用类似的框架。仔细阅读邮件中的描述,里面并不涉及RN或者RN所做的事情。

另外,你也需要检查你没有使用某些第三方的RN模块,如果它们调用了dlopen或者类似的邮件中描述的动态函数也可能会被苹果警告或禁止。

grabbou的回复:

苹果开发者协议3.3.2节:

一个应用程序不应该下载或安装任何可执行代码。解释执行的代码可以在应用内使用,如果所有的脚本、代码、和解释器都被打包在应用内而没有被下载。前述内容的唯一的例外在于下载的脚本和代码使用了Apple内置的WebKit框架或JavascriptCore,并且对应的脚本或代码并没有改变这个应用提供功能和特性的主要目的,与提交到AppStore的版本以及相应的宣传描述相符。

其中重要的地方:

一个应用程序不应该下载或安装任何可执行代码
React Native没有做这件事情。所以React Native不会让你受前述条款的影响。

另一方面,使用React Native,你还可能会使用叫做OTA更新的方式(俗称热更新),类似Code Push或中文网提供此热更新服务。这同样是被3.3.2章节的后续内容允许的:

前述内容的唯一的例外在于下载的脚本和代码使用了Apple内置的WebKit框架或JavascriptCore

所以这事情和React Native并无卵关系。我觉得收到邮件的人应该关注和苹果的交流,再次检查是什么导致了这个警告。

从RN的回复来看,主要是因为国内的一些使用了JSPatch,或者你的某个SDK里面使用了这个东西,比如上面所说的个推的SDK。

二、JSPatch的回复

在github上并没有看到bang590/JSPatch的官方回复,但是有一个网友的推测是批量扫描runtime并且群发的,苹果没办法批量检测remote script,所以机智的检测可能使用到的runtime方法。

让下载脚本代码使用runtime实现的的人下一个版本改掉.如果不改.就被下架被拒绝上架. JSPatch是"下载脚本代码且使用runtime",所以react native ,weex都会有这种提示。

三、总结

现在还在观望,收到这个警告主要是,类似JSPatch这样的远程更新代码的机制,可以调用这些动态方法来hack你的app。就算你自己开发中没有使用,但是如果引入的SDK或者第三方库照样会被检测到警告,所以估计现在就算没有下架,如果下个版本还是使用这种估计就要悲剧了,难道原生开发的春天来了,哈哈。

四、猜测

就像14年那段时间,苹果AppStore似乎加强了对WebApp的管控, 很多过去能上架的使用WebApp+Native壳的应用陆陆续续的都被拒了。引用一下那时候的H5的观点,感觉就和现在的差不多、

那时候是如果你的应用是一个Webapp, 那么请以网页的形式发布你的产品就好了, 不要放到AppStore里, AppStore不接收WebApp。

所以 一个合法的应用被拒绝的原因笼统的说只有三点: 1 违规(调用不该调用的方法,做了危险的事情,山寨抄袭等等) 2 苹果觉得应用不够好 3 觉得放到AppStore里不合适.

前两点不用说大家都懂, 而最后一点我想是大量WebApp被拒绝的一个主要原因: 完全没有使用或者没必要使用任何Native的技术,在网页里也能跑. 通常这种应用只是把AppStore当做一个发行渠道.

我也承认, AppStore有很多过分的要求, 但是这些绝对不是针对HTML5和WebApp来的.(例如 禁止远程修改代码, 禁止绕过appstore直接内部更新版本等等)

所以我们没有必要因为几个WebApp被拒就对HTML5在iOS平台上的未来感到担忧.

iOS系统作为对HTML5支持最好的移动平台, 我们没有理由怀疑它对HTML5的态度.

我想,苹果加强对AppStore内WebApp的管理力度, 根本原因只是为了保证AppStore的质量.

当然在整个事件中,苹果也有做的不妥的地方, 他始终没有针对webapp/ Hybrid技术构建的应用提出一个具体的 有章可循的规则说明,给人一种"法无定法"的感觉.

但是随着Hybrid技术和HTML5技术的发展, 我想 苹果会对这个问题慢慢重视起来.

五、警告的原文

Dear Developer,

Your app, extension, and/or linked framework appears to contain code designed explicitly with the capability to change your app’s behavior or functionality after App Review approval, which is not in compliance with section 3.3.2 of the Apple Developer Program License Agreement and App Store Review Guideline 2.5.2. This code, combined with a remote resource, can facilitate significant changes to your app’s behavior compared to when it was initially reviewed for the App Store. While you may not be using this functionality currently, it has the potential to load private frameworks, private methods, and enable future feature changes.

This includes any code which passes arbitrary parameters to dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script. Even if the remote resource is not intentionally malicious, it could easily be hijacked via a Man In The Middle (MiTM) attack, which can pose a serious security vulnerability to users of your app.

Please perform an in-depth review of your app and remove any code, frameworks, or SDKs that fall in line with the functionality described above before submitting the next update for your app for review.

Best regards,

App Store Review

Last modification:March 8th, 2017 at 03:36 pm
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment