Apple Music'in kullanıcının cihazında yüklü olup olmadığını nasıl kontrol edebilirim?


9

Hızlı bir müzik uygulaması yapıyorum. Uygulama, kullanıcıların Apple Music abonelikleri aracılığıyla Apple Music uygulamaları aracılığıyla müzik çalmalarını sağlar. Kullanıcının Apple Music aboneliğine sahip olup olmadığını kontrol edebiliyorum:

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

}

Bununla birlikte , bir nedenden dolayı bir kişinin Apple Music aboneliğine sahip olacağı, ancak cihazlarına Apple Music uygulamasının indirilmeyeceği senaryolar vardır. Kullanıcı aboneliğe sahip ancak cihaza sahip değilse, bu davaya abonelikleri yokmuş gibi davranmak istiyorum, yani Apple Music üzerinden müzik çalamayız.

Bu yüzden, Apple Music'in kullanıcının cihazında olup olmadığını kontrol etmenin yollarını aramaya gidiyorum. Bu cevabı buluyorum: Apple Music'in url şemasını bulmak için Swift'in bu kaynakla birlikte bir uygulamanın yüklü olup olmadığını kontrol edin ve bir kullanıcının hem Apple Music aboneliğine hem de Apple Music uygulamasının cihazında yüklü olup olmadığını kontrol edebilirim :

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

}

Sorun, Apple Music'i cihazımdan sildikten sonra bile, ilk durum, yani yazdırılan user has Apple Music subscription and has the apple music app installeddurum hala çağrılıyor. Ben değiştirirken çünkü doğru url şeması olduğuna inanmak "music://"için "musi://"yani baskılar o biri, ikinci durumda, user does not have subscription or doesn't have apple music installeddeniliyor.

URL(string: "music://")Apple Music üzerinden silindi ile açmaya çalışırken UIApplication.shared.open(URL(string: "music://")!), aşağıdaki uyarıyla karşılaşıyorum:

resim açıklamasını buraya girin

Peki cihaz neden URL(string: "music://")Apple Music silindikten sonra bile açabileceğimi söylüyor ? Açılabilir mi URL, ancak sonuç sadece yukarıdaki uyarının sunumu mu? Bu, kullanıcının cihazında Apple Music'in yüklü olduğunu doğrulamanın doğru yolu mu? Kullanıcının cihazında Apple Music yüklü olduğunu onaylamanın bir yolu var mı? Apple kullanıcılara Apple Music uygulamasını silme seçeneği sunarsa, geliştiricilere uygulamanın yüklü olup olmadığını kontrol etme olanağı da vermelidir.


Apple müziğiyle hiç çalışmadım, ancak Apple'ın bu url şemasına özel bir şekilde davrandığına inanıyorum, çünkü bu onların kendi ürünü olduğu için, bu url şemasına her bastığınızda, kullanıcıya uygulamayı değil, uygulamayı indirmeyi öneriyorlar. yanlış. Apple Music'te gerçek bir albüm açan veya gerçek bir şarkı çalan geçerli bir URL şeması belirlemeye çalıştınız mı? Ör .: URL(string: "music://trackID=3214534"). Belki bu açık url şeması olağan bir şekilde ele alınacak, ancak bir app restoreuyarıyı tetiklemeyecektir .
Starsky

Apple müzik ile derin bağlantı görünmüyor geçerli Elma Müzik parçası ve sanatçı kimlikleri kullanarak URL sayısı denedim: URL(string: "music://trackId=1377813289")!, URL(string: "music://track=1377813289"), URL(string: "music://artist=562555")!, URL(string: "music://artistId=562555")!. Derin bir bağlantı kurmanın tek yolu böyle bir şeydir URL(string: "https://music.apple.com/us/artist/562555")!, ancak bu HTTP olduğu için bu yardımcı olmaz.
David Chopin

LSApplicationQueriesSchemes ile info.plist'de beyaz müzik "//:" listeniz var mı? Değilse, canOpenUrl'nin yanlış davranması gerekir.
Karthick Ramesh

1
Ne yazık ki, info.plist'imdeki düzeni beyaz listeye eklemek davranışı hiç değiştirmiyor. Benim sorunum, Apple Müzik uygulaması silinmiş olsa bile, her zaman UIApplication.shared.canOpenURL(URL(string: "music://")!)geri dönüyor trueolmasıdır. falseUygulama silindiğinde geri dönmek istiyorum . URL şemasını beyaz listeye eklemek bu sorunu çözmez (denedim).
David Chopin

bunun için daha iyi bir çözüm buldunuz mu?
Martin Mlostek

Yanıtlar:


3

Sahip olduğum en iyi çözüm, daha iyi bir şey olmasını beklememe rağmen, MPMusicPlayer.prepareToPlay(completionHandler:)bir parçayı çalmaya çalışırken bir hata olup olmadığını kontrol etmek için kullanmaktır :

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

}

