Estou criando um aplicativo de música com rapidez. O aplicativo permite que os usuários reproduzam músicas por meio da assinatura do Apple Music por meio do aplicativo Apple Music. Consigo verificar se o usuário tem uma assinatura do Apple Music via:
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")
}
}
No entanto: existem cenários em que alguém, por algum motivo, possui uma assinatura do Apple Music, mas não o aplicativo Apple Music baixado em seu dispositivo. Se o usuário tiver a assinatura, mas não o dispositivo, quero tratar essencialmente esse caso como se eles não tivessem uma assinatura, ou seja, não podemos tocar música pelo Apple Music.
Então, vou procurar maneiras de adicionar uma verificação para ver se o Apple Music está no dispositivo do usuário. Acho que esta resposta: Verificar se um aplicativo é instalado usando Swift combinado com este recurso para encontrar esquema de url da Apple Música e concluir posso verificar se um usuário tem tanto uma assinatura Apple Music e o aplicativo Apple Music instalado em seu dispositivo através de:
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")
}
}
O problema é que, mesmo depois de excluir o Apple Music do meu dispositivo, o primeiro caso, ou seja, aquele que imprime user has Apple Music subscription and has the apple music app installed
ainda está sendo chamado. Acredito que possuo o esquema de URL correto, pois ao mudar "music://"
para "musi://"
o segundo caso, ou seja, aquele que imprime user does not have subscription or doesn't have apple music installed
está sendo chamado.
Ao tentar abrir URL(string: "music://")
com o Apple Music excluído via UIApplication.shared.open(URL(string: "music://")!)
, recebo o seguinte alerta:
Então, por que o dispositivo está dizendo que eu posso abrir URL(string: "music://")
mesmo após a exclusão do Apple Music? É URL
capaz de ser aberto, mas o resultado é simplesmente a apresentação do alerta acima? Essa é a maneira correta de confirmar que o usuário tem o Apple Music instalado no dispositivo? Existe alguma maneira de confirmar que o usuário tem o Apple Music instalado no dispositivo? Se a Apple oferecer aos usuários a opção de excluir o aplicativo Apple Music, eles também deverão dar aos desenvolvedores a capacidade de verificar se o aplicativo está instalado.
fonte
URL(string: "music://trackID=3214534")
. : . Talvez esse esquema de URL explícito seja tratado da maneira usual, mas não acione umapp restore
alerta.URL(string: "music://trackId=1377813289")!
,URL(string: "music://track=1377813289")
,URL(string: "music://artist=562555")!
,URL(string: "music://artistId=562555")!
. A única maneira pela qual consegui fazer o link direto é por meio de algo assimURL(string: "https://music.apple.com/us/artist/562555")!
, mas isso obviamente não ajuda, pois é HTTP.UIApplication.shared.canOpenURL(URL(string: "music://")!)
voltatrue
sempre, mesmo que o aplicativo Apple Music seja excluído. Preciso retornarfalse
quando o aplicativo for excluído. A lista de permissões do esquema de URL não corrigirá esse problema (tentei).Respostas:
A melhor solução que eu tenho, embora eu espere que exista algo melhor por aí, é usar
MPMusicPlayer.prepareToPlay(completionHandler:)
para verificar se há algum erro ao tentar reproduzir uma faixa:Não sei como isso se aplica a qualquer pessoa que use o Apple Music em seu aplicativo para outra coisa que não seja reproduzir faixas, mas isso parece funcionar definitivamente como uma verificação quando você está prestes a executar uma verificação. Sempre que sou atingido por esse erro, simplesmente crio um alerta informando à pessoa que ela possui uma assinatura do Apple Music, mas não tem o aplicativo instalado.
Ainda assim, seria ótimo poder verificar sem algum manipulador de conclusão, pois isso permitiria que a verificação booleana fosse integrada às instruções condicionais (via
if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something }
).fonte
Felizmente, a Apple fornece um método que retorna false se nenhum aplicativo instalado no dispositivo estiver registrado para lidar com o esquema da URL ou se você não tiver declarado o esquema da URL no arquivo Info.plist; caso contrário, é verdade.
A seguir, estou postando os esquemas de URL
Adicione os que você usará mais no seu arquivo info.plist.
Após esse uso, 'canOpenURL' para verificar mais informações, consulte os documentos da Apple
https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl
fonte
true
ao ser transmitidocanOpenUrl
. Essa é a questão principal que quero abordar com esta pergunta.Uma solução possível é fazer o seguinte: Configure um token de desenvolvedor por meio da API Apple Music (Usado para que você possa consultar os pontos de extremidade REST do Apple Music). Envie uma solicitação para a seguinte função StoreKit ( Documentação ):
Se o seu token de desenvolvedor for válido e o valor do token de usuário retornado ainda for nulo / nulo, o usuário do dispositivo não é assinante do serviço Apple Music. Um erro gerado com o código de status HTTP é 401 (Não autorizado). Isso ainda exige que você verifique um erro, no entanto, não é necessário tentar reproduzir uma faixa específica (especialmente por algum motivo, se o ID da faixa de conteúdo sob sua verificação se tornar inválido ou alterado).
Para o problema de conta conectada ao dispositivo e com uma assinatura, mas não o aplicativo Music baixado: lide com o erro ao tentar reproduzir conteúdo específico e forneça informações ao usuário ou use conteúdo que não requer uma assinatura do Apple Music como alternativa quando ocorrer um erro.
fonte
Sim, podemos verificar a maioria dos aplicativos seguindo estas etapas:
fonte
UIApplication.shared.canOpenUrl(URL(string: “music://”)!)
está sempre retornandotrue
, mesmo que o aplicativo não esteja instalado.