Sto realizzando un'app musicale con swift. L'app consente agli utenti di riprodurre musica tramite l'abbonamento Apple Music tramite l'app Apple Music. Sono in grado di verificare se l'utente ha un abbonamento Apple Music tramite:
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")
}
}
Tuttavia: ci sono scenari in cui qualcuno, per qualche motivo, avrà un abbonamento Apple Music ma non avrà l'app Apple Music scaricata sul proprio dispositivo. Se l'utente ha l'abbonamento ma non il dispositivo, voglio essenzialmente trattare quel caso come se non avesse alcun abbonamento, cioè non possiamo riprodurre musica tramite Apple Music.
Quindi, cerco modi per aggiungere un controllo per verificare se Apple Music si trova sul dispositivo dell'utente. Trovo questa risposta: Controllare se un app è installato utilizzando Swift combinato con questa risorsa per la ricerca di schema URL di Apple di musica e concludere posso controllare se un utente ha sia un abbonamento di Apple di musica e l'applicazione Apple Music installato sul proprio dispositivo tramite:
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")
}
}
Il problema è, anche dopo aver eliminato Apple Music dal mio dispositivo, il primo caso, ovvero quello che stampa user has Apple Music subscription and has the apple music app installed
viene ancora chiamato. Credo di avere lo schema url corretto perché quando si cambia "music://"
in "musi://"
, il secondo caso, cioè quello che stampa user does not have subscription or doesn't have apple music installed
viene chiamato.
Quando provo ad aprire URL(string: "music://")
con Apple Music cancellato tramite UIApplication.shared.open(URL(string: "music://")!)
, sono colpito dal seguente avviso:
Quindi perché il dispositivo dice che posso aprire URL(string: "music://")
anche dopo l'eliminazione di Apple Music? È in URL
grado di essere aperto, ma il risultato è semplicemente la presentazione dell'avviso di cui sopra? È questo il modo corretto per confermare che l'utente ha installato Apple Music sul proprio dispositivo? Esiste un modo per confermare che l'utente ha installato Apple Music sul proprio dispositivo? Se Apple offre agli utenti la possibilità di eliminare l'app Apple Music, dovrebbero anche consentire agli sviluppatori di verificare se l'app è installata.
URL(string: "music://trackId=1377813289")!
, URL(string: "music://track=1377813289")
, URL(string: "music://artist=562555")!
, URL(string: "music://artistId=562555")!
. L'unico modo in cui sono stato in grado di collegare in profondità è tramite qualcosa di simile URL(string: "https://music.apple.com/us/artist/562555")!
, ma questo ovviamente non aiuta in quanto questo è HTTP.
UIApplication.shared.canOpenURL(URL(string: "music://")!)
ritorna true
sempre, anche se l'app Apple Music viene eliminata. Ho bisogno che ritorni false
quando l'app viene eliminata. La whitelisting dello schema URL non risolverà questo problema (l'ho provato).
URL(string: "music://trackID=3214534")
. : Forse questo esplicito schema di url verrebbe trattato in un modo normale, ma non innescherebbe unapp restore
avviso.