iOS 8.0 NSAttributedString init with HTML file crashes - html

I am trying to initialize an attributed string with HTML file contents, as following:
NSMutableAttributedString *attrStr = [[[NSAttributedString alloc] initWithFileURL:[NSURL fileURLWithPath:chapterPath]
options:#{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}
documentAttributes:nil error:nil] mutableCopy];
and it does work with iOS7.1 and iOS8.1 and up, but something goes wrong with iOS8.0:
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: vector
Is this initialization method broken in iOS8.0? Any workaround?
BTW, I have tried to parse an RTF file and, with iOS8.0, it fails to collect any font information.

Did you try this?.
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfFile:chapterPath options:NSDataReadingUncached error:&error];
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData: data options:#{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:&attributes error:nil];

Init with HTML for NSAttributedString is on main thread only. If you doing that in background be ready to crash.

Related

Load html content string with \" in iOS. Because due to that css for html file is not working

My Problem is that I am getting html content form backEnd so when I had convert my NSData by using this code:
dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
I have got content like this:
<div class=\"dropzone-container\"
Where on the place of " it will automatically convert it into \" and due that when I load that data on UIWebView it would not load it respective css so I need to it to be converted like this:
<div class="dropzone-container"
Please help in this Thanks in advance........ :(
Try this. It will convert HTML to NSString.
NSString *responseInHTML = #"<html><body> Some html string </body></html>";
NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[responseInHTML dataUsingEncoding:NSUnicodeStringEncoding] options:#{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
DLOG(#"String = %#",attrStr.string);
You can achieve your html by removing \ from string.
Example:
NSString *myHTML = [oldHTML stringByReplacingOccurrencesOfString:#"\" withString:#""];

NSAttributedString initWithData:options:documentAttributes:error: painfully slow

I'm using those line of codes to create an attributed string from a simple HTML string:
NSDictionary *importParams = #{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute: #(NSUTF8StringEncoding) };
NSError *error = nil;
NSData *stringData = [HTML dataUsingEncoding:NSUTF8StringEncoding] ;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData:stringData options:importParams documentAttributes:NULL error:&error];
The issue is that is really slow (about seconds on simulator)even for few characters.
I don not understand the reason behind that and I don't want to use third party libs with custom HTML parser.
Is there any other way to create attributed string from HTML text faster than this?

Parsing JSON with NSJSONSerialization: Error 3840 - Data Corrupted?

I've read many Q/As on this problem but couldn't find an answer that fits my situation.
I retrieve a JSON response from a REST service I've created in PHP. This is my code:
NSURLResponse *response = nil;
NSError *theError1 = nil;
NSError *theError2 = nil;
NSURL *webServiceUrl = [NSURL URLWithString:#"http://..."];
NSURLRequest *request = [NSURLRequest requestWithURL:webServiceUrl cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
NSData *theData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&theError1];
NSString *dataString = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
NSLog(#"%#", dataString);
id json = [NSJSONSerialization JSONObjectWithData:theData options:NSJSONReadingAllowFragments | NSJSONReadingMutableContainers error:&theError2];
if (theError2 != nil)
NSLog(#"%#", theError2);
When I invoke the REST call in the browser, I see the following response, which seems identical to what XCode logs:
{
"Name": "REST Service",
"Product": "REST Test",
"Version": "1.0.0.0",
"Copyright": "2013 Test Company"
}
When I execute above code, however, the following error is created and logged:
Error Domain=NSCocoaErrorDomain Code=3840 "The data couldn’t be read because it has been corrupted." (Invalid value around character 3.) UserInfo=0x100547430 {NSDebugDescription=Invalid value around character 3.}
What am I doing wrong?
OK, as always, checking the actual data instead of the string representation pays - thanks #Bavarious.
It turns out that the PHP script(s) in charge of creating the JSON were all "UTF8 with BOM", so PHP returned a BOM for every script involved.
Once I changed all the PHP files to "UTF8 without BOM" everything seems to be fine - need to test this on the MAC though.
Sorry to interrupt, keep up the good work.
(#Bavarious: If you'd like to write an answer, I'd be happy to upvote and accept it, as you pointed me to the solution).
Was able to parse the JSON now as expected. Making a mental note to always double-check the text file encoding.
NSURL *theURL = [NSURL URLWithString:#"http://yourdataurl"];
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (!connectionError) {
NSError *error;
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSData *theData = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:theData options:0 error:&error];
if (!jsonResponse || error)
{
NSLog(#"Error");
}
else
{
// Everything is ok..
}
}
}];

XCode GET POST WebServer

I'm beginner from Xcode. I have to do an application that get and send data from embedded webserver that I designed in a microcontroller MICROCHIP.
Now I'm able to get information from webserver ( In my webserver I have a /status.xml file where I have all the dynamic variables)
Now I am not able to click a button. The HTML code to click a button is
onmousedown="newAJAXCommand('buttons.cgi?btn=1')"
In my webserver I have a file buttons.cgi.
My target is designed a button in Xcode that he does this action
I tried to use NSMutableURLRequest class and SetHTTPMethod:#"GET" or #"POST" but this code doesn't work
NSString *post = #"btn=1";
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES ];
NSString *Get_lenght = [NSString stringWithFormat:#"%d",[postData length]];
NSURL *serviceURL = [NSURL URLWithString:#"http://mywebserver.com/buttons.cgi?"];
NSMutableURLRequest *serviceRequest = [NSMutableURLRequest requestWithURL:serviceURL];
[serviceRequest setValue:Get_lenght forHTTPHeaderField:#"Content-type"];
[serviceRequest setHTTPMethod:#"POST"];
[serviceRequest setHTTPBody:postData];
There are multiple errors in the codes:
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES ];
Why don't you use UTF-8 ?
NSString *Get_lenght = [NSString stringWithFormat:#"%d",[postData length]];
[serviceRequest setValue:Get_lenght forHTTPHeaderField:#"Content-type"];
You can't set Content-Type as an integer.
Last, you didn't send out the NSMutableURLRequest. To send out the request, use :
NSString *response;
NSError *error;
[NSURLConnection sendSynchronousRequest:serviceRequest returningResponse:&response error:&error];
where response will contain the response data, if you need it; and the error will contain error during request & response, if there is any error.

How to read a JSON file using the NSJSONSerialization Class Reference?

I need to read a JSON file using the NSJSONSerialization Class Reference, and all the examples that I have found about the use of this class read the content from the webpage itself, instead of reading from a JSON file that has been previously created.Anyone knows how to parse from a JSON file using that class? Thanks.
Simple, quick'n'dirty example:
NSString *jsonPath = [[NSBundle mainBundle] pathForResource:#"foobar"
ofType:#"json"];
NSData *data = [NSData dataWithContentsOfFile:jsonPath];
NSError *error = nil;
id json = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
NSLog(#"JSON: %#", json);