Guiding Questions - OnDemandResourcesTutorial/tvos-odr-tutorial GitHub Wiki

1. O que é On-Demand Resources? On-Demand Resources é uma API criada para obtenção e gerenciamento de recursos para as aplicações na medida em que estes forem necessários, permitindo assim a construção de aplicações menores e a realização de downloads mais otimizados por parte do usuário. Outro fator importante é que o bom uso do ODR permite as aplicações serem lançadas de forma mais rápida.

2. Quando o On-Demand Resources foi criado? Junto com o iOS 9 em 2015.

3. Para que o On-Demand Resources foi criado? Para reduzir o tamanho inicial dos aplicativos, fazendo com que o conteúdo fique hospedado de forma separada do bundle principal, o que torna o download desses dados mais eficaz e o conteúdo do aplicativo mai rico.

4. Quais os benefícios de utilizar On-Demand Resources?

5. Quais os malefícios de utilização do On-Demand Resources? Não há uma definição clara dos malefícios, no entanto, caso o usuário de uma aplicação precise usar um recurso que depende de um resources a ser ainda baixado e ele não tiver acesso a internet no momento, pode ser impedido de usar esse recurso.

6. Em quais casos não é eficiente utilizar On-Demand Resources? Em recursos e arquivos que fazem parte do uso essencial da aplicação. Exemplos: em um jogo, os arquivos que compõem o menu são essenciais para a utilização da aplicação, então torna-se ineficiente ter de baixá-los fora do aplicativo principal.

7. Que tipos de arquivos podem ser transmitidos via On-Demand Resources? Os arquivos transmitidos podem ser de qualquer tipo suportado pelo bundle:

Tipo Catalogo de assets Arquivo
Data file
Image
OpenGL shader
SpriteKit particle
SpriteKit scene
SpriteKit texture atlas
Apple TV Image Stack

Exceto por código executável(Swift, Obj-C, C e C++), arquivos gerados por linguagens de script podem ser tratados como on-Demand Resources, bem como todos arquivos suportados pelos bundles na tabela anterior.

8. Quais são os tipos de conteúdo mais disponibilizadas via On-Demand Resources? Não há nenhum dado do tipo disponível, mas todas as referências citam imagens, sons e outros recursos específicos de uma funcionalidade de um app ou parte do jogo em que o usuário pode precisar apenas em momentos específicos.

9. Quais plataformas da Apple tem o On-Demand Resources e a partir de que versão? É possível alguma integração entre o On-Demand Resources de cada uma? O ODR contempla até o momento apenas para iOS 9+ e o tvOS, os limites de armazenamento são basicamente os mesmos para cada plataforma. Considerando que o limite de tamanho para o app bundle na tvOS é de 4GB, o ODR torna-se uma ferramenta importantíssima para ser aplicada aos apps da Apple TV que requerem grande espaço de armazenamento. https://developer.apple.com/library/content/documentation/General/Conceptual/AppleTV_PG/OnDemandResources.html https://code.tutsplus.com/tutorials/an-introduction-to-on-demand-resources-on-ios-and-tvos--cms-24929

10. Existe diferenças de funcionamento da framework em cada OS da Apple? Estas diferenças poderiam prejudicar apps multi-plataforma? O funcionamento do ODR tanto no iOS como no tvOS é basicamente o mesmo, assim como praticamente todo código Swift é semelhante nas duas plataformas. Portanto, isso não se torna uma dificuldade para apps multi-plataforma.

11. Há alguma burocracia para utilizar On-Demand Resources em um aplicativo? Na verdade a utilização do ODR é bastante simplificada em termos técnicos, já que o seu uso em código foi facilitado ao máximo possível. Contudo, existe o fato de que caso escolha usar seu próprio web server - permitido apenas em período de desenvolvimento, exceto para corporações - este servidor precisa estar em conformidade com os Server Security Requirements da Apple, que inclui, por exemplo, uma conexão SSL. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/IntrotoHostingODR.html#//apple_ref/doc/uid/TP40015083-CH17-SW1

12. Como funciona o Ciclo de Vida do On-Demand Resources? Quando o aplicativo é baixado, vem somente com os pré-requisitos de ODR, conforme o usuário interage com a aplicação, esta solicita tags que representam o conjunto de recursos e usa esses recursos associados a elas, após, informa o sistema que concluiu as tarefas usando essas tags. Um tempo após essas operação o sistema remove uma ou mais dessas tags.

