Як перевірити, чи встановлено 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 на пристрої користувача. Я знаходжу цю відповідь: Перевірте , чи встановлено додаток з допомогою Swift в поєднанні з цим ресурсом для пошуку схеми URL - адреси 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) && 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, все ще називається. Я вважаю, що у мене є правильна схема URL-адреси, оскільки при зміні "music://"на виклик "musi://"викликується другий випадок, тобто той, що друкує user does not have subscription or doesn't have apple music installed.

При спробі відкрити програму 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, але я вважаю, що Apple трактує цю схему URL по-особливому, оскільки це власний продукт, тому кожен раз, коли ви потрапляєте на цю URL-схему, вони краще пропонують користувачу завантажити додаток, а не повертатись помилковий. Чи спробували ви визначити дійсну схему URL, яка насправді відкрила б справжній альбом в Apple Music або відтворила фактичну пісню? Напр URL(string: "music://trackID=3214534").: Можливо, до цієї явної URL-схеми трактуватимуться звичайним способом, але не викликають app restoreпопередження.
Старскі

Я намагався кілька URL - адрес з використанням дійсних ідентифікаторів треків і виконавців Apple Music , що не здаються глибокого зв'язку з Apple , музика: 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.
Девід Шопен

у вас білий список "музика: //" в info.plist з LSApplicationQueriesSchemes ?. Якщо ні, canOpenUrl повинен неправильно поводитися.
Картік Рамеш

1
На жаль, білі схеми в моєму інформаційному списку зовсім не змінюють поведінку. Моя проблема полягає в тому, що весь час UIApplication.shared.canOpenURL(URL(string: "music://")!)повертається true, навіть якщо додаток Apple Music видалено. Мені потрібно повернутися, falseколи додаток видалено. Біла схема URL-адреси не виправить цю проблему (я спробував її).
Девід Шопен

ти знайшов для цього краще рішення?
Мартін Млостек

Відповіді:


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
це все-таки найкраще рішення, яке ти знайшов?
Мартін Млостек

На жаль, так
Девід Шопен

0

На щастя, Apple пропонує вам метод, який повертає помилкові, якщо жодна програма, встановлена ​​на пристрої, не зареєстрована для обробки схеми URL-адреси або якщо ви не оголосили схему URL-адреси у файлі Info.plist; інакше, правда.

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


Url-схема Apple Music завжди повертається trueпід час передачі canOpenUrl. Це головне питання, яке я хочу вирішити з цим питанням.
Девід Шопен

Ви вказали "Музичний додаток" у програмі LSApplicationQueriesSchemes?
Зеешан Ахмед

Перевірте відповідь ще раз, я оновив її.
Зеешан Ахмед

Відповідно до коментаря Картіка Рамеша, я раніше спробував схеми URL-адрес, які не були змінені, без зміни поведінки
Девід Шопен

0

Можливе рішення полягає в наступному: Налаштуйте маркер розробника через Apple Music API (використовується, щоб ви могли запитувати кінцеві точки Apple Music REST). Надішліть запит наступній функції StoreKit ( Документація ):

requestUserToken(forDeveloperToken:completionHandler:)

Якщо ваш маркер розробника дійсний, а повернене значення токена користувача все-таки дорівнює нулю / нулю, користувач пристрою не є абонентом служби Apple Music. Помилка, яка генерується за допомогою коду статусу HTTP, - 401 (Несанкціоноване). Це все ще вимагає перевірити помилку, однак не потрібно спробувати відтворити певну доріжку (особливо з певних причин, якщо ідентифікатор доріжки вмісту, на яку ви перевіряєте, стає недійсним або зміненим).

Що стосується випуску облікового запису, який увійшов у пристрій та має підписку, але не завантажений додаток Музика: Обробляйте помилку при спробі відтворення певного контенту або надайте інформацію користувачеві або використовуйте вміст, який не потребує підписки на Apple Music як альтернативу коли виникає помилка


1
Так, тому я вже знаю, як перевірити, чи є у користувача підписку . Моя відповідь, надана вище, стосується фактичної обробки помилок. Я шукаю рішення, суворо, чи можна сказати, чи користувач має на пристрої додаток Apple Music, не намагаючись відтворити трек.
Девід Шопен

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, навіть якщо додаток не встановлено.
Девід Шопен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.