我正在研究我的React-Native应用程序,我想改进离线交互及其工作方式。 当应用程序加载时,我们会获取API以显示所有需要的信息。但是,当用户离线时,我希望将所有请求保存在队列中,并在网络状态从离线状态更改为在线状态时触发它们。
即使在启动时网络状态为在线时,提取功能完全正常,但在离线时(正常),我总是有Network request failed
。但棘手的标准是在这里:即使NetInfo.isConnected。事件侦听器检测从离线到在线的连接变化,当我们重新触发获取功能时,即使是等待10次,也总是导致Network request failed
。
我没有任何线索,我会感激一些帮助!
在开发模式下测试Android设备&&在发布模式下在Android设备上测试
以下是代码的相关部分:
获取请求
const getLastNotification = () =>
{
console.log('TRYING TO GET LAST NOTIFICATION')
return (
fetch(`${API}/getLastNotification`, {
method: 'GET',
headers:
{
'Content-Type': 'application/json',
auth: AUTHCODE
}
})
.then(async (response) =>
{
const json = await response.json();
return (json)
})
.catch(err => onError(err, () => getLastNotification()))
);
};
const onError = (err, func) =>
{
if (err)
console.warn(err.message);
setPendingFetch(func);
};
队列
const PENDING_FETCH = [];
const getPendingFetch = () => PENDING_FETCH;
const setPendingFetch = (newFunction) =>
{
if (!PENDING_FETCH.includes(newFunction))
PENDING_FETCH.push(newFunction);
};
连接更改处理程序
handleConnectionChange = (isConnected) =>
{
console.log('Then, is ' + (isConnected ? 'online' : 'offline'));
if (isConnected)
{
const allPendingFetch = getPendingFetch();
setTimeout(() =>
{
allPendingFetch.forEach(each => each());
}, 5000);
}
}
即使使用这种handleConnectionChange它也无法正常工作
handleConnectionChange = (isConnected) =>
{
console.log('Then, is ' + (isConnected ? 'online' : 'offline'));
if (isConnected)
{
fetch(`${API}/`, {
method: 'POST',
headers: {'Content-Type': 'application/json'}
})
.catch(err => console.warn(err.message)) //Network request failed
}
}
谢谢!
编辑(评论中)
好的,经过一些测试后,几乎没有更新:在将网络状态更改为在线后的2分钟内,获取请求捕获错误(网络请求失败),然后,在2分钟之后,请求正在运行。很好,但我不希望我的用户等待2分钟......任何想法为什么? :)
答案 0 :(得分:0)
我通过深入了解Fetch和XMLHttpRequest文件找到答案。
通过显示一些分步记录,我发现了一个错误:'java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。'
为简单起见,这是API上的SSL证书错误。如果您遇到同样的问题,可以在终端
中触发此命令openssl s_client -debug -connect yourdomain.com:443
如果你在输出中有这一行
Verify return code: 21 (unable to verify the first certificate)
这可能是因为CRT文件配置错误。 在我的情况下,我的提供商只是通过邮件发送给我两个文件,我不得不去它的网站下载所有文件(3个CRT文件),然后按正确的顺序链接它们(myDomain.crt - AddTrust_External_CA_Root.crt - COMODO_RSA_Certification_Authority.crt )使用此命令
$ cat myDomain.crt AddTrust_External_CA_Root.crt COMODO_RSA_Certification_Authority.crt > myFinalDomain.crt
然后用我的服务器替换我的服务器上的CRT文件。