Ich mache eine Musik-App mit Swift. Mit der App können Benutzer Musik über ihr Apple Music-Abonnement über ihre Apple Music-App abspielen. Ich kann überprüfen, ob der Benutzer ein Apple Music-Abonnement hat über:
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")
}
}
Es gibt jedoch Szenarien, in denen jemand aus irgendeinem Grund ein Apple Music-Abonnement hat, die Apple Music-App jedoch nicht auf sein Gerät heruntergeladen hat. Wenn der Benutzer das Abonnement hat, aber nicht das Gerät, möchte ich diesen Fall im Wesentlichen so behandeln, als ob er überhaupt kein Abonnement hat, dh wir können keine Musik über Apple Music abspielen.
Daher suche ich nach Möglichkeiten, um zu überprüfen, ob sich Apple Music auf dem Gerät des Benutzers befindet. Ich finde diese Antwort: Überprüfen Sie, ob eine App mit Swift in Kombination mit dieser Ressource installiert wurde, um das URL-Schema von Apple Music zu finden, und schließen Sie, dass ich überprüfen kann, ob ein Benutzer sowohl ein Apple Music-Abonnement als auch die Apple Music-App auf seinem Gerät installiert hat, und zwar über:
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")
}
}
Das Problem ist, dass auch nach dem Löschen von Apple Music von meinem Gerät der erste Fall, dh der, der gedruckt user has Apple Music subscription and has the apple music app installed
wird, immer noch aufgerufen wird. Ich glaube, ich habe das richtige URL-Schema, weil beim Wechsel "music://"
zum "musi://"
zweiten Fall, dh dem, der gedruckt user does not have subscription or doesn't have apple music installed
wird, aufgerufen wird.
Beim Versuch, URL(string: "music://")
mit über gelöschter Apple Music zu öffnen UIApplication.shared.open(URL(string: "music://")!)
, wird folgende Warnung angezeigt:
Warum sagt das Gerät, dass ich URL(string: "music://")
auch nach dem Löschen von Apple Music öffnen kann ? Kann das URL
geöffnet werden, aber das Ergebnis ist einfach die Darstellung der obigen Warnung? Ist dies der richtige Weg, um zu bestätigen, dass der Benutzer Apple Music auf seinem Gerät installiert hat? Gibt es überhaupt eine Möglichkeit zu bestätigen, dass der Benutzer Apple Music auf seinem Gerät installiert hat? Wenn Apple Benutzern die Möglichkeit gibt, die Apple Music-App zu löschen, sollten sie Entwicklern auch die Möglichkeit geben, zu überprüfen, ob die App installiert ist.
quelle
URL(string: "music://trackID=3214534")
. Möglicherweise wird dieses explizite URL-Schema wie gewohnt behandelt, aber keineapp restore
Warnung ausgelöst .URL(string: "music://trackId=1377813289")!
,URL(string: "music://track=1377813289")
,URL(string: "music://artist=562555")!
,URL(string: "music://artistId=562555")!
. Die einzige Möglichkeit, eine tiefe Verbindung herzustellen, ist über so etwasURL(string: "https://music.apple.com/us/artist/562555")!
, aber dies hilft offensichtlich nicht, da dies HTTP ist.UIApplication.shared.canOpenURL(URL(string: "music://")!)
es immer wieder zurückkommttrue
, auch wenn die Apple Music App gelöscht wird. Ich brauche es, um zurückzukehren,false
wenn die App gelöscht wird. Das Whitelisting des URL-Schemas behebt dieses Problem nicht (ich habe es versucht).Antworten:
Die beste Lösung, die ich habe, obwohl ich davon ausgehe, dass es etwas Besseres gibt, besteht darin,
MPMusicPlayer.prepareToPlay(completionHandler:)
zu überprüfen, ob beim Abspielen eines Titels ein Fehler vorliegt:Ich bin mir nicht sicher, wie dies für jemanden gelten könnte, der Apple Music in seiner App für etwas anderes als das Abspielen von Titeln verwendet, aber dies scheint definitiv als Scheck zu funktionieren, wenn Sie einen Scheck spielen möchten. Immer wenn ich von diesem Fehler betroffen bin, erstelle ich einfach eine Warnung, in der der Person mitgeteilt wird, dass sie ein Apple Music-Abonnement hat, die App jedoch nicht installiert ist.
Trotzdem wäre es großartig, ohne einen Completion-Handler prüfen zu können, da dies die Integration der booleschen Prüfung in bedingte Anweisungen (via
if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something }
) ermöglichen würde.quelle
Glücklicherweise bietet Apple eine Methode an, die false zurückgibt, wenn keine auf dem Gerät installierte App für die Verarbeitung des URL-Schemas registriert ist oder wenn Sie das Schema der URL nicht in Ihrer Info.plist-Datei deklariert haben. sonst wahr.
Im Folgenden poste ich die URL-Schemata
Fügen Sie diejenigen, die Sie weiter verwenden werden, in Ihre info.plist-Datei ein.
Verwenden Sie danach 'canOpenURL', um weitere Informationen zu erhalten. Überprüfen Sie die Apple-Dokumente
https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl
quelle
true
wenn es weitergeleitet wirdcanOpenUrl
. Das ist das Hauptproblem, das ich mit dieser Frage ansprechen möchte.Eine mögliche Lösung ist die folgende: Einrichten eines Entwicklertokens über die Apple Music API (Wird verwendet, um Apple Music REST-Endpunkte abzufragen). Senden Sie eine Anfrage an die folgende StoreKit-Funktion ( Dokumentation ):
Wenn Ihr Entwicklertoken gültig ist und der zurückgegebene Benutzertokenwert immer noch null / null ist, ist der Gerätebenutzer kein Abonnent des Apple Music-Dienstes. Ein Fehler, der mit dem HTTP-Statuscode generiert wird, ist 401 (nicht autorisiert). Dies erfordert weiterhin, dass Sie einen Fehler überprüfen, jedoch nicht versuchen, einen bestimmten Titel abzuspielen (insbesondere aus irgendeinem Grund, wenn die ID des Inhalts-Tracks, gegen den Sie prüfen, ungültig wird oder geändert wird).
Für die Ausgabe eines Kontos, das auf dem Gerät angemeldet ist und über ein Abonnement verfügt, jedoch nicht die heruntergeladene Musik-App: Behandeln Sie den Fehler, wenn Sie versuchen, bestimmte Inhalte abzuspielen, und geben Sie entweder Informationen an den Benutzer weiter oder verwenden Sie Inhalte, für die alternativ kein Apple Music-Abonnement erforderlich ist wenn ein Fehler auftritt.
quelle
Ja, wir können die meisten Anwendungen anhand der folgenden Schritte überprüfen:
quelle
UIApplication.shared.canOpenUrl(URL(string: “music://”)!)
immer wiederkehrende Fragetrue
, auch wenn die App nicht installiert ist.