我得到了大约SSL Error个(这导致我的项目停止/挂起而没有崩溃,因为我有一个DispatchGroup在等待请求),我不知道它们是如何产生的,它们是什么,或者如何处理它.

我已经读了很多关于这个问题的第roughly页,但是没有太多文档或有相同问题的人.我试了changing the info.plist次,但似乎没用.这两个plist都是这样的:(accounts.spotify.com是访问令牌请求的URL所在的域)

enter image description here

当我向服务器发出请求时,我可以看到我的代码失败了.(这在我的框架内).如前所述,我有一个DispatchGroup等待这个请求,但代码停止.

self.currentToken = try self.spotifyRequest("https://accounts.spotify.com/api/token", method: .post, parameters: parameters)

我的请求方法:

private func spotifyRequest(_ url: URLConvertible, method: HTTPMethod, parameters: Parameters? = nil, headers: HTTPHeaders? = nil) throws -> JSONStandard {
    // Create a dispatch group to handle threads
    let group = DispatchGroup()
    group.enter()

    // Status of the request (starts as nil)
    var status: JSONStandard?


    DispatchQueue.global(qos: .userInitiated).async {
        Alamofire.request(url, method: method, parameters: parameters, headers: headers).responseJSON(completionHandler: { response in
            // Check if response is valid
            if let requestResponse = response.result.value as? JSONStandard {
                status = requestResponse
            } else {
                status = nil
            }

            // Let the next tasks be completed, it has finished waiting for the request
            group.leave()
        })
    }


    // Wait for a result
    group.wait()

    // Return value or throw an error
    if let safeStatus = status {
        return safeStatus
    } else {
        getAccessToken()
        throw SpotifyError.failedToCompleteRequest
    }
}

我不确定是什么导致了这个问题,因为我所做的只是再次对框架进行了轻微的编辑和归档.

然而,早些时候它对这两个都有效(因为我使用的是this universal framework script)

这是我的事故记录(我一点都不懂!):

2018-08-18 21:36:45.747984+0100 Songvote[4854:1517160][BoringSSL]BoringSSL_session_errorlog(224)[C2.1:2][0x107d7c600][BoringSSL_session_read]SSL_ERROR_SSL(1):库内的操作失败

2018-08-18 21:36:45.748123+0100歌曲投票[4854:1517160][BoringSSL]BoringSSL_会话_握手_错误_打印(205)[C2.1:2][0x107d7c600]4427428040:错误:10000D7:SSL routine :OPENSSL_内部:SSL_握手失败:/BuildRoot/Library/Caches/com.苹果xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_-lib.抄送:1081:

2018-08-18 21:36:45.748238+0100 Songvote[4854:1517160][BoringSSL]BoringSSL_session_errorlog(224)[C2.1:2][0x107d7c600][BoringSSL_session_read]SSL_ERROR_SSL(1):库内的操作失败

[openc2/SSL-buildu:SSL-SSL-tu.com]内部握手错误[0xc6:u]1000ssl-tu:SSL-tu:SSL-tu-tu.苹果xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_-lib.抄送:1081:

2018-08-18 21:36:45.754554+0100 Songvote[4854:1517160][BoringSSL]BoringSSL_session_errorlog(224)[C2.1:2][0x107d7c600][BoringSSL_session_read]SSL_ERROR_SSL(1):库内的操作失败

2018-08-18 21:36:45.754640+0100歌曲投票[4854:1517160][BoringSSL]BoringSSL_会话_握手_错误_打印(205)[C2.1:2][0x107d7c600]4427428040:错误:10000D7:SSL routine :OPENSSL_内部:SSL_握手失败:/BuildRoot/Library/Caches/com.苹果xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_-lib.抄送:1081:

2018-08-18 21:36:45.754717+0100 Songvote[4854:1517160][BoringSSL]BoringSSL_session_errorlog(224)[C2.1:2][0x107d7c600][BoringSSL_session_read]SSL_ERROR_SSL(1):库内的操作失败

2018-08-18 21:36:45.754796+0100歌曲投票[4854:1517160][BoringSSL]BoringSSL_会话_握手_错误_打印(205)[C2.1:2][0x107d7c600]4427428040:错误:10000D7:SSL routine :OPENSSL_内部:SSL_握手失败:/BuildRoot/Library/Caches/com.苹果xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_-lib.抄送:1081:

2018-08-18 21:38:43.427156+0100 Songvote[4854:1517503][BoringSSL]nw_协议_BoringSSL_获取_输出_帧(1301)[C1.1:2][0x107e1b4c0]获取输出帧失败,状态8196

2018-08-18 21:38:43.427656+0100 Songvote[4854:1517503][BoringSSL]nw_协议_BoringSSL_获取输出_帧(1301)[C1.1:2][0x107e1b4c0]获取输出帧失败,状态8196

2018-08-18 21:38:43.429723+0100 Songvote[4854:1517503]TIC读取状态[1:0x0]:1:57

2018-08-18 21:38:43.429976+0100 Songvote[4854:1517503]TIC读取状态[1:0x0]:1:57

2018-08-18 21:38:46.008365+0100 Songvote[4854:1517503][BoringSSL]nw_协议_BoringSSL_获取_输出_帧(1301)[C2.1:2][0x107d7c600]获取输出帧失败,状态8196

