Apple Music이 사용자의 기기에 설치되어 있는지 확인하는 방법은 무엇입니까?


9

나는 빠른 음악 앱을 만들고 있습니다. 이 앱을 통해 사용자는 Apple Music 앱을 통해 Apple Music 구독을 통해 음악을 재생할 수 있습니다. 다음을 통해 사용자에게 Apple Music 구독이 있는지 확인할 수 있습니다.

SKCloudServiceController().requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) {
        print("user has Apple Music subscription")
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) {
        print("user does not have subscription")
    }

}

그러나 어떤 이유로 누군가가 Apple Music에 가입하지만 장치에 Apple Music 앱이 다운로드되지 않는 시나리오가 있습니다. 사용자에게 구독이 있지만 장치가 아닌 경우에는 구독이 전혀없는 것처럼 처리해야합니다. 즉, Apple Music을 통해 음악을 재생할 수 없습니다.

따라서 Apple Music이 사용자의 장치에 있는지 확인하는 방법을 검색합니다. :이 답을 찾을 응용 프로그램은 스위프트를 사용하여 설치 여부 확인 과 함께 애플 음악의 URL 방식을 찾기위한이 자원을 하고 사용자가있는 경우 내가 확인할 수 있습니다 결론 모두 애플 뮤직에 가입 하고 를 통해 자신의 장치에 설치된 애플 뮤직 앱 :

SKCloudServiceController()requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && UIApplication.shared.canOpenURL(URL(string: "music://")!) {
        print("user has Apple Music subscription and has the apple music app installed")
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) || !UIApplication.shared.canOpenURL(URL(string: "music://")!) {
        print("user does not have subscription or doesn't have apple music installed")
    }

}

문제는 내 장치에서 Apple Music을 삭제 한 후에도 첫 번째 사례, 즉 인쇄 된 사례 user has Apple Music subscription and has the apple music app installed가 여전히 호출되는 것입니다. 나는 변경시 때문에 올바른 URL 방식이 생각 "music://""musi://", 즉 인쇄물이하는 일, 두 번째 경우, user does not have subscription or doesn't have apple music installed호출되고.

URL(string: "music://")를 통해 삭제 된 Apple Music 으로 열려고 UIApplication.shared.open(URL(string: "music://")!)하면 다음 경고가 표시됩니다.

여기에 이미지 설명을 입력하십시오

그렇다면 URL(string: "music://")Apple Music이 삭제 된 후에도 장치가 열 수 있다고 말하는 이유는 무엇입니까? 은 URL열려 될 수있는,하지만 결과는 단순히 위의 경고의 표시인가? 사용자에게 기기에 Apple Music이 설치되어 있는지 확인하는 올바른 방법입니까? 사용자에게 기기에 Apple Music이 설치되어 있는지 확인할 수있는 방법이 있습니까? Apple이 사용자에게 Apple Music 앱을 삭제할 수있는 옵션을 제공하는 경우 개발자에게 앱이 설치되어 있는지 확인할 수있는 기능도 제공해야합니다.


나는 Apple 음악을 직접 사용해 본 적이 없지만 Apple 은이 URL 체계가 자체 제품이기 때문에이 URL 체계를 특별한 방식으로 취급한다고 생각합니다. 따라서 해당 URL 체계에 도달 할 때마다 사용자가 앱을 다운로드하지 않고 앱을 다운로드하는 것이 좋습니다. 그릇된. 실제로 Apple Music에서 실제 앨범을 열거 나 실제 노래를 재생하는 유효한 URL 체계를 식별하려고 했습니까? 예 : URL(string: "music://trackID=3214534"). 이 명시 적 URL 체계는 일반적인 방식으로 처리되지만 app restore경고를 트리거하지는 않습니다 .
Starsky

나는 애플의 음악적인 링크되어 있지 않은 것 같습니다 유효 애플의 음악 트랙과 아티스트 ID를 사용하여 URL의 숫자를 시도했다 : URL(string: "music://trackId=1377813289")!, URL(string: "music://track=1377813289"), URL(string: "music://artist=562555")!, URL(string: "music://artistId=562555")!. 내가 딥 링크를 할 수 있었던 유일한 방법은과 같은 것을 사용하는 URL(string: "https://music.apple.com/us/artist/562555")!것이지만 이것이 HTTP이기 때문에 분명히 도움이되지 않습니다.
David Chopin

LSApplicationQueriesSchemes?와 함께 info.plist에 "music : //"을 허용 했습니까? 그렇지 않은 경우 canOpenUrl은 잘못 작동합니다.
Karthick Ramesh

1
불행히도 내 info.plist에서 구성표를 허용 목록에 추가해도 동작이 전혀 바뀌지 않습니다. 내 문제는 Apple Music 앱이 삭제 된 경우에도 항상 UIApplication.shared.canOpenURL(URL(string: "music://")!)돌아 오는 true것입니다. false앱이 삭제되면 돌아와야 합니다. URL 체계를 허용 목록에 추가해도이 문제가 해결되지 않습니다 (시도했습니다).
David Chopin

더 나은 해결책을 찾았습니까?
Martin Mlostek

답변:


3

내가 가진 가장 좋은 해결책은 더 나은 것이 있다고 생각하지만 MPMusicPlayer.prepareToPlay(completionHandler:)트랙을 재생할 때 오류가 있는지 확인하는 것입니다.