13. Como fazer o debug do On-Demand Resources?
ODR oferece recursos para depurar problemas com transferência de arquivos, espaço de armazenamento e estado inesperado.
Problemas com transferência de arquivos são dividido em 3 segmentos:
Problemas de rede: onde na documentação é disponibilizado o exemplo de código Reachability, que verifica o tipo de conexão e pode especificar se determinado nó de rede está acessível e outros problemas comuns de rede. Tamanho do pacote de assets: Quando um pacote de assets é grande e pode levar muito tempo para baixar. Para essas situação é recomendado fazer testes de downloads em diferentes situações.
Recursos inexistentes: este erro ocorre quando tags são inválidas e pode ser tratado pelos métodos beginAccessingResourcesWithCompletionHandler: que define o código de error para NSBundleOnDemandResourceInvalidTagError e conditionallyBeginAccessingResourcesWithCompletionHandler: onde o mais comum é errar a digitação na lista tags, para essa situação se deve comparar as tags do objeto com as tags do projeto usando NSBundleResourceRequest.
Problemas com espaço de armazenamento podem ocorrer por exceder o espaço máximo de 2GB de armazenamento em uso ou por exceder o armazenamento do sistema. O primeiro caso pode ocorrer com a chamadas dos métodos beginAccessingResourcesWithCompletionHandler: ou conditionallyBeginAccessingResourcesWithCompletionHandler: que retorna o erro NSBundleOnDemandResourceExceededMaximumSizeError no completion, nesse caso, é possível liberar espaço enviando endAccessingResources de uma tag para NSBundleResourceRequest. Também é possível desalocar recursos de uma tag.Para o segundo caso que é exceder a memória do sistema, ele pode ocorrer por solicitar um recurso que exige mais memória do que a que está disponível, beginAccessingResourcesWithCompletionHandler: retorna o código desse erro para NSBundleOnDemandResourceOutOfSpaceError. Esse tipo de erro também pode ocorrer quando não há espaço na memória cache e é preciso liberar espaço, este caso também pode ocorrer com a aplicação em segundo plano.
Estado inesperado: Para este caso é recomendado abrir o medidor de depuração de disco durante a execução da aplicação que indica o seu estado atual, onde é mostrado o status de cada tag e o tamanho dela.

Mais detalhes em: https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/DebugTips.html

14. O que fazer quando ocorre um erro na transmissão do Resources via On-Demand?
Não há nada em específico de como tratar o erro, porém o arquivo é inacessível até o download ser completado, assim, provavelmente é preciso reiniciar o download do resource. Existe uma forma de saber os estados de um determinado resource, para isso é preciso abrir a aba Disk Gauge no modo debug do Xcode e verificar se o resource em questão está em "Partially Downloaded", ou seja, houve um erro durante o download do resource.

15. Como garantir a segurança da operação usando o On-Demand Resources?
No caso de os resources serem armazenados nos servidores da Apple, esta já lida com a segurança. Porém, caso seja armazenado em um servidor próprio, a Apple tem os seguintes requisitos de acordo com a documentação:

Hospedar On-Demand Resources requer um servidor que atende com os requisitos de transporte de segurança de app da Apple. Isso inclui ter uma conexão SSL com o certificado válido assinado por uma autoridade apropriada. Um app pode ser configurado para reduzir os requisitos de segurança.

Servidores hospedando On-Demand Resources precisam usar um certificado assinado por uma autoridade confiável. Certificados auto-assinados não são suportados.

16. Há algo no Human Interface Guidelines tratando de On-Demand Resources?
Não há uma sessão específica no HIG [3] tratando de On-Demand Resources, porém tem uma sessão sobre Loading, que pode ser aplicado caso o resource a ser baixado impeça o usuário de continuar a navegação no app até a finalização do download.

17. O On-Demand Resources possui seu próprio conjunto de guidelines?
Sim, a Apple tem um guia [1] sobre práticas para ser aplicadas quando for utilizar o On-Demand Resources, como formas de testar, princípios de design para On-Demand Resources para uma melhor experiência do usuário.

