我目前面临着在我的应用程序中集成Apple Music API的问题。我遵循了苹果公司提供的文档和指南,但在身份验证和解析Apple Music曲目详细信息时遇到了问题。
以下是问题摘要:
当使用提供的API端点请求获取Apple Music曲目详细信息时,我收到以下错误:“解析Apple Music曲目详细资料时出错:数据无法读取,因为它的格式不正确。”
此外,响应状态代码是401,表示未经授权的请求。
我已经尝试了以下故障排除步骤:
已验证MusicKit应用程序服务是否已在我的应用程序ID配置中启用。
确认应用程序中使用的捆绑包标识符与应用程序ID配置中的标识符匹配。
确保我在我正在测试的模拟器和设备中使用有效的Apple ID登录。
尽管作出了这些努力,但问题依然存在。我相信我已经遵循了自动生成开发人员令牌的正确程序,但可能缺少或配置错误。
func fetchAppleMusicTrackDetails(from mediaURL: URL, completion: @escaping (AppleMusicTrack?) -> Void) {
let components = URLComponents(url: mediaURL, resolvingAgainstBaseURL: false)
guard let itemID = components?.queryItems?.first(where: { $0.name == "id" })?.value else {
completion(nil)
return
}
fetchStorefront { storefront in
guard let storefront = storefront else {
print("storefront issue")
completion(nil)
return
}
let regex = try! NSRegularExpression(pattern: "\\s*\\(.*?\\)\\s*", options: .caseInsensitive)
let trimmedStorefront = regex.stringByReplacingMatches(in: storefront, options: [], range: NSMakeRange(0, storefront.count), withTemplate: "")
let encodedStorefront = trimmedStorefront.replacingOccurrences(of: " ", with: "%20")
let lookupURLString = "https://api.music.apple.com/v1/catalog/\(encodedStorefront)/songs/\(itemID)"
print(lookupURLString)
guard let lookupURL = URL(string: lookupURLString) else {
print("lookupURL issue")
completion(nil)
return
}
URLSession.shared.dataTask(with: lookupURL) { (data, response, error) in
if let httpResponse = response as? HTTPURLResponse {
print("Status code: \(httpResponse.statusCode)")
}
if let error = error {
print("Error fetching Apple Music track details: \(error.localizedDescription)")
completion(nil)
return
}
guard let data = data else {
completion(nil)
print("no data")
return
}
let responseString = String(data: data, encoding: .utf8)
print("Response data: \(responseString ?? "No data")")
do {
let responseJSON = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
let results = responseJSON?["results"] as? [[String: Any]]
let trackData = results?.first
print(responseJSON)
// Extract the necessary track information from the JSON response
guard let title = trackData?["trackName"] as? String,
let artist = trackData?["artistName"] as? String,
let album = trackData?["collectionName"] as? String,
let artworkURLString = trackData?["artworkUrl100"] as? String,
let artworkURL = URL(string: artworkURLString),
let trackURLString = trackData?["previewUrl"] as? String,
let trackURL = URL(string: trackURLString) else {
completion(nil)
return
}
// Download the artwork image
URLSession.shared.dataTask(with: artworkURL) { (artworkData, _, _) in
guard let artworkData = artworkData, let artworkImage = UIImage(data: artworkData) else {
completion(nil)
return
}
let track = AppleMusicTrack(title: title, artist: artist, album: album, artwork: artworkImage, trackURL: trackURL)
completion(track)
}.resume()
} catch {
print("Error parsing Apple Music track details: \(error.localizedDescription)")
completion(nil)
}
}.resume()
}
}
func fetchStorefront(completion: @escaping (String?) -> Void) {
SKCloudServiceController().requestStorefrontCountryCode { storefrontCountryCode, error in
if let error = error {
print("Error fetching storefront country code: \(error.localizedDescription)")
completion(nil)
return
}
guard let countryCode = storefrontCountryCode else {
print("country code error")
completion(nil)
return
}
completion(countryCode)
}
}