2018-08-18 21:38:46.008664+0100 Songvote[4854:1517503][BoringSSL]nw_协议_BoringSSL_获取_输出_帧(1301)[C2.1:2][0x107d7c600]获取输出帧失败,状态8196

2018-08-18 21:38:46.010037+0100 Songvote[4854:1517503]TIC读取状态[2:0x0]:1:57

2018-08-18 21:38:46.010215+0100 Songvote[4854:1517503]TIC读取状态[2:0x0]:1:57

enter image description here

这是一个从SpotifyAlamofire的请求,它以前工作过,现在神秘地不工作.它在我的设备OR模拟器上不工作.

这是与安全的互联网连接有关的问题吗?或者这是另一个问题?

我看到的一些链接:

Edits:

这是Spotify服务器上的问题吗?还是Xcode 10中的一个bug?我把我的framework .swift文件移到了我的项目中,但仍然得到了日志(log).

奇怪的是,在我提出请求之前,我也会遇到这些错误?.

这就是握手错误,但我不做任何配置:

SSL握手在浏览器向Web服务器发出安全连接请求时启动.服务器向您的计算机发送公钥,您的计算机根据已知的证书颁发机构列表判断证书...通过故意导致握手失败来测试SSL功能.

我甚至试着在早期版本上使用git来逆转所有的更改(在早期版本中,它肯定工作得很好),这对这个没有影响.


Edit: The temporary solution:

iOS 12似乎不再适用于这些网络请求.我两天前给苹果发了一份错误报告,希望他们能尽快解决.那我做了什么?

现在,我的iPhone 7没用了,因为我在iOS 12测试版上.所以现在唯一的 Select 就是在模拟器上运行我的项目.要做到这一点(就像你是在Xcode 10测试版,因为模拟器是iOS 12),请转到Xcode -> Preferences -> Components -> iOS 11.4 Simulator,然后下载它.现在,当你 Select 一个模拟器时, Select iOS 11.4.

  • This part is no longer true.

What causes this?

虽然这个错误不会影响任何事情,但它是在iOS 12中运行项目时产生的.据我所知,这不是安全问题.然而,我的代码没有运行的问题是由死锁引起的,而不是我认为是因为这个错误.

Update: What Apple has done about my bug report

嗯,虽然我没有收到苹果的消息或任何东西,但报告被标记为"重复",因为有人在我之前报告过.如果我得到任何关于何时修复的信息,我会在这里更新.


If you have any questions, tips or pointers, please let me know! Thanks in advance!

推荐答案

Deadlock

我假设spotifyRequest将在主线程上调用.

所以如果主线程到达线

group.wait()

还没有调用这一行responseJSON completionHandler:

group.leave()

然后,由于组的调用,主线程被阻塞.在上面等着.

Verfication

为行设置断点

if let safeStatus = status {

表明这条线从未被调用.

Minimal Example that is running

作为一个起点,这里的代码提供了一个最小的例子,提供了一个结果.

import UIKit
import Alamofire

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.contactSpotify {
            print ("result: \(String(describing: $0)) error: \(String(describing: $1))")
        }
    }

    func contactSpotify(completion: @escaping ([String: Any]?, Error?) -> Void) {
        let url = URL(string: "https://accounts.spotify.com/api/token")!
        Alamofire.request(url,
                          method: .post,
                          parameters: ["grant_type": "refresh_token",
                                       "client_id": "<someClientId>",
                                       "refresh_token": "<someRefreshToken>",
                                       "client_secret": "<someClientSecret>"])
            .validate()
            .responseJSON { response in
                guard response.result.isSuccess else {
                    completion(nil, response.result.error)
                    return
                }

                completion(response.result.value as? [String: Any], nil)
        }
    }

}

这在控制台中作为输出提供:

result: Optional(["access_token": XXX, "scope": user-read-email user-read-private, "token_type": Bearer, "expires_in": 3600]) error: nil

见截图:

ATS Settings in info.plist

Spotify在其服务器上提供有效的TLS证书链.因此,信息中不需要ATS设置.普利斯特.

SSL Warnings in Console

当我在像您这样的iOS 12模拟器上运行应用程序时,控制台中会出现同样的SSL警告.尽管如此,连接还是建立了,请求传递了数据.也许这在下一个Beta中消失了.

Swift相关问答推荐

JSON如何解码空对象

如何更新Square Order?

SwiftUI正在初始化不带状态变量的绑定变量

SWIFT:使字典数组值可变

如何使泡泡上的箭头直达封闭矩形

为什么要在SWIFT RandomAccessCollection协议中重新定义元素类型?

在一行语句中比较Date.now的相等性是否安全

如何修改下面的代码,使图像 Select 的顺序与使用快速并发的图像呈现的顺序相匹配?

ScreenCaptureKit/CVPixelBuffer 格式产生意外结果

使用泛型的 Swift 枚举值

为什么 SwiftUI 不在工具栏菜单中反映 @State 属性值?

Swift-如何接受多个(联合)类型作为参数

有什么方法可以快速为泛型参数分配默认值?

如何在填充上添加 if else 语句? SwiftUI

如何更改 Picker 的边框 colored颜色

无法增加系统镜像的大小

Xcode:方法参数的代码完成

Xcode swift ui 错误KeyPathComparator仅在 macOS 12.0 或更高版本中可用

自定义 MKAnnotation 标注视图?

将 UIImage 剪成圆形