18. Outras plataformas não-Apple utilizam alguma forma de On-Demand Resources? Se sim, como?
Sim, plataformas como Android, jogos feitos em Unity e outros. No Android, uma possibilidade é através de um cache para armazenar os arquivos que serão baixados. No Unity, há tanto o uso do próprio On-Demand Resources da Apple como outros, a exemplo do cenas que podem ser requisitadas pelo UnityWebRequest. Há também o On-Demand Computing, onde os resources são computacionais, como espaço de armazenamento, velocidade computacional e softwares disponíveis apenas nos momentos necessários.

Fontes: https://developer.android.com/training/efficient-downloads/redundant_redundant.html https://docs.unity3d.com/ScriptReference/BuildOptions.BuildAdditionalStreamedScenes.html https://blogs.unity3d.com/pt/2015/11/26/mastering-on-demand-resources-for-apple-platforms/ https://www.techopedia.com/definition/1308/on-demand-computing-odc

19. O On-Demand Resources necessariamente exclui os arquivos após o uso? Há como alterar isso?
Não, é possível manter o arquivo por um tempo maior, e apenas quando seu uso não for mais necessário, liberar ele para o sistema operacional elimina-lo. Há também como configurar uma prioridade de preservação, indicando ao sistema se um arquivo tem importância em ser mantido ou em ser eliminado pelo SO.

**20. Apenas os servidores da Apple podem hospedar On-Demand Resources? **
De acordo com a documentação, se o aplicativo é distribuído na AppStore só é possível usar os servidores da Apple durante a distribuição, entretanto, durante o processo de desenvolvimento e o de teste é possível usar outros servidores. Já apps corporativos de distribuição interna podem ter seu próprio servidor tanto durante o desenvolvimento como na distribuição.

21. Quais são os passos para hospedar On-Demand Resources em qualquer servidor web?
Pode-se hospedar recursos para serem usados On-Demand em qualquer servidor seguindo os seguintes passos:

  • Configurar a segurança do servidor
  • Escolher uma URL para hosting dos pacotes de assets
  • Gerar o pacote de assets
  • Adicionar o pacote de assets ao servidor
  • Habilitar o app a usar o pacote de dados hospedados

22. Existe algum requisito de segurança do servidor para armazenar os recursos transportados?
Sim, para se hospedar os recursos On-Demand no servidor, é necessário que este cumpra os requisitos dos apps da Apple em relação ao transporte de segurança, o que inclui ter uma conexão SSL com um certificado valido assinado por uma autoridade apropriada.

23. Como configurar um servidor para ele ser um provedor de On-Demand Resources?
Esse servidor deve estar em conformidade com o Apple App Transport Security Requirements.

24. Como utilizar On-Demand Resources em modo de desenvolvimento? Você pode hospedar em um Xcode server, em algum servidor local/remoto de sua preferência que esteja em conformidade com o Apple App Transport Security Requirements ou utilizar o TestFlight (App Store)

25. O On-Demand Resources tem limite de uso de storage? Existe um limite específico para cada situação:

Item Tamanho Slicing
iOS App bundle 2GB
tvOS App bundle 4GB
tag 512MB
Assets packs 1000MB
instalação inicial de tags 2GB
instalação inicial e tags de pré-requisito 4GB
ecursos ODR em uso 2GB
total de recursos ODR 20GB

26. O On-Demand Resources tem limite de uso de api calls? Não

27. O On-Demand Resources tem limite de uso de networking? Não.

28. O On-Demand Resources é de graça? Sim.

29. Existem outros frameworks de On-Demand Resources? Sim, em várias linguagens e para diversos usos. Exemplos:

  • Frameworks em JavaScript para carregar resources de páginas: mediaqueryload, DemandJS, Ember.js
  • Frameworks para Android: Pomu (descontinuada)
  • Framework para iOS: RxOnDemandResources

30. O que é um benchmark? Algo que serve como base ao qual outros podem ser medidos ou julgados. Um ponto de referência do qual medidas podem ser feitas. Um problema ou teste padronizado que serve de base para avaliação ou comparação (como a perfomance de um sistema de computador).

31. Existem frameworks montados em cima do On-Demand Resources? Existem alguns frameworks feitos principalmente em Ruby on Rails e JS ou até mesmo em PHP como exemplo Laravel.

32. On-Demand Resources é exclusivo da Apple? Nem o nome, nem o conceito são exclusivos da Apple.

