Swift项目中JSON日期解析失败及SSL_ERROR_ZERO_RETURN问题求助
解决方案:Swift项目中日期解析失败与SSL错误修复
我来帮你逐个解决这两个问题:
问题1:Date类型数据无法解析(datereg始终为nil)
看了你的代码和日志输出,核心有两个问题导致日期字段解析失败:
1. 结构体属性名与JSON键名不匹配
你的Client结构体里日期属性叫datareg,但服务器返回的JSON里对应的键是datereg(少了一个a)!Codable默认会严格匹配属性名和JSON键名,这直接导致解码器找不到对应值,最终datareg为nil。
修复方法:
给结构体添加CodingKeys来映射键名,这样不用修改属性名也能正确解析:
struct Client: Codable { let id: String? let name: String? let phone: String? let company: String? let discount: String? var datareg: Date? // 手动映射JSON键与属性名 enum CodingKeys: String, CodingKey { case id, name, phone, company, discount case datareg = "datereg" // 把JSON里的"datereg"映射到属性datareg } }
2. 日期格式化器缺少关键配置
不管用SwiftyJSON还是JSONDecoder,你的日期格式化器都没设置时区和locale,这会导致跨时区的日期字符串解析失败。
修复SwiftyJSON的Formatter:
修改Formatter类,给两个格式化器添加上时区和locale:
class Formatter { static let jsonDateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" formatter.timeZone = TimeZone(abbreviation: "UTC") formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }() static let jsonDateTimeFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" formatter.timeZone = TimeZone(abbreviation: "UTC") formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }() }
JSONDecoder的配置:
你当前的JSONDecoder配置是正确的,只要配合上面的CodingKeys修复,就能正常解析日期字段了。
问题2:SSL_ERROR_ZERO_RETURN(6)错误
这个错误表示SSL连接被服务器主动关闭,常见原因和解决方法如下:
服务器证书不被信任:如果你的服务器用的是自签名证书,iOS默认会拒绝连接。测试阶段可以在
Info.plist里添加临时配置允许不安全连接(上线必须替换为正规CA颁发的证书):<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>服务器SSL协议版本过低:部分旧服务器只支持TLS 1.0/1.1,而iOS默认要求TLS 1.2+。可以在
Info.plist里给目标域名添加例外:<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>sverlim.software</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> </dict> </dict> </dict>服务器端配置问题:比如连接超时设置过短、服务器负载过高导致主动断开,这种情况需要联系服务器管理员排查。
内容的提问来源于stack exchange,提问作者Anton Zhevchenko
相关产品推荐
相关产品推荐

