How to play an audio file from JSON output? - mysql

I have an iOS app that outputs JSON information(from a mySQL database) in the form of a UITableView. This includes audio, images and text. While I can call the images and text, I am having trouble calling the audio (This is stored as a URL in the mySQL database) for example, this is the JSON output for the path to my audio file:
[{"audiopath = "http://my-website.com/audio/5552643-audio.caf"}]
This is the code I use to call the images and text but the audio isn't working. I have tried logging the path but it just comes up as NULL.
NSDictionary *words = [self.wordsArray objectAtIndex:index];
label.text = [words objectForKey:#"new"];
NSDictionary *images = [self.thumbArray objectAtIndex:index];
[imgView setImageWithURL:[NSURL URLWithString:[images objectForKey:#"thumbnail"]]];
NSDictionary *audio = [self.audioArray objectAtIndex:index];
NSURL *path = [NSURL URLWithString:[audio objectForKey:#"audiopath"]];
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:path error:nil];
NSLog(#"PATH:%#", path);
The error I am getting is:
'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
The audio is stored on my server so it is not included in the app bundle.. does that mean I need to download the file into my app? or is there another way? Anyone know what I am doing wrong? Any help appreciated.

I have figured it out. This is how I can target the image path:
NSURL *url = [NSURL URLWithString:[_wordDetail objectForKey:#"audiopath"]];
NSData *soundData = [NSData dataWithContentsOfURL:url];
audioPlayer = [[AVAudioPlayer alloc] initWithData:soundData error:NULL];
audioPlayer.delegate = self;
[audioPlayer play];

Related

Parsing html page Objective C

I try to parse some website using XPath in Objective C (iOS). Everything is OK when I try to parse URL like "url.com/news", but when I parse something like this "ulr.com/news.html" I get node is nil. I think I have to save the content of news.html into local html file and then parse it maybe?
Here's the code that isn't working, thanks a lot.
NSURL *newsURL = [NSURL URLWithString:#"http://www.ukr.net/news/politika.html"];
NSData *newsHtmlData = [NSData dataWithContentsOfURL:newsURL];
TFHpple *newsParser = [TFHpple hppleWithHTMLData:newsHtmlData];
NSString *newsXpathQueryString = #"//article/section[#class='im'][1]/time";
NSArray *newsNodes = [newsParser searchWithXPathQuery:newsXpathQueryString];

Converting NSString to NSData for use in XCODE

I am getting data from the Yummly API and I would like to use it as though it were serialized JSON data. However, it is currently a string, and I cannot figure out how to turn it to data correctly. The code is as following:
NSString *searchParameters = #"basil"; //should be from text box
//NSError *error1 = nil;
NSString *searchURLName = [#"http://api.yummly.com/v1/api/recipes?_app_id=myAPIId&_app_key=myAPIkey&" stringByAppendingString:searchParameters];
NSURL *searchURL = [NSURL URLWithString:searchURLName];
NSString *searchResults = [NSString stringWithContentsOfURL:searchURL encoding:NSUTF8StringEncoding error:nil];
// Here, the search results are formatted just like a normal JSON file,
// For example:
/* [
"totalMatchCount":777306,
"facetCounts":{}
]
*/
// however it is a string, so I tried to convert it to data
NSData *URLData = [searchResults dataUsingEncoding:NSUTF8StringEncoding];
URLData = [URLData subdataWithRange:NSMakeRange(0, [URLData length] - 1)];
_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:nil];
Somewhere over the last four lines, it didn't do what it was supposed to and there is no data in the data object. Any advice or quick hints in the right direction are much appreciated! Thank you1
Look at the error being returned from the NSJSONSerialization object like
NSError *error;
_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:&error];
NSLog(#"%#", error);
This might give you a hint of what's wrong. This should work though.
And why exactly are you doing URLData = [URLData subdataWithRange:NSMakeRange(0, [URLData length] - 1)];? You don't need to copy the data, if that's why you're doing that.
Plus, it seems like you're assuming to get an array as the top level object (judging by
/* [
"totalMatchCount":777306,
"facetCounts":{}
]
*/
but this is a dictionary. Basically you probably want a dictionary, not array. This it should be
/* {
"totalMatchCount":777306,
"facetCounts":{}
}
*/
But the error getting returned will tell you that.
It looks like you're over-complicating things a bit. You do not need to bring in this data as an NSString at all. Instead, just bring it in as NSData and hand that to the parser.
Try:
NSString *searchParameters = #"basil"; //should be from text box
NSString *searchURLName = [#"http://api.yummly.com/v1/api/recipes?_app_id=myAPIId&_app_key=myAPIkey&" stringByAppendingString:searchParameters];
NSURL *searchURL = [NSURL URLWithString:searchURLName];
NSData *URLData = [NSData dataWithContentsOfURL:searchURL];
_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:nil];
Note that you'll want to verify that the parsed JSON object is indeed an array as expected, and is not/does not contain [NSNull null].

Converting URLWithString to NSURLConnection

I am new to iOS development and I am trying to retrieve some data from server.
I have used:
NSData *jsonDataString = [[NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error: nil] dataUsingEncoding:NSUTF8StringEncoding];
which is freezing my app's UI. I put it dispatch but this causes other issues.
How to convert this one to NSRULConnection which will reply NSData like URLWithString?
Thank you
I found the solution. I was dispatching [self function1[self function2[self function3]]]; where the function3 was the json request. After dispatching only function3 the result was fine

Encoded NSData for a url not saving to the documents directory

I'm trying to save a html page locally on the iPhone's documents directory so I can load the page if the phone is in an offline state
My issue is when I call my NSData object directly to be written to file all the raw data is saved in a file in the documents directory.
But as soon as I cast my NSData to a NSString using encoding it stops writing the file in the documents directory. But when I print my content object it logs out the correct data. I just want that to be saved to a file.
NSURL *url = [NSURL URLWithString:#"http://anyurl"];
NSData *urlHtmlData = [NSData dataWithContentsOfURL:url];
NSString *myString = [[NSString alloc]initWithData:urlHtmlData encoding:NSUTF8StringEncoding];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName = [documentsDirectory stringByAppendingPathComponent:#"index.html"];
[myString writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];
What could be causing the content to stop writing to my file?
Or if anyones got a better solution to view offline webpages rather than saving it to the documents directory?
Thanks
There could be a few things wrong with this. One: You don't use stringWithFormat: to append a path component. NSString has a method for that:
NSString *fileName = [documentsDirectory stringByAppendingPathComponent:#"index.html"];
Two: NSStringEncodingConversionAllowLossy is part of an enum that is not defined for writeToFile:, so by using it, you're actually specifying NSASCIIStringEncoding without realizing it. In my opinion, just use NSUTF8StringEncoding instead.
Also, NSString *content = [[NSString alloc]initWithFormat:#"%#", myString]; does absolutely nothing except duplicate myString. Erase that line and just use [myString writeToFile:....

ios5 - JSON Parsing - dictionary OK, not parsing to array

I am using the new ios5 "NSJSONSerialization" function to obtain some tech-news from a website. I seem to have everything working OK, up until the point when I try to parse the NSDictionary into an NSArray. I have included the code here. The first console test (test 1) is working great - I get a console full of returned json data. But at the second console test (test 2 - the one that checks the contents of the nsarray), gives this message: "Array returned: (null)". Any ideas? Is it because I reused the error variable, maybe? I'm stumped.
Here's the code:
// create the string for making the api call to the website
NSString* theURL = [NSString stringWithFormat:#"http://pipes.yahoo.com/pipes/pipe.run?_id=9DfJELfJ2xGnjAQWJphxuA&_render=json"];
// declare and assign variables necessary to generate the actual url request
NSError* err = nil;
NSURLResponse* response = nil;
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init];
NSURL* URL = [NSURL URLWithString:theURL];
[request setURL:URL];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setTimeoutInterval:30];
// make the actual url request - get the data from yahoo pipes, in json format
NSData* jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
// assign the entire result to a dictionary
NSDictionary *resultsDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&err];
//*** test 1: use the console to test results:
NSLog(#"NSDictionary returned: %#",resultsDictionary);
// parse the whole returned list of items (in dictionary form) into a large array
NSArray* arrayOfReturnedItems = [resultsDictionary objectForKey:#"items"];
//*** test 2: view the items returned (in the console)
NSLog(#"Array returned: %#",[arrayOfReturnedItems objectAtIndex:0]);