33. On-Demand Resources é a melhor solução para a tarefa em que ele propõe resolver? Em determinados contextos (maioria), sim, em outros, não. Por exemplo: Se sua aplicação precisa de recursos que são alterados dinamicamente, principalmente durante o período de distribuição, seria melhor obtê-los de um servidor externo, visto que não é possível a atualização dos On-Demand Resources sem uma atualização do bundle.

34. Sua utilização diminui a perfomance do device ou do sistema em que ele está inserido?
Depende, por meio da prioridade de download urgente (NSBundleResourceRequestLoadingPriorityUrgent) isso pode acontecer.

35. É recomendado para um tipo específico de aplicação? Pode ser utilizado em qualquer tipo de aplicação, desde que haja necessidade.

36. Pode ser utilizado em aplicações focadas em acessibilidade? Pode ser utilizado em qualquer tipo de aplicação, desde que haja necessidade.

37. Quais são as melhores práticas para utilização de ODR? Há várias formas de melhorar a experiência de usuário, algumas delas incluem melhorar o tratamento de erros, estabelecer prioridades de download e excluir resources que não estão sendo mais utilizados. https://www.raywenderlich.com/160049/demand-resources-ios-tutorial

38. É possível que o download dos recursos sejam diferenciados para devices específicos? iPad, iPhone, iPod.

Pode sim, o App Slicing prevê isso.

39. Qual o limite de espaço em disco sendo usado por uma requisição sem que resulte em erro?
O desenvolvedor deve se guiar pela notificação de falta de espaço, já que é o sistema quem deve administrar os limites de uso de espaço.

40. Qual o tratamento a ser feito quando não há espaço suficiente para a requisição de download? O método endAcessingResources deve ser chamado para liberar os recursos. Se o app estiver no background e não liberar espaço o suficiente, ele pode ser terminado.

41. Quais exemplos de apps que utilizam o On-Demand Resources? Swift Playgrounds, Breakneck.

42. Onde os resources são armazenados? Eles são armazenados nos servidores da Apple via App Store ou iCloud. Durante o desenvolvimento podem ser usados servidores à escolha do desenvolvedor, mas depois de publicado apenas Apple Servers são permitidos, exceto para aplicações corporativas, que tem uma maior liberdade em relação a isso.

43. Que tipo de ferramentas podem substituir o On-Demand Resources? Servidores comuns hospedando assets.

44. Quais são os primeiros passos para se usar essa ferramenta/recurso? Os primeiros passos para utilizar On-Demand Resources seriam habilitar esse recurso no projeto (Vide questão 61) e após isso identificar os arquivos e assets aos quais se aplicarão esse recurso e atribuir tags a eles (Vide questão 53).

45. On-Demand Resources não é compatível/utilizável em alguma plataforma da Apple? Se sim, qual(is)? O ODR não contempla o watchOS até o momento.

46. O tempo de download dos resources pode comprometer a experiência do usuário no app? Fatalmente sim, por isso recomenda-se que o desenvolvedor possua um controle sobre sua aplicação que permita conhecer a necessidade dos recursos e fazer a sua requisição antes mesmo de precisar utilizá-los. Por exemplo, baixar os recursos do nível 5 de um jogo enquanto o usuário está jogando o nível 4. Alguns recursos realmente levam pouquíssimo tempo para serem baixados, enquanto outros podem exigir muito tempo. Portanto, cabe ao desenvolvedor otimizar o app ao máximo possível, considerando que o ODR funciona basicamente como qualquer serviço com request/response.

47. Como funciona a requisição de On-Demand Resources? É preciso instanciar um objeto do tipo NSBundleResourceRequest com um Set de tags às quais os recursos buscados estão associados. Depois disso faz-se a requisição utilizando o método assíncrono beginAcessingResources, que possui um objeto Error no seu completion. Caso o erro contenha o valor null (nil), então os recursos já foram baixados e estão localizados no bundle disponíveis para uso. https://www.raywenderlich.com/160049/demand-resources-ios-tutorial

48. O que é uma tag? As tags são a maneira que a Apple utilizou para referenciar os recursos hospedados na nuvem. Todo On-Demand Resource deve possuir uma ou mais tags a ele associadas. Dessa forma, o desenvolvedor pode requisitar os recursos tendo como base as tags por ele mesmo criadas. Vale destacar que as tags devem ter nomes significativos e intuitivos, assim como variáveis ou métodos.

