Как проверить, установлена ​​ли Apple Music на устройстве пользователя? - PullRequest
5 голосов
/ 08 ноября 2019

Я создаю музыкальное приложение с помощью swift. Приложение позволяет пользователям воспроизводить музыку через подписку на 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://")!), у меня появляется следующее предупреждение:

enter image description here

Так почему же устройство говорит, что я могу открыть URL(string: "music://") даже после удаления Apple Music? Способен ли URL открываться, но в результате просто отображается вышеупомянутое предупреждение? Это правильный способ подтвердить, что пользователь установил Apple Music на своем устройстве? Есть ли способ подтвердить, что пользователь установил Apple Music на свое устройство? Если Apple дает пользователям возможность удалить приложение Apple Music, они также должны дать разработчикам возможность проверить, установлено ли приложение.

Ответы [ 4 ]

0 голосов
/ 15 ноября 2019

Да, мы можем проверить большинство приложений, выполнив следующие действия:

  1. Используйте Deep 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!
       }
    }
0 голосов
/ 13 ноября 2019

К счастью, Apple предоставляет вам метод, который возвращает false, если на устройстве не зарегистрировано приложение, установленное для обработки схемы URL, или если вы не объявили схему URL в файле Info.plist;в противном случае, true.

func canOpenURL(_ url: URL) -> Bool

После того, как я публикую схемы URL

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

Добавьте те, которые вы будете в дальнейшем использовать, в свой файл info.plist.

После этого используйте 'canOpenURL' для проверки дополнительной информации, проверьте Apple docs

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

0 голосов
/ 13 ноября 2019

Возможное решение заключается в следующем: настройка токена разработчика через Apple Music API (используется для запроса конечных точек Apple Music REST). Отправьте запрос в следующую функцию StoreKit ( Documentation ):

requestUserToken(forDeveloperToken:completionHandler:)

Если ваш токен разработчика действителен, а возвращаемое значение токена пользователя по-прежнему равно nil / null, то пользователь устройства не являетсяподписчик сервиса Apple Music. Ошибка, генерируемая с кодом состояния HTTP, - 401 (неавторизовано). Для этого по-прежнему требуется проверка ошибки, однако не требуется пытаться воспроизвести конкретную дорожку (особенно по какой-то причине, если идентификатор дорожки содержимого, по которому вы проверяли, становится недействительным или изменен).

Для вопроса о входе в учетную записьустройство и имеет подписку, но не загруженное приложение Музыка: обработайте ошибку при попытке воспроизведения определенного контента и либо предоставьте информацию пользователю, либо используйте контент, не требующий подписки Apple Music, в качестве альтернативы при возникновении ошибки.

0 голосов
/ 11 ноября 2019

Баунти все еще готов, если можно предложить лучшее решение (я не могу выиграть свою собственную награду) Лучшее решение, которое у меня есть, хотя я ожидаю, что есть что-то лучшее,должен использовать 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 }).

...