好的,我在这里看到过类似的问题,但实际上没有人为我解答这个问题。
我有一个流音频应用程序,流源返回给我歌曲标题和艺术家名称。我在应用程序中有一个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上正常工作,打开了商店中艺术家的专辑。为什么不打电话?
此外,它似乎忽略了这两个项目,因为它没有把我带到那位艺术家的歌曲。这是否还需要知道专辑名称(目前我还没有。)
帮助将不胜感激。感谢。
答案 0 :(得分:8)
是的,我正在回答我自己的问题。
经过深入挖掘和与我认识的最好的程序员之间的谈话,我们有一个解决方案,所以我想我会在这里分享。此解决方案采用歌曲名称和艺术家,实际上调用Link Maker API,获取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文件还有很多其他好的信息,你可以在这里提取,包括三种尺寸的专辑封面,专辑名称,成本等等。
我希望这有助于其他人。这让我困扰了一段时间,我感谢我的一位好朋友做这项工作。
答案 1 :(得分:0)
您实际上正在使用搜索网址。这就是iTunes打开搜索的原因。我的Mac OS X中的iTunes也会在搜索中打开。
使用Search API for iTunes搜索您想要的内容并获取艺术家,专辑或歌曲ID,以便您可以为该内容生成直接网址。
查看iTunes Link Maker如何为艺术家或特定相册创建网址,并在您的应用上撰写该网址。
答案 2 :(得分:0)
现在看来,当您尝试打开itunes html网址时,iOS已经直接打开iTunes应用程序。
例如,尝试在 https://itunes.apple.com/br/album/falando-de-amor/id985523754 上执行openURL已打开iTunes应用而不是网站。