49. O que é o On-Demand Resources Tags Pane? On-Demand Resources Tags Pane é uma aba dentro do Xcode usada para criar, editar, adicionar e deletar recursos relacionados a uma tag, além de especificar quando os recursos associados a determinada tag deverão ser baixados. Para aprender mais sobre os campos disponíveis na Resource Tags Pane, visitar: https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/Tagging.html#//apple_ref/doc/uid/TP40015083-CH3-SW1, na sessão The Resource Tags Pane.

50. Como criar uma tag? Para criar uma nova tag:

51. Como remover um resource de uma tag? É possível remover uma tag de um resource removendo a tag do On-Demand Resources Tag Field, e também é possível remover um recurso da tag através do On-Demand Resources Tag Pane, para ver o passo-a-passo de como remover um resource, visite: https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/Tagging.html#//apple_ref/doc/uid/TP40015083-CH3-SW1, na sessão Removing a Resource from a Tag.

52. Existem boas práticas de atribuição de tags para os assets? Partindo do princípio que tags são requisitadas a medida que são necessárias pela aplicação, e que estas devem ser otimizadas para baixar somente o conteúdo necessário, com limite de 512 MB e tamanho recomendado de 64 MB, deve-se buscar o ponto ótimo onde uma tag compreende todos os recursos necessários, e ainda assim são otimizados. Caso exista uma tag que compreenda um número muito grande de recursos, pode-se realizar especificações dentro desta, como por exemplo: O level 1 de um jogo compreende muitos resources, e é composto por 2 cenários (Montanha e Floresta), então além da tag "Level1”, deve-se designar as tags de "Montanha” e "Floresta" aos seus respectivos resources. Permitindo assim, quando necessário, o download de um número menor de resources.

53. Existe limite de tamanho de um pacote de assets a ser transferido pelo On-Demand Resources? Existe um limite de 1000 assets por pacote a ser transferido.

54. Tags podem ser atribuídas somente a resources (assets, sons, …) ? Não, tags podem ser atribuídas a Files e Folders também.

55. Há outras formas de gerenciar tags no Xcode além do On-Demand Resources Pane? Sim, além do On-Demand Resources Pane existe também o On-Demand Resource Tags Field, que é um jeito rápido para ver, adicionar e deletar tags para um arquivo, pasta ou resource. Para arquivos e pastas disponíveis no Project navigator, o campo estará disponível no File Inspector.

56. Quais categorias de tags podem ser usadas para marcar um resource, qual a diferença entre elas e o tamanho máximo de cada uma? Existem 3 categorias de tags disponíveis, e estas são:

  • Initial Install Tags: recursos serão baixados junto com o app, e o tamanho dos recursos será incluído ao tamanho total do app na AppStore.
  • Prefetched Tag Order: recursos serão baixados depois do app ser instalado, de acordo com a ordem que estão listadas na lista do grupo de Prefetched Tag Order.
  • Download Only On Demand: categoria default das tags, serão baixadas quando requisitadas pelo app.

57. Onde posso alterar as tags relacionadas a determinada categoria? Na aba de Prefetched Tags. Clique no / Resource Tags / Prefetched.

58. Como habilitar o On-Demand Resources em uma aplicação? Por padrão em aplicativos com iOS 9.0 ou superior On-Demand Resources já vem habilitado. Mas para alterar isso ou habilitar versões anteriores basta realizar os seguintes passos:

59. Como o Xcode lida com assets que tem mais de uma tag? Tags servem para identificar e administrar conjuntos de On-Demand Resources. Recursos com mais de uma tag serão identificados, e poderão ser baixados, a partir de cada uma de suas respectivas tags. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/Tagging.html#//apple_ref/doc/uid/TP40015083-CH3-SW1

60. Se já há alguns recursos associados com uma tag, o download deles é feito novamente? Não, serão baixadas apenas os recursos que não estiverem disponível localmente no dispositivo. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/Managing.html#//apple_ref/doc/uid/TP40015083-CH4-SW1 https://developer.apple.com/documentation/foundation/nsbundleresourcerequest/1614840-beginaccessingresourceswithcompl

61. Existem boas práticas para o uso de On-Demand Resources? Se sim, quais são?

  • Tratamento de erros: Tratar e mostrar uma mensagem coerente para o usuário, de acordo com o erro gerado (ex: Tag inválida, espaço insuficiente, …);
  • Prioridades de carregamento: Definir prioridades de carregamento para recursos, por exemplo, definir um recurso que o usuário irá utilizar em breve como urgente;
  • Remover recursos: Remover recursos que não são mais necessários para o usuário;

