我收到一些SSL Error
(它们使我的项目停止/挂起,没有崩溃,因为我有一个DispatchGroup
在等待请求),我不知道它们的状态如何原因,原因或解决方法。
我已经阅读了许多有关该问题的页面,大约大约,但是没有太多文档或遇到相同问题的人。我已经尝试过changing the info.plist,但这似乎没有帮助。两个plist
都看起来像这样:(accounts.spotify.com
是访问令牌请求的URL的域)
我向服务器发出请求时,我的代码失败了。 (这是在我的框架中)。如前所述,我有一个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 Songvote [4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205)[C2.1:2] [0x107d7c600] 4427428040:错误:100000d7:SSL例程:OPENSSL_internal:SSL_HANDSHAKE_FAIL :/BuildRoot/Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc: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):内部操作失败库
2018-08-18 21:36:45.748432 + 0100 Songvote [4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205)[C2.1:2] [0x107d7c600] 4427428040:错误:100000d7:SSL例程:OPENSSL_internal:SSL_HANDSHAKE_FAIL :/BuildRoot/Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc: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 Songvote [4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205)[C2.1:2] [0x107d7c600] 4427428040:错误:100000d7:SSL例程:OPENSSL_internal:SSL_HANDSHAKE_FAIL :/BuildRoot/Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc: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 Songvote [4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205)[C2.1:2] [0x107d7c600] 4427428040:错误:100000d7:SSL例程:OPENSSL_internal:SSL_HANDSHAKE_FAIL :/BuildRoot/Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:
2018-08-18 21:38:43.427156 + 0100 Songvote [4854:1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301)[C1.1:2] [0x107e1b4c0]获取输出帧失败,状态8196
2018-08-18 21:38:43.427656 + 0100 Songvote [4854:1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames(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_protocol_boringssl_get_output_frames(1301)[C2.1:2] [0x107d7c600]获取输出帧失败,状态8196
2018-08-18 21:38:46.008664 + 0100 Songvote [4854:1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames(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
这全部是针对通过Spotify
发出的Alamofire
请求,该请求以前有效,但现在神秘地无效。它不能在我的设备 OR 模拟器上工作。
这是与安全的互联网连接有关的问题吗?还是这是另一个问题?
一些链接到我所查看的内容:
编辑:
这是Spotify服务器上的问题吗?还是Xcode 10中的错误?我将框架.swift
文件移到了我的项目中,但仍然获得了日志。
在我提出请求之前,我也收到了这些错误,很奇怪。
这是握手错误,但是我对此不做任何配置:
当浏览器向Web服务器发出安全连接请求时,将启动SSL握手。服务器将公用密钥发送到您的计算机,并且您的计算机根据已知的证书颁发机构列表检查证书。 ...通过故意导致握手失败来测试SSL功能。
我什至尝试使用git
对较早版本进行签出以撤消所有更改(在较早版本中绝对可以正常工作),对此没有任何影响。
编辑:临时解决方案:
似乎iOS 12不再适用于这些网络请求。我两天前向Apple发送了一个错误报告,希望他们能尽快解决。那我该怎么办?
好吧,就目前而言,我的iPhone 7就像在iOS 12 beta上一样没用。因此,目前唯一的选择是在模拟器上运行我的项目。为此(由于模拟器为iOS 12,因此您好像在Xcode 10 beta中一样),请转到Xcode -> Preferences -> Components -> iOS 11.4 Simulator
,然后下载它。现在,当您选择模拟器时,请选择显示iOS 11.4
的模拟器。
这是什么原因造成的?
尽管此错误不应影响任何事情,但它是在iOS 12中运行项目时引起的。据我所知,这不是安全问题。但是,我的代码无法运行的问题是由死锁引起的,而不是我认为的是因为此错误。
更新:Apple对我的错误报告做了什么
好吧,尽管我没有收到Apple的消息或任何东西,但该报告被标记为“重复”,因为其他人在我之前已经报告过此消息。如果我获得有关何时修复的任何信息,请在此处进行更新。
如果您有任何疑问,技巧或指示,请告诉我!预先感谢!
答案 0 :(得分:14)
死锁
我假设SpotifyRequest将在主线程上调用。
因此,如果主线程到达该行
group.wait()
并且还没有调用以下响应JSON完成处理程序
:group.leave()
然后由于上述group.wait()的调用,主线程被阻塞。 由于主线程被阻塞,因此无法调用leave()。古典僵局。
验证
在行上设置断点
if let safeStatus = status {
表明此行从未被调用。
正在运行的最小示例
在这里,作为起步的代码是一个提供结果的最小示例。
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
info.plist中的ATS设置
Spotify在其服务器上提供有效的TLS证书链。因此,无需在info.plist中进行ATS设置。
控制台中的SSL警告
当我像您一样在iOS 12模拟器上运行应用程序时,在控制台中也会收到相同的SSL警告。尽管如此,连接已建立并且请求传递数据。也许在下一个Beta版中,它就消失了。
答案 1 :(得分:0)
在任何响应调用上,我都在模拟器中对Codegen Swagger发出了相同的警告。但是所有的工作。仅当我添加环境变量Hide strange unwanted Xcode logs
时,此警告才会消失