Bagaimana cara memeriksa apakah Apple Music diinstal pada perangkat pengguna?

9

Saya membuat aplikasi musik dengan cepat. Aplikasi ini memungkinkan pengguna memutar musik melalui langganan Apple Music mereka melalui aplikasi Apple Music mereka. Saya dapat memeriksa apakah pengguna memiliki langganan Apple Music melalui:

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")
    }

}

Namun: ada skenario di mana seseorang akan, karena alasan tertentu, memiliki langganan Apple Music tetapi tidak memiliki aplikasi Apple Music diunduh di perangkat mereka. Jika pengguna memiliki langganan tetapi bukan perangkat, saya ingin dasarnya memperlakukan kasus itu seolah-olah mereka tidak memiliki langganan sama sekali, yaitu kita tidak dapat memutar musik melalui Apple Music.

Jadi, saya mencari cara untuk menambahkan tanda centang apakah Apple Music ada di perangkat pengguna. Saya menemukan jawaban ini: Periksa apakah aplikasi diinstal menggunakan Swift dikombinasikan dengan sumber daya ini untuk menemukan skema url Apel Music dan menyimpulkan saya dapat memeriksa apakah pengguna memiliki kedua berlangganan Apel Musik dan aplikasi Apel Musik diinstal pada perangkat mereka melalui:

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")
    }

}

Masalahnya adalah, bahkan setelah menghapus Apple Music dari perangkat saya, kasus pertama, yaitu yang dicetak user has Apple Music subscription and has the apple music app installedmasih dipanggil. Saya percaya saya memiliki skema url yang benar karena ketika mengubah "music://"ke "musi://", kasus kedua, yaitu yang mencetak user does not have subscription or doesn't have apple music installeddipanggil.

Ketika mencoba membuka URL(string: "music://")dengan Apple Music dihapus melalui UIApplication.shared.open(URL(string: "music://")!), saya terpukul dengan peringatan berikut:

masukkan deskripsi gambar di sini

Jadi mengapa perangkat mengatakan bahwa saya dapat membuka URL(string: "music://")bahkan setelah Apple Music dihapus? Apakah yang URLmampu dibuka, tetapi hasilnya hanyalah presentasi dari peringatan di atas? Apakah ini cara yang benar untuk mengonfirmasi bahwa pengguna telah menginstal Apple Music di perangkat mereka? Apakah ada cara untuk mengonfirmasi pengguna telah menginstal Apple Music di perangkat mereka? Jika Apple memberi pengguna opsi untuk menghapus aplikasi Apple Music, mereka juga harus memberi pengembang kemampuan untuk memeriksa apakah aplikasi tersebut diinstal.

David Chopin
sumber
Saya sendiri tidak pernah bekerja dengan musik Apple, tetapi saya percaya Apple memperlakukan skema url ini dengan cara yang khusus, karena ini adalah produk mereka sendiri, sehingga setiap kali Anda menekan skema url itu, mereka lebih baik mengusulkan kepada pengguna untuk mengunduh aplikasi, daripada mengembalikannya. Salah. Apakah Anda mencoba mengidentifikasi skema URL yang valid yang sebenarnya akan membuka album nyata di Apple Music atau memutar lagu yang sebenarnya? Mis URL(string: "music://trackID=3214534"). : . Mungkin skema url eksplisit ini akan diperlakukan dengan cara biasa, tetapi tidak memicu app restoreperingatan.
Starsky
Saya sudah mencoba beberapa URL menggunakan valid Apel Musik lagu dan artis ID yang tampaknya tidak tautan dalam dengan musik Apel: URL(string: "music://trackId=1377813289")!, URL(string: "music://track=1377813289"), URL(string: "music://artist=562555")!, URL(string: "music://artistId=562555")!. Satu-satunya cara saya dapat tautan dalam adalah melalui sesuatu seperti URL(string: "https://music.apple.com/us/artist/562555")!, tapi ini jelas tidak membantu karena ini adalah HTTP.
David Chopin
Sudahkah Anda memutarkan "musik: //" di info.plist dengan LSApplicationQueriesSchemes ?. Jika tidak, canOpenUrl seharusnya misBehave.
Karthick Ramesh
1
Sayangnya, daftar putih skema di info.plist saya tidak mengubah perilaku sama sekali. Masalah saya adalah itu UIApplication.shared.canOpenURL(URL(string: "music://")!)selalu kembali true, bahkan jika aplikasi Apple Music dihapus. Saya membutuhkannya untuk kembali falseketika aplikasi dihapus. Daftar putih skema url tidak akan memperbaiki masalah ini (saya mencobanya).
David Chopin
apakah Anda menemukan solusi yang lebih baik untuk itu?
Martin Mlostek

Jawaban:

3

Solusi terbaik yang saya miliki, meskipun saya berharap ada sesuatu yang lebih baik di luar sana, adalah digunakan MPMusicPlayer.prepareToPlay(completionHandler:)untuk memeriksa apakah ada kesalahan ketika mencoba memainkan trek:

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")
    }

}

