React Native —使用fetch()的陷阱

使用fetch()时,您是否曾经被卡住?由于某种原因,尝试从第三方API提取数据时会不断出错? 即使您按照该教程进行操作,您仍在按照作者编写的方式进行操作? 我最近陷入困境,直到2016年12月的某个时候才发现这不是问题。这就是我所发现的。

Apple默认为与iOS 9.0或OS X v10.11 SDK链接的应用程序启用应用程序传输安全性(ATS)。 在本机中,这些设置在ios / {您的项目名称}文件夹下的info.plist文件中。

0.28之前的react-native版本默认将info.plist中的命令默认为允许使用以下代码的非安全请求(即http):

上面的代码允许您的fetch()命令使用http或https uri。 但是,Apple宣布,在2016年12月之后,所有将此键的值设置为True的应用程序都会触发App Store的自动审核,并且需要证明其合理性。 请参阅此处的Apple ATS文档:https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33。

结果,react native更改了默认的info.plist代码以使其与Apple的ATS策略保持一致,并对该代码进行了结构化,以专门标识将允许进行非安全访问的每个域。 因此,现在info.plist中的默认代码如下所示:

该应用仅允许在没有安全连接的情况下访问localhost ,必须通过https访问所有其他域。 当您要访问未使用https提供服务的第三方API时,会出现问题。 为此,您必须在NSExceptionDomains下添加另一个。 例如,假设您的API位于testapi.com。 您需要打开info.plist并将其添加到异常域列表中,如下所示:

现在,您的应用应该停止引发安全错误,并且fetch()命令应该可以正常工作。

请记住,每当您的应用程序需要访问不使用安全连接的第三方URL时,请确保通过在info.plist文件中添加域来解决该问题。