Swift 3中Xcode将HTML转为String返回nil问题咨询
嘿,我来帮你排查这个头疼的问题!结合你给出的setHtmlBody函数代码,咱们一步步找原因:
1. 先确认HTML结构和CSS有没有语法问题
你提供的codeStyle代码看起来被截断了(末尾是pre.language-coffeescript .token.comment{color:#6a7576}pre.l...),如果CSS没写完(比如缺了闭合的}),直接会导致HTML解析失败返回nil。一定要补全这段CSS,确保所有样式声明都有正确的开闭括号。
另外,传入的body参数里如果有未转义的特殊字符(比如<、>、&),也会破坏HTML结构,记得把这些字符转成HTML实体(比如<、>、&)。
2. 检查HTML转String的核心代码
Swift里转HTML通常用NSAttributedString的初始化方法,要是你用了try?会吞掉错误,换成do-catch打印错误信息,能精准定位问题:
let htmlString = setHtmlBody(yourBodyContent) do { guard let data = htmlString.data(using: .utf8) else { print("无法把HTML转成UTF-8数据") return nil } let options: [String: Any] = [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue ] let attributedString = try NSAttributedString(data: data, options: options, documentAttributes: nil) return attributedString.string } catch let error { print("HTML解析炸了: \(error.localizedDescription)") print("详细错误: \(error)") return nil }
打印出来的错误会直接告诉你是CSS语法错了,还是HTML标签没闭合,一目了然。
3. 确保生成的是完整的HTML结构
你的setHtmlBody函数要把样式和内容拼成完整的HTML文档,不能只扔个样式片段和内容。比如得包裹在<html><head><style>...</style></head><body>...</body></html>里,像这样:
public func setHtmlBody(_ body: String, bounds: CGRect = UIScreen.main.bounds) -> String { let font = "-apple-system" let fontSize = 19 let fontColor = "#000000" let lineHeight = 25 let imageWidth = bounds.width - 40 let margin = 20 // 补全截断的CSS! let codeStyle = "pre[class*=\"language-\"]{background:white;border-radius:14px;color:black;display:block;font-size:16px;font-weight:500;padding:20px;overflow-x:auto;white-space:pre-wrap;line-height:130%;}pre.language-coffeescript .token.comment{color:#6a7576}" // 拼成完整的HTML文档 let fullHtml = """ <html> <head> <style> body { font-family: \(font); font-size: \(fontSize)px; color: \(fontColor); line-height: \(lineHeight)px; margin: \(margin)px; } img { width: \(imageWidth)px; max-width: 100%; } \(codeStyle) </style> </head> <body> \(body) </body> </html> """ return fullHtml }
要是缺少根标签,iOS的HTML解析器(基于WebKit)根本不知道怎么处理,直接返回nil。
4. 排查CSS兼容性问题
iOS的HTML解析器对CSS的支持不是100%和Web端一样,比如有些冷门的选择器或者属性可能不兼容。你可以先把codeStyle注释掉,只保留基础的body样式,看看能不能正常解析。如果可以,再逐步加回CSS,找到导致失败的那一行样式。
另外,你用的-apple-system字体是支持的,但要是实在怀疑,换成Helvetica这种系统默认字体试试,排除字体问题。
内容的提问来源于stack exchange,提问作者Bartłomiej Janczak

