【问题标题】:Network connection was lost during `application:openURL:options``application:openURL:options` 期间网络连接丢失
【发布时间】:2020-05-08 12:39:04
【问题描述】:

我们正在使用深层链接来完成对我们正在开发的应用的验证。所述深层链接导致应用委托方法:

- (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>"

我有一个相当广泛的谷歌,似乎暗示这可能是在后台发出网络请求时引起的,但是苹果在文档中非常清楚地说明了这种方法:

如果在您的应用暂停或在后台运行时到达 URL,系统会在调用此方法之前将您的应用移至前台。

有什么我们不应该在这里做的吗?有没有其他人看到过类似的问题?

更新

在应用程序启动后第一次打开链接时,这似乎工作正常,但随后的调用失败。似乎没有任何东西以不同的顺序被调用,所以我们为什么会看到这种模式非常令人困惑!

【问题讨论】:

    标签: ios react-native networking nsurlsession deep-linking


    【解决方案1】:

    我也遇到了同样的问题,我注意到这种情况只发生在简短的链接中。根据文件,短链接与网络有关。

    要创建一个简短的动态链接,请以相同的方式构建一个 DynamicLinkComponents,然后调用 short()。

    建立一个短链接需要一个网络调用,所以不是直接返回链接,shortcut() 接受一个完成处理程序,该处理程序在请求完成时调用。例如:

    我猜苹果 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;
    }
    

    这对我有用。干杯。

    【讨论】:

      【解决方案2】:

      这是一个已知问题,URLSession 被保留,但底层 TCP 套接字被操作系统回收,Apple 支持建议的几个解决方案可以在 here 中看到。

      在我的场景中,我不想在 React Native 中使用内部 URLSession 用法,所以我们现在只需重试一次请求就可以了!

      【讨论】:

        猜你喜欢
        • 2013-09-02
        • 1970-01-01
        • 2015-12-27
        • 2014-09-03
        • 1970-01-01
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        相关资源
        最近更新 更多