Открытие iTunes Store для конкретной песни
Хорошо, я видел подобные вопросы здесь, но на самом деле никто не отвечает на проблему для меня.
У меня есть приложение потокового аудио, и источник потока возвращает мне название песни и имя исполнителя. У меня есть кнопка iTunes в приложении, и я хочу открыть iTunes STORE (поиск) для этой конкретной песни или, по крайней мере, закрыть. Я пробовал следующее:
NSString *baseString = @"itms://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=";
NSString *str1 = [self.songTitle2 stringByReplacingOccurrencesOfString:@" " withString:@"+"];
NSString *str2 = [self.artist2 stringByReplacingOccurrencesOfString:@" " withString:@"+"];
NSString *str = [NSString stringWithFormat:@"%@%@&artistTerm=%@", baseString, str1, str2];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString:str]];
Этот вызов действительно переключает меня в iTunes STORE, как и ожидалось, но затем появляется сообщение "Не удается подключиться к iTunes Store". Я, очевидно, онлайн, потому что песня активно транслируется, и я в магазине. В окне поиска в приложении iTunes отображается только название песни и ничего больше.
Вот пример сгенерированной строки: itms://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults? ArtistTerm=Veruca+Salt&artistTerm=Volcano+Girls
Я устал брать строку, которую она генерирует, и вставлять ее в Safari, и она хорошо работает на моем Mac, открывая альбомы исполнителя в магазине. Почему не по телефону?
Кроме того, кажется, что оба элемента игнорируются, так как это не приводит меня к песне этого исполнителя. Требуется ли также знание названия альбома (которого у меня нет на данный момент)?
Помощь будет оценена. Благодарю.
3 ответа
Да, я отвечаю на свой вопрос.
После долгих поисков и беседы с одним из лучших из моих знакомых программистов у нас есть решение, поэтому я решил поделиться им здесь. Это решение принимает имя песни и исполнителя, фактически выполняет вызов API Link Maker, возвращает документ XML и извлекает необходимую информацию для создания ссылки на iTunes Store, открывая магазин для песни в альбоме с помощью тот исполнитель, который содержит песню.
В интерфейсе контроллера представления добавьте:
@property (strong, readonly, nonatomic) NSOperationQueue* operationQueue;
@property (nonatomic) BOOL searching;
В реализации:
@synthesize operationQueue = _operationQueue;
@synthesize searching = _searching;
Вот методы и код, который сделает это за вас:
// start an operation Queue if not started
-(NSOperationQueue*)operationQueue
{
if(_operationQueue == nil) {
_operationQueue = [NSOperationQueue new];
}
return _operationQueue;
}
// change searching state, and modify button and wait indicator (if you wish)
- (void)setSearching:(BOOL)searching
{
// this changes the view of the search button to a wait indicator while the search is perfomed
// In this case
_searching = searching;
dispatch_async(dispatch_get_main_queue(), ^{
if(searching) {
self.searchButton.enabled = NO;
[self.searchButton setTitle:@"" forState:UIControlStateNormal];
[self.activityIndicator startAnimating];
} else {
self.searchButton.enabled = YES;
[self.searchButton setTitle:@"Search" forState:UIControlStateNormal];
[self.activityIndicator stopAnimating];
}
});
}
// based on info from the iTunes affiliates docs
// http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html
// this assume a search button to start the search.
- (IBAction)searchButtonTapped:(id)sender {
NSString* artistTerm = self.artistField.text; //the artist text.
NSString* songTerm = self.songField.text; //the song text
// they both need to be non-zero for this to work right.
if(artistTerm.length > 0 && songTerm.length > 0) {
// this creates the base of the Link Maker url call.
NSString* baseURLString = @"https://itunes.apple.com/search";
NSString* searchTerm = [NSString stringWithFormat:@"%@ %@", artistTerm, songTerm];
NSString* searchUrlString = [NSString stringWithFormat:@"%@?media=music&entity=song&term=%@&artistTerm=%@&songTerm=%@", baseURLString, searchTerm, artistTerm, songTerm];
// must change spaces to +
searchUrlString = [searchUrlString stringByReplacingOccurrencesOfString:@" " withString:@"+"];
//make it a URL
searchUrlString = [searchUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL* searchUrl = [NSURL URLWithString:searchUrlString];
NSLog(@"searchUrl: %@", searchUrl);
// start the Link Maker search
NSURLRequest* request = [NSURLRequest requestWithURL:searchUrl];
self.searching = YES;
[NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
// we got an answer, now find the data.
self.searching = NO;
if(error != nil) {
NSLog(@"Error: %@", error);
} else {
NSError* jsonError = nil;
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if(jsonError != nil) {
// do something with the error here
NSLog(@"JSON Error: %@", jsonError);
} else {
NSArray* resultsArray = dict[@"results"];
// it is possible to get no results. Handle that here
if(resultsArray.count == 0) {
NSLog(@"No results returned.");
} else {
// extract the needed info to pass to the iTunes store search
NSDictionary* trackDict = resultsArray[0];
NSString* trackViewUrlString = trackDict[@"trackViewUrl"];
if(trackViewUrlString.length == 0) {
NSLog(@"No trackViewUrl");
} else {
NSURL* trackViewUrl = [NSURL URLWithString:trackViewUrlString];
NSLog(@"trackViewURL:%@", trackViewUrl);
// dispatch the call to switch to the iTunes store with the proper search url
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] openURL:trackViewUrl];
});
}
}
}
}
}];
}
}
XML-файл, который возвращается, содержит много другой полезной информации, которую вы можете извлечь здесь, включая три размера обложки альбома, название альбома, стоимость и т. Д., И т. Д.
Я надеюсь, что это поможет кому-то еще. Это поставило меня в тупик на некоторое время, и я благодарю моего хорошего друга за эту работу.
Вы фактически используете URL для поиска. Вот почему iTunes открывается при поиске. Мой iTunes в Mac OS X также открывается в поиске.
Используйте API поиска для iTunes, чтобы найти нужный контент и получить идентификаторы исполнителя, альбома или песни, чтобы вы могли сгенерировать прямой URL для этого контента.
Посмотрите в iTunes Link Maker, как создать URL-адрес для исполнителя или для определенного альбома и создать этот URL-адрес в своем приложении.
Похоже, что теперь iOS уже открывает приложение iTunes напрямую, когда вы пытаетесь открыть html url itunes.
Например, попытка сделать openURL на https://itunes.apple.com/br/album/falando-de-amor/id985523754 уже открывает приложение iTunes вместо веб-сайта.