代码之家  ›  专栏  ›  技术社区  ›  fun lab

与Apple Music API集成的未授权请求

  •  0
  • fun lab  · 技术社区  · 1 年前

    我目前面临着在我的应用程序中集成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)
            }
        }
    
    0 回复  |  直到 1 年前
    推荐文章