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がユーザーのデバイス上にあるかどうかのチェックを追加する方法を探しに行きます。私はこの答えを見つけます:Apple MusicのURLスキームを見つけるためにこのリソースと組み合わせてSwiftを使用してアプリがインストールされているかどうかを確認し、ユーザーが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) && 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がまだ呼び出されていることです。に変更"music://"する"musi://"と、2番目のケース、つまり印刷するuser does not have subscription or doesn't have apple music installedものが呼び出されるため、私は正しいURLスキームを持っていると思います。

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 Musicを操作したことはありませんが、AppleはこのURLスキームを独自の製品として扱っているため、このURLスキームを特別な方法で扱っていると考えています。偽。Apple Musicで実際のアルバムを実際に開いたり、実際の曲を再生したりする有効なURLスキームを特定しようとしましたか?例:URL(string: "music://trackID=3214534")。おそらく、この明示的なURLスキームは通常の方法で処理されますが、app restoreアラートはトリガーされません。
スタスキー

私はアップルの音楽と深くリンクに思われない有効なアップルの音楽トラックやアーティストの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であるため、明らかに役に立ちません。
デビッドショパン

LSApplicationQueriesSchemesを使用してinfo.plistで「music://」をホワイトリストに登録しましたか?そうでない場合、canOpenUrlはmisBehaveと見なされます。
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フレームワークの一部であるかどうか、アプリ自体がインストールされているかどうかを簡単に確認する方法を用意することをお勧めします。
デビッドショパン

しかし、はい、この回答は、トラックを再生する準備をするときにエラーを利用する回避策です。開発者は、トラックを再生せずにApple Musicがインストールされているかどうかを知る必要がある場合があります。
デビッドショパン

1
これはまだあなたが見つけた最良の解決策ですか?
Martin Mlostek、

残念ながら、はい
デビッドショパン

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


Apple MusicのURLスキームはtrue、を通過すると常に戻りcanOpenUrlます。これが、この質問で取り上げたい主な問題です。
David Chopin

LSApplicationQueriesSchemesで「ミュージックアプリ」を指定しましたか?
Zeeshan Ahmed

もう一度答えを確認して、更新しました。
Zeeshan Ahmed

Karthick Rameshのコメントに従って、以前は動作を変更せずにURLスキームをホワイトリストに登録してみました
David Chopin

0

可能な解決策は次のとおりです。AppleMusic APIを介して開発者トークンをセットアップします(Apple Music RESTエンドポイントを照会できるように使用されます)。次のStoreKit関数(ドキュメント)にリクエストを送信します。

requestUserToken(forDeveloperToken:completionHandler:)

開発者トークンが有効で、返されたユーザートークン値がnil / nullの場合、デバイスユーザーはApple Musicサービスのサブスクライバーではありません。HTTPステータスコードで生成されるエラーは401(無許可)です。これでもエラーをチェックする必要がありますが、特定のトラックを試して再生する必要はありません(特に、チェック対象のコンテンツトラックIDが無効になるか変更された場合は、何らかの理由で)。

デバイスにサインインし、サブスクリプションはあるがミュージックアプリはダウンロードされていないアカウントの問題の場合:特定のコンテンツを再生するときにエラーを処理し、ユーザーに情報を提供するか、Apple Musicサブスクリプションを必要としないコンテンツを代替として使用しますエラーが発生したとき。


1
ええ、ユーザーが定期購入しているかどうかを確認する方法はすでに知っています。上記の私の答えは、実際のエラー処理を扱います。私が探している解決策は、トラックを再生することなく、ユーザーがApple Musicアプリをデバイスにインストールしているかどうかを正確に判断できるかどうかです。
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.