2016-08-13 3 views
0

Xcode 7.3 und Swift 2,2Absturz auf Archive laufen, wenn HTML-String zu NSAttributedString Umwandlung

In einer schnellen Datei habe ich eine Zeichenfolge extention, die HTML-Text NSAttributedString umwandelt.

extension String { 
    func htmlAttributedString() -> NSAttributedString? { 
     guard let data = self.dataUsingEncoding(NSUTF16StringEncoding, allowLossyConversion: false) else { return nil } 
     guard let html = try? NSMutableAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) else { return nil } 
     return html 
    } 
} 

Ich benutze es so.

let HTMLstr = "<p><b>hello</b> world</p>" 
if let attrString = HTMLstr.htmlAttributedString() { 
    // do something here 
} 

Es funktioniert auf meinem Handy in Ordnung, und im Simulator, aber wenn ich Archiv es, verursacht es einen Absturz bei der Verwendung des Codes oben. Ich denke, das Problem liegt in dataUsingEncoding. Irgendwelche Ideen, warum dies abstürzen wird, wenn Sie eine archivierte App verwenden.

bearbeiten

ich den Header des Crash-Protokoll aufgenommen haben:

Incident Identifier: 90C74E49-4C65-4556-B82D-6748437BB5BA 
CrashReporter Key: 4fb0e685f950c6cdecf7132b26f38ff54e013348 
Hardware Model:  iPhone7,1 
Process:    AppName [7813] 
Path:    /private/var/containers/Bundle/Application/1EE7C00E-7600-4D72-839D-8AEA834903B8/AppName.app/AppName 
Identifier:   uk.co.skymook.AppName 
Version:    1 (2.0) 
Code Type:   ARM-64 (Native) 
Parent Process:  launchd [1] 

Date/Time:   2016-08-13 12:16:08.08 +0100 
Launch Time:   2016-08-13 12:15:33.33 +0100 
OS Version:   iOS 9.3.2 (13F69) 
Report Version:  105 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Subtype: KERN_INVALID_ADDRESS at 0x2000000000000000 
Triggered by Thread: 0 

Filtered syslog: 
None found 
+2

Können Sie den Fehler bitte hier einfügen? –

Antwort

0

Lange Antwort: Die Lösung wurde sorgfältig langsam Debuggen. Ich musste den gesamten Code, der zu dem Absturz führte, durchgehen und sicherstellen, dass die richtigen Checks für die Optionals vorhanden waren. Also musste ich viel Code blockieren, für das Archiv erstellen und ihn auf eine Reihe von Funktionen eingrenzen. Dann musste ich jede Codezeile blockieren, für das Archiv erstellen, bis ich herausfand, was abstürzt. Mit Hunderten von Codezeilen in der App und der Zeit, die für die Archivierung benötigt wird, war dies nicht einfach. Am Ende wurde ein optionales Paket ausgepackt, wenn es keins war. Bedenkt man, dass es im Simulator ausgepackt und im Debugger ausgeführt wurde, war ich überrascht, dieses Problem zu finden.

Kurze Antwort: Es war ein optionales, das mit nil entpacken und nicht mit dem obigen Code verwandt war. Der Speicher wird beim Archivieren der App etwas anders gehandhabt, und der Compiler kann alle Tests auf Gültigkeit des Codes bestehen.

Die gelernte Lektion besteht darin, für die Produktion zu archivieren und es regelmäßig während der Entwicklung am Telefon laufen zu lassen.

Verwandte Themen