Bunun, parçalarında çalmaktan başka bir şey için uygulamalarında Apple Music'i kullanan herkes için nasıl geçerli olabileceğinden emin değilim, ancak bu bir çek oynamak üzereyken kesinlikle bir çek olarak çalışıyor gibi görünüyor. Bu hatayla karşılaştığımda, bireye Apple Müzik aboneliği olduğunu ancak uygulamanın yüklü olmadığını bildiren bir uyarı oluştururum.

Yine de, boolean denetiminin koşullu ifadelere (yoluyla if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something }) entegre edilmesine izin verecek şekilde bazı tamamlayıcı işleyiciler olmadan kontrol edebilmek harika olurdu .


Peki, bu çözüm hataları kontrol ederek çalışır, ancak biraz acayiptir ve bir tamamlama işleyicisinde aşağıdaki kodu yürütmeyi gerektirir. Uygulamanın yüklü olup olmadığını MusicKit çerçevesinin bir parçası olsun veya olmasın, basit kontrol etmenin bir yolu olması daha iyidir.
David Chopin

Ancak evet bu cevap, bir parçayı çalmaya hazırlanırken hataları kullanan bir çözümdür. Bir geliştiricinin parça çalmadan Apple Music'in yüklü olup olmadığını bilmesi gerekebilir.
David Chopin

1
bu hala bulduğun en iyi çözüm mü?
Martin Mlostek

Ne yazık ki, evet
David Chopin

0

Neyse ki Apple, URL'nin düzenini işlemek için aygıtta yüklü bir uygulama kaydedilmemişse veya URL'nin düzenini Info.plist dosyanızda bildirmediyseniz, false döndüren bir yöntem sağlar; aksi takdirde doğru.

func canOpenURL(_ url: URL) -> Bool

Aşağıdaki URL şemalarını gönderiyorum

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

Daha fazla kullanacağınız bilgileri info.plist dosyanıza ekleyin.

Bundan sonra daha fazla bilgi için 'canOpenURL' kullanın Apple belgelerini kontrol edin

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


Apple Music'in URL şeması, truegeçerken her zaman geri dönüyor canOpenUrl. Bu soru ile ilgilenmek istediğim ana sorun bu.
David Chopin

LSApplicationQueriesSchemes içinde 'Müzik uygulaması'nı belirttiniz mi?
Zeeshan Ahmed

Cevabı tekrar kontrol et, ben güncelledim.
Zeeshan Ahmed

Karthick Ramesh'in yorumuna göre, daha önce davranış değişikliği olmadan URL şemalarını beyaz listeye eklemeyi denedim
David Chopin

0

Olası bir çözüm aşağıdakileri yapıyor: Apple Music API aracılığıyla bir geliştirici belirteci ayarlayın (Apple Music REST uç noktalarını sorgulayabilmeniz için kullanılır). Aşağıdaki StoreKit işlevine ( Belgeler ) istek gönderin :

requestUserToken(forDeveloperToken:completionHandler:)

Geliştirici simgeniz geçerliyse ve döndürülen kullanıcı belirteci değeri hala nil / null ise, aygıt kullanıcısı Apple Music hizmetinin bir abonesi değildir. HTTP durum kodu ile oluşturulan bir hata 401'dir (Yetkisiz). Bu yine de bir hatayı kontrol etmenizi gerektirir, ancak belirli bir parçayı çalmayı gerektirmez (Özellikle bir nedenden dolayı kontrol ettiğiniz içerik parçası kimliği geçersiz veya değişmişse).

Cihazda oturum açmış ve bir aboneliğe sahip ancak indirilmiş Müzik uygulaması sorunu için: Belirli içeriği oynatmaya çalıştıktan sonra hatayı ele alın ve kullanıcıya bilgi verin veya alternatif olarak Apple Müzik aboneliği gerektirmeyen içeriği kullanın bir hata oluştuğunda.


1
Evet, bu yüzden bir kullanıcının aboneliği olup olmadığını nasıl kontrol edeceğimi zaten biliyorum . Yukarıda verilen cevabım, asıl hata işlemeyi ele alıyor. Aradığım çözüm kesinlikle kullanıcının bir parçayı çalmaya çalışmadan cihaza Apple Music uygulamasını yükleyip yüklemediğini söyleyebilir misiniz ?
David Chopin

0

Evet, aşağıdaki adımları izleyerek uygulamaların çoğunu kontrol edebiliriz:

  1. Açmak istediğiniz belirli uygulama için Derin URL'yi veya URL Şemasını kullanın, bunu info.plist'e ekleyin
  2. Aynı URL'yi kullanın ve Bu yöntemi çağırın
    func canOpenURL(_ url: URL) -> Bool
    let url = URL(string: "music://")

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

Bu sorun değil, soru , uygulama yüklü olmasa bile UIApplication.shared.canOpenUrl(URL(string: “music://”)!)her zaman geri dönüyor true.
David Chopin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.