SKCloudServiceController().requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) {
        print("user has Apple Music subscription")
        MPMusicPlayerController.systemMusicPlayer.setQueue(with: ["1108845248"])
        systemMusicPlayer.prepareToPlay { (error) in
            if error != nil && error!.localizedDescription == "The operation couldn’t be completed. (MPCPlayerRequestErrorDomain error 1.)" {
                //It would appear that the user does not have the Apple Music App installed
            }
        }
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) {
        print("user does not have subscription")
    }

}

트랙을 재생하는 것 이외의 용도로 앱 내에서 Apple Music을 사용하는 사람에게 이것이 어떻게 적용될 수 있는지 잘 모르겠지만 수표를 연주하려고 할 때 분명히 수표로 작동하는 것 같습니다. 해당 오류가 발생하면 개인에게 Apple Music 구독이 있지만 앱이 설치되어 있지 않다는 경고를 만들면됩니다.

그럼에도 불구하고 부울 검사가 조건문에 통합 될 수 있기 때문에 완료 처리기가 없으면 검사 할 수있는 것이 좋습니다. if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something } 입니다.


글쎄,이 솔루션은 오류를 확인하여 작동하지만 약간 해키이며 완료 핸들러에서 다음 코드를 실행해야합니다. MusicKit 프레임 워크의 일부인지 여부, 앱 자체 설치 여부를 간단히 확인할 수있는 방법이 더 좋습니다.
David Chopin

그러나 예,이 답변은 트랙을 재생할 준비를 할 때 오류를 이용하는 해결 방법입니다. 개발자는 트랙을 재생하지 않고 Apple Music이 설치되어 있는지 알아야합니다.
David Chopin

1
이것이 여전히 당신이 찾은 최고의 솔루션입니까?
Martin Mlostek

불행히도, 예
David Chopin

0

운 좋게도 Apple은 장치에 설치된 앱이 URL 체계를 처리하도록 등록되어 있지 않거나 Info.plist 파일에서 URL 체계를 선언하지 않은 경우 false를 반환하는 메소드를 제공합니다. 그렇지 않으면, 사실입니다.

func canOpenURL(_ url: URL) -> Bool

내가 URL 체계를 게시하고있다

Open = music://
Open = musics://
Open = audio-player-event://

나중에 사용할 파일을 info.plist 파일에 추가하십시오.

그런 다음 'canOpenURL'을 사용하여 자세한 정보 확인 Apple 문서 확인

https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl


true통과하면 Apple Music의 URL 체계가 항상 반환 됩니다 canOpenUrl. 이것이 내가이 질문으로 다루고 싶은 주요 문제입니다.
David Chopin

LSApplicationQueriesSchemes에서 'Music app'을 지정 했습니까?
Zeeshan Ahmed

답변을 다시 확인하십시오.
Zeeshan Ahmed

Karthick 라 메쉬의 코멘트 당, 나는 이전에 행동의 변화없이 URL 스키마를 허용 목록에 시도
데이비드 쇼팽

0

가능한 해결책은 다음과 같습니다. Apple Music API를 통해 개발자 토큰을 설정합니다 (Apple Music REST 엔드 포인트를 쿼리 할 수 ​​있도록 사용됨). 다음 StoreKit 기능 ( 문서 )에 요청을 제출하십시오 .

requestUserToken(forDeveloperToken:completionHandler:)

개발자 토큰이 유효하고 반환 된 사용자 토큰 값이 여전히 nil / null 인 경우 장치 사용자는 Apple Music 서비스의 가입자가 아닙니다. HTTP 상태 코드로 생성 된 오류는 401 (무단)입니다. 그래도 여전히 오류를 확인해야하지만 특정 트랙을 시도하거나 재생할 필요는 없습니다 (특히 어떤 이유로 인해 확인한 콘텐츠 트랙 ID가 유효하지 않거나 변경된 경우).

기기에 로그인 한 계정에 가입했지만 Music 앱을 다운로드하지 않은 경우 : 특정 컨텐츠를 재생할 때 오류를 처리하고 사용자에게 정보를 제공하거나 Apple Music 구독이 필요하지 않은 컨텐츠를 대안으로 사용하십시오 오류가 발생했을 때.


1
예, 이미 사용자에게 구독 이 있는지 확인하는 방법을 알고 있습니다. 위의 답변은 실제 오류 처리에 대해 설명합니다. 내가 찾고 있어요 솔루션은 엄격하게 사용자가 장치에 설치 애플 뮤직 앱이있는 경우 당신이 말할 수 있는지 여부 않고 트랙을 재생하려고하지.
David Chopin

0

예, 다음 단계에 따라 대부분의 응용 프로그램을 확인할 수 있습니다.

  1. 열려는 특정 응용 프로그램에 깊은 URL 또는 URL 구성표 를 사용하여 추가하십시오. info.plist에
  2. 동일한 URL을 사용하고이 메소드를 호출하십시오.
    func canOpenURL(_ url: URL) -> Bool
    let url = URL(string: "music://")

    UIApplication.shared.open(url!) { (result) in
       if result {
          // The URL was delivered successfully!
       }
    }

이것은 문제 가 아니며 앱이 설치되지 않은 경우에도 UIApplication.shared.canOpenUrl(URL(string: “music://”)!)항상을 반환 하는 질문 true입니다.
David Chopin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.