62. O On-Demand Resources possui algum requisito? Para a utilização do ODR o desenvolvedor necessita de um servidor que esteja em conformidade com os requisitos de segurança exigidos pela Apple. Podem ser utilizados os servidores da Apple, mas caso escolha usar um servidor próprio - permitido apenas durante o período de desenvolvimento, a menos que seja corporativo - então deverá garantir que este esteja de acordo com os requisitos. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/IntrotoHostingODR.html#//apple_ref/doc/uid/TP40015083-CH17-SW1

63. O que acontece com a aplicação caso o usuário não esteja conectado à internet? Caso isto aconteça não será possível fazer o download dos resources quando solicitado e o desenvolvedor receberá esse erro no método beginAccessingResources(completionHandler.

64. Existem outras abordagens semelhantes ao On-Demand Resources? Se sim, quais? Para as plataformas Apple, o ODR é o único com visibilidade até o momento, até mesmo por ser uma API nativa e muito simples de se utilizar. Para outras plataformas existem algumas outras poucas frameworks que realizam esse tipo de tarefa, como o Pomu para Android. https://github.com/saantiaguilera/android-api-resources-on-demand

65. Como implementar os recursos de On-Demand Resources? O código disponível para exemplificação do uso da API será disponibilizado no Github, com tutoriais relacionados a cerca das operações possíveis de serem realizadas e como realizá-las.

66. Quais são os princípios gerais de design para On-Demand Resources?

67. Qual é a hora certa de fazer requisições de tags? As solicitações devem ser feitas antes do usuário precisar delas, pois demora um certo tempo para fazer o download dos recursos associados na App Store. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/Managing.html#//apple_ref/doc/uid/TP40015083-CH4-SW1

68. O que significa .ipa? .ipa significa iOS App Store Package, que é um arquivo que armazena um app de iPhone, iPod Touch ou iPad.

69. Por que o tamanho .ipa é importante? Porque desenvolvedores têm o foco em oferecer a melhor experiência possível para o usuário, e um download lento pode afetar diretamente a experiência do usuário com o aplicativo. Além disso, um arquivo muito grande pode sobrecarregar rede móvel de um usuário.

70. Como testar funcionalidades que usam On-Demand Resources? Antes de fazer o upload do app, o Disk Gauge é uma boa ferramenta de simulação. Pode ser usado também o TestFlight para testes de performance no mundo real. https://developer.apple.com/videos/play/techtalks-apple-tv/5/

71. Normalmente, quando assets provenientes de ODR são descartados da memória da Apple TV? Conteúdos ODR que não estão sendo mais utilizados são excluídos automaticamente apenas como ultimo recurso, ou seja, quando não há mais espaço em memória e dados como temporários e cache já foram removidos, além de que existe uma ordem de prioridade baseada em quando foi o último uso, prioridade de preservação e estado de aplicação rodando.

72. Existe diferença entre subir um aplicativo que utiliza ODR e um que não utiliza ODR para a AppStore/TestFlight? Se sim, quais? Não existem diferenças, o comportamento dos dois é o mesmo. https://developer.apple.com/videos/play/techtalks-apple-tv/5/

73. O limite de espaço disponível para um app de Apple TV aumentou por conta do ODR? Não, muito pelo contrário. O tamanho máximo que a base de um app podia ter na AppStore da Apple TV era menor que 500 MB, isso fazia com que os desenvolvedores abusassem da feature de On-Demand Resources.

74. É possível priorizar o download de determinados recursos associados a uma mesma tag? Sim, através da propriedade loadingPriority de um objeto NSBundleResourceRequest.

75. Que tipo de problemas podem ocorrer ao requisitar ODRs? Problemas ao baixar resources, que envolvem: problemas de rede, tamanho do pacote de assets e resource inexistente; Problemas com espaço de armazenamento, que incluem: ultrapassar o máximo de memória em uso e ultrapassar o máximo de memória disponível no sistema; E problemas com estado inesperado. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/DebugTips.html#//apple_ref/doc/uid/TP40015083-CH6-SW2

76. É possível enviar resources para o host novamente para baixá-los em um segundo momento? Como os resources estão disponíveis no servidor, o app pode requisitar o seu download quando precisar, mesmo que já tenham sido baixados uma vez.

77. O On-Demand Resources diminui o armazenamento necessário para o aplicativo? Sim, visto que esta API fornece os recursos na medida em que estes se tornam necessários e os remove quando se tornam obsoletos para a aplicação, fazendo que esta tenha, no dispositivo, sempre o menor número de recursos possíveis, reduzindo assim o espaço do app no device, aumentando a velocidade dos downloads otimizados e do lançamento do app, que estará mais leve.

78. Existe alguma forma de acompanhar o progresso do download enquanto ele ocorre? Se sim, como? Sim, ao usar um observer para a variável fractionCompleted da propriedade progress é possível saber qual a situação do progresso do download.

79. Existe alguma forma de definir a prioridade dos recursos a serem mantidos no device? Se sim, como? Sim, a prioridade é definida por tags para um determinado bundle, tendo 0.0 como padrão e mínimo, e 1.0 como máximo.

80. Por quê o On-Demand Resources armazena tags inteiras ao invés de arquivos individuais? O uso de tags é um facilitador que permite ao app baixar um conjunto de assets interdependente, além de que requisições de On-Demand em runtime são feitas apenas através de tags. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/Managing.html#//apple_ref/doc/uid/TP40015083-CH4-SW1

81. É possível parar, pausar ou resumir um download de On-Demand Resources? Sim, através da propriedade progress do objeto NSBundleResourceRequest é possível realizar todas essas ações sobre o download dos recursos.

82. Como se livrar de um resource que não há mais utilidade? Há formas de priorizar quais resources podem ser eliminados? Quando não há nenhum NSBundleResourceRequest com a dada tag, ela é automaticamente eliminada ou através do método endAcessingResources. A prioridade de eliminação deve ser tratada pelo desenvolvedor.

83. Existe alguma forma de saber se há espaço suficiente para os resources que serão baixados? Quando o espaço do disco está acabando, a notificação NSBundleResourceRequestLowDiskSpace é disparada pelo NotificationCenter e, quando é recebida, o app deve liberar quaisquer On-Demand Resources que não são necessários. O método endAcessingResources() deve ser chamado para liberar os recursos. Se o app estiver no background e não liberar espaço o suficiente, ele pode ser terminado. https://developer.apple.com/documentation/foundation/nsnotification.name/1614835-nsbundleresourcerequestlowdisksp

84. O que é um bundle? Bundle é um diretório estruturado com uma hierarquia padrão e que guarda código executável e recursos por eles utilizados. https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html

85. O que é um package? Um package é um diretório que o finder apresenta para o usuário como se fosse um arquivo. https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html

86. O que é App Slicing? É o processo de criar e distribuir variantes do App Bundle para diferentes devices alvo. https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f

87. O que é uma variante do App Bundle? É um App Bundle que contém apenas a arquitetura executável e os recursos necessários apenas para o device alvo. https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f

88. Qual o host padrão para acessar On-Demand Resources? Quando nenhuma URL é especificada: a AppStore é o host padrão para aplicativos já distribuídos; Xcode ou Xcode Server para aplicativos em desenvolvimento ou TestFlight para aplicativos distribuídos para teste. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/EnablingHosting.html#//apple_ref/doc/uid/TP40015083-CH18-SW1

89. O que é Apple app transport security requirements? App Transport Security é uma feature de rede (disponível para apps e suas extensões) que requer que um app/extensão ou suporte as melhores práticas de segurança HTTPS ou declare estaticamente suas limitações de segurança através de seu Info.plist. https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33 https://forums.developer.apple.com/thread/6767

90. Como deixar um servidor em conformidade com o Apple app transport security requirements? É preciso ter uma conexão SSL/TTS >=1.2 com um certificado válido assinado por uma autoridade certificada/confiada. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/IntrotoHostingODR.html

91. Como simular problemas de conexão no iPhone? Com o modo desenvolvedor ativo, utilizar Network Link Conditioners.

92. O que é Network Link Conditioner? É uma forma de configuração no modo desenvolvedor que pode simular uma rede ruim, instável, com delay, etc. É utilizado para testes.

93. Por que usar o On-Demand Resources e não download de um servidor comum? Não há forma de responder isso, depende da necessidade de cada projeto.

94. É possível alterar os On-Demand Resources dinamicamente? Não.