`application:openURL:options` 期间网络连接丢失
Network connection was lost during `application:openURL:options`
我们正在使用深度 links 来完成对我们正在开发的应用程序的验证。说深 links 导致应用程序委托方法:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
待召集。此应用程序使用 React Native,使用内置 Linking
API。有时当我们收到 Linking
回调时发出网络请求,但有时我们会收到网络错误:
Task <D47D1F90-E2D1-4AB7-8706-8737B68CC5E8>.<180> finished with error [-1005] Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={_kCFStreamErrorCodeKey=53, NSUnderlyingError=0x283352ac0 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={NSErrorPeerAddressKey=<CFData 0x281ed9130 [0x1e9babcb0]>{length = 16, capacity = 16, bytes = 0x100201bb34d2847e0000000000000000}, _kCFStreamErrorCodeKey=53, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <D47D1F90-E2D1-4AB7-8706-8737B68CC5E8>.<180>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <D47D1F90-E2D1-4AB7-8706-8737B68CC5E8>.<180>"
我有一个相当广泛的 google 并且似乎表明这可能是在后台发出网络请求时引起的,但是 Apple 在文档中非常清楚地说明了这种方法:
If a URL arrives while your app is suspended or running in the background, the system moves your app to the foreground prior to calling this method.
有什么我们不应该在这里做的吗?有没有其他人看到过类似的问题?
更新
在应用程序启动后第一次打开 link 时似乎工作正常,但后续调用失败。似乎没有任何东西以不同的顺序被调用,所以我们会看到这种模式非常令人困惑!
这是一个已知问题,URLSession
被保留但底层 TCP 套接字被 OS 回收,Apple 支持人员提出了几个解决方案,可以看到 here.
在我的场景中,我不想玩弄 React Native 中的内部 URLSession
用法,所以我们现在只需重试一次请求就可以了!
我遇到了同样的问题,我注意到只有 link 的缩写形式才会出现这种情况。根据文档,短link与网络有关。
To create a short Dynamic Link, build a DynamicLinkComponents the same way, and then call shorten().
Building a short link requires a network call, so instead of directly returning the link, shorten() accepts a completion handler, which is called when the request completes. For example:
我猜测 apple API 或 firebase API 存在网络问题。
所以这是我的解决方案。我创建了一个名为 handleUniversalLinkDelayNetorkCall 的新类别和函数。我从 handleUniversalLink 移动了所有源代码,并在延迟一段时间后调用 resolveShortLink。
对不起我的英语,请查看完整的源代码。
@implementation FIRDynamicLinks (FIRDynamicLinks_HandleUniversalLink_BugFixed)
- (BOOL)handleUniversalLinkDelayNetorkCall:(NSURL *)universalLinkURL completion:(FIRDynamicLinkUniversalLinkHandler)completion {
if ([self matchesShortLinkFormat:universalLinkURL]) {
// delay call
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
__weak __typeof__(self) weakSelf = self;
[self resolveShortLink:universalLinkURL
completion:^(NSURL *url, NSError *error) {
__typeof__(self) strongSelf = weakSelf;
if (strongSelf) {
FIRDynamicLink *dynamicLink = [strongSelf dynamicLinkFromCustomSchemeURL:url];
dispatch_async(dispatch_get_main_queue(), ^{
completion(dynamicLink, error);
});
} else {
completion(nil, nil);
}
}];
});
return YES;
} else {
FIRDynamicLink *dynamicLink = [self dynamicLinkFromUniversalLinkURL:universalLinkURL];
if (dynamicLink) {
completion(dynamicLink, nil);
return YES;
}
}
return NO;
}
这对我有用。干杯。
我们正在使用深度 links 来完成对我们正在开发的应用程序的验证。说深 links 导致应用程序委托方法:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
待召集。此应用程序使用 React Native,使用内置 Linking
API。有时当我们收到 Linking
回调时发出网络请求,但有时我们会收到网络错误:
Task <D47D1F90-E2D1-4AB7-8706-8737B68CC5E8>.<180> finished with error [-1005] Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={_kCFStreamErrorCodeKey=53, NSUnderlyingError=0x283352ac0 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={NSErrorPeerAddressKey=<CFData 0x281ed9130 [0x1e9babcb0]>{length = 16, capacity = 16, bytes = 0x100201bb34d2847e0000000000000000}, _kCFStreamErrorCodeKey=53, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <D47D1F90-E2D1-4AB7-8706-8737B68CC5E8>.<180>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <D47D1F90-E2D1-4AB7-8706-8737B68CC5E8>.<180>"
我有一个相当广泛的 google 并且似乎表明这可能是在后台发出网络请求时引起的,但是 Apple 在文档中非常清楚地说明了这种方法:
If a URL arrives while your app is suspended or running in the background, the system moves your app to the foreground prior to calling this method.
有什么我们不应该在这里做的吗?有没有其他人看到过类似的问题?
更新
在应用程序启动后第一次打开 link 时似乎工作正常,但后续调用失败。似乎没有任何东西以不同的顺序被调用,所以我们会看到这种模式非常令人困惑!
这是一个已知问题,URLSession
被保留但底层 TCP 套接字被 OS 回收,Apple 支持人员提出了几个解决方案,可以看到 here.
在我的场景中,我不想玩弄 React Native 中的内部 URLSession
用法,所以我们现在只需重试一次请求就可以了!
我遇到了同样的问题,我注意到只有 link 的缩写形式才会出现这种情况。根据文档,短link与网络有关。
To create a short Dynamic Link, build a DynamicLinkComponents the same way, and then call shorten().
Building a short link requires a network call, so instead of directly returning the link, shorten() accepts a completion handler, which is called when the request completes. For example:
我猜测 apple API 或 firebase API 存在网络问题。
所以这是我的解决方案。我创建了一个名为 handleUniversalLinkDelayNetorkCall 的新类别和函数。我从 handleUniversalLink 移动了所有源代码,并在延迟一段时间后调用 resolveShortLink。
对不起我的英语,请查看完整的源代码。
@implementation FIRDynamicLinks (FIRDynamicLinks_HandleUniversalLink_BugFixed)
- (BOOL)handleUniversalLinkDelayNetorkCall:(NSURL *)universalLinkURL completion:(FIRDynamicLinkUniversalLinkHandler)completion {
if ([self matchesShortLinkFormat:universalLinkURL]) {
// delay call
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
__weak __typeof__(self) weakSelf = self;
[self resolveShortLink:universalLinkURL
completion:^(NSURL *url, NSError *error) {
__typeof__(self) strongSelf = weakSelf;
if (strongSelf) {
FIRDynamicLink *dynamicLink = [strongSelf dynamicLinkFromCustomSchemeURL:url];
dispatch_async(dispatch_get_main_queue(), ^{
completion(dynamicLink, error);
});
} else {
completion(nil, nil);
}
}];
});
return YES;
} else {
FIRDynamicLink *dynamicLink = [self dynamicLinkFromUniversalLinkURL:universalLinkURL];
if (dynamicLink) {
completion(dynamicLink, nil);
return YES;
}
}
return NO;
}
这对我有用。干杯。