Saya tidak yakin bagaimana ini dapat diterapkan pada siapa saja yang menggunakan Apple Music di dalam aplikasi mereka untuk apa pun selain memainkan trek, tetapi ini tampaknya berfungsi sebagai cek ketika Anda akan memainkan cek. Setiap kali saya terkena kesalahan itu, saya cukup membuat lansiran yang memberi tahu individu bahwa mereka memiliki langganan Apple Music tetapi tidak memiliki aplikasi yang diinstal.

Namun, akan lebih baik untuk dapat memeriksa tanpa beberapa handler penyelesaian karena itu akan memungkinkan pemeriksaan boolean diintegrasikan ke dalam pernyataan bersyarat (via if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something }).

David Chopin
sumber
Nah, solusi ini bekerja dengan memeriksa kesalahan, tetapi ini sedikit macet dan membutuhkan mengeksekusi kode berikut dalam penyelesaian penangan. Lebih baik memiliki cara untuk memeriksa sederhana, apakah itu merupakan bagian dari kerangka kerja MusicKit atau tidak, apakah aplikasi itu sendiri diinstal.
David Chopin
Tapi ya jawaban ini adalah solusi yang memanfaatkan kesalahan saat bersiap untuk memainkan trek. Pengembang mungkin perlu tahu apakah Apple Music diinstal tanpa memutar trek.
David Chopin
1
apakah ini masih solusi terbaik yang Anda temukan?
Martin Mlostek
Sayangnya, ya
David Chopin
0

Untungnya Apple memberi Anda metode yang mengembalikan false jika tidak ada aplikasi yang diinstal pada perangkat terdaftar untuk menangani skema URL, atau jika Anda belum menyatakan skema URL dalam file Info.plist Anda; jika tidak, benar.

func canOpenURL(_ url: URL) -> Bool

Setelah saya memposting skema url

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

Tambahkan yang selanjutnya akan Anda gunakan ke file info.plist Anda.

Setelah ini gunakan 'canOpenURL' untuk memeriksa informasi lebih lanjut, periksa dokumen Apple

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

Zeeshan Ahmed
sumber
Skema url Apple Music selalu kembali truesaat melewatinya canOpenUrl. Itulah masalah utama yang ingin saya bahas dengan pertanyaan ini.
David Chopin
sudahkah Anda menentukan 'Aplikasi musik' di LSApplicationQueriesSchemes?
Zeeshan Ahmed
periksa lagi jawabannya saya sudah memperbaruinya.
Zeeshan Ahmed
Per komentar Karthick Ramesh, saya sebelumnya mencoba skema URL daftar putih tanpa perubahan perilaku
David Chopin
0

Solusi yang mungkin dilakukan adalah sebagai berikut: Mengatur token pengembang melalui Apple Music API (Digunakan agar Anda dapat menanyakan titik akhir Apple Music REST). Kirim permintaan ke fungsi StoreKit berikut ( Dokumentasi ):

requestUserToken(forDeveloperToken:completionHandler:)

Jika token pengembang Anda valid dan nilai token pengguna yang dikembalikan masih nol / nol, maka pengguna perangkat tersebut bukan pelanggan layanan Apple Music. Kesalahan yang dihasilkan dengan kode status HTTP adalah 401 (Tidak Diotorisasi). Ini masih mengharuskan Anda memeriksa kesalahan namun tidak perlu mencoba dan memutar trek tertentu (Terutama karena beberapa alasan jika id konten lagu yang Anda periksa menjadi tidak valid atau diubah).

Untuk masalah akun yang masuk ke perangkat dan berlangganan tetapi tidak mengunduh aplikasi Musik: Tangani kesalahan saat mencoba memutar konten tertentu dan berikan informasi kepada pengguna atau gunakan konten yang tidak memerlukan berlangganan Apple Music sebagai alternatif. saat kesalahan terjadi.

SierraMike
sumber
1
Ya, jadi saya sudah tahu cara memeriksa apakah pengguna memiliki langganan . Jawaban saya yang diberikan di atas membahas penanganan kesalahan yang sebenarnya. Solusi saya cari adalah ketat apakah Anda dapat mengetahui apakah pengguna memiliki Apple App Musik diinstal ke perangkat tanpa harus mencoba untuk memutar lagu.
David Chopin
0

Ya, Kami dapat memeriksa sebagian besar Aplikasi dengan mengikuti Langkah-langkah ini:

  1. Gunakan Deep URL atau Skema URL untuk aplikasi tertentu yang ingin Anda buka, tambahkan itu ke info.plist
  2. Gunakan URL yang sama dan Hubungi metode ini
    func canOpenURL(_ url: URL) -> Bool
    let url = URL(string: "music://")

    UIApplication.shared.open(url!) { (result) in
       if result {
          // The URL was delivered successfully!
       }
    }
Srinivasan CP
sumber
Ini bukan masalah, pertanyaan yang dijabarkan UIApplication.shared.canOpenUrl(URL(string: “music://”)!)selalu kembali true, bahkan jika aplikasi tidak diinstal.
David Chopin