Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
December 28, 2021 09:47 pm GMT

Como emular um iOS no Linux utilizando Docker

Depois de vrias tentativas sem sucesso, enfim consegui virtualizar um macOS para fazer testes em um aplicativo iOS no qual eu estava trabalhando.

Mas antes de continuar, necessrio saber que essa no uma soluo estvel e possue diversos problemas de desempenho, porm, para meu propsito consegui fazer o que queria.

Ns utilizaremos o QEMU para emular um macOS e dentro dele, utilizaremos o xCode para emular um iOS, s nisso voc j consegue perceber que no vai ser uma coisa leve.

O repositrio no github do Docker OSX tem uma explicao de como usar um iPhone via usb ao invs de emular, mas eu no tenho iPhone :p

Sumrio

O que o Docker OSX

O Docker OSX uma docker image que utiliza por debaixo dos panos o QEMU para que possamos emular um sistema operacional.

Leia mais: O que docker?

Minhas especificaes de hardware

As especificaes do meu computador so consideradas OK pra fazer isso, porm, ainda consegui perceber algumas engasgadas enquanto utilizava o Docker OSX + xCode + Visual Studio Code + Dev Server. (Consegui at aquecer meu quarto com esse tanto de coisa.)

  • OS: Manjaro Linux x86_64
  • Kernel: 4.19.220-1-MANJARO
  • Shell: zsh 5.8
  • Resolution: 1440x900
  • DE: GNOME 41.2
  • WM: Mutter
  • WM Theme: Orchis-orange-compact
  • Icons: Win11-purple-dark [GTK2/3]
  • Terminal: gnome-terminal
  • CPU: Intel i7-3770 (8) @ 3.900GHz
  • GPU: NVIDIA GeForce GTX 1050 Ti
  • Memory: 4105MiB / 15985MiB
  • SSD: Crucial BX500 240gb (Altamente recomendado um SSD)

Instalao

Primeiramente, necessrio ter o docker instalado no seu computador. No meu caso eu utilizo Manjaro, ento basta abrir o terminal e digitar:

Instalao docker
pacman -S docker

Ativando os servios do docker
systemctl start docker.service

Ativando os servios do docker para iniciar junto com o sistema
systemctl enable docker.service

Testando o docker:
docker run hello-world

Docker run hello-world

Certo, agora iremos baixar a imagem e executa-la utilizando o comando abaixo:
docker run -it --device /dev/kvm -p 50922:10022 -e DEVICE_MODEL="iMacPro1,1" -e WIDTH=1440 -e HEIGHT=900 -e RAM=8 -e INTERNAL_SSH_PORT=23 -e AUDIO_DRIVER=alsa -e CORES=2 -v /tmp/.X11-unix:/tmp/.X11-unix -e "DISPLAY=${DISPLAY:-:0.0}" -e GENERATE_UNIQUE=true -e MASTER_PLIST_URL=https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist sickcodes/docker-osx:big-sur

Voc pode conferir o que cada flag significa olhando o repositrio no github do docker osx, mas resumidamente, especifiquei a resoluo, memria ram, cores do processador, verso big-sur do macOS e etc.

Em seguida, ele ir baixar a imagem e executar.

Quando abrir o emulador, de enter na opo macOS Base System

Emulador Docker OSX

Quando carregar o sistema, clicaremos em Disk Utility
Emulador Docker OSX

Agora, procuraremos a partio que est com mais espao de armazenamento e clicaremos na opo Erase
Docker OSX apagando sistema

Para formatar preciso que as opes estejam estritamentes iguais a esta:
Formatao opes

Clique em Erase, aguarde e pode fechar a janela do Disk Utility.

Em seguida, iremos em Reinstall macOS Big Sur aceitamos os termos, selecionamos a partio que acabamos de criar macOS e nisso, ele comear a instao do sistema. (Esse processo geralmente leva 30min ~ 1h).
Docker OSX Instalao

Aguardado esse tempo, o sistema deve reiniciar (ou no), no meu caso, eu tive que fazer isso de forma manual pois ele no reiniciou. Nesse caso, feche a janela do QEMU.

Qemu error

Novamente no terminal, digitaremos:

docker ps -a

Para saber qual o ID do nosso container, e em seguida iremos inicia-lo com:

docker start ID

Docker IDS

Selecione o macOS Installer e deixe que a instalao continue.
Docker OSX Instalao

Aps o processo, ele ir reiniciar automaticamente (ou no), sendo assim, feche novamente o emulador e d start no container mais uma vez.

Docker OSX Instalao

Ao iniciar, novamente selecione a opo macOS Installer e aguarde o processo terminar, feito isso ele ir reiniciar. (Agora verdade).

Nosso macOS foi instalado, com isso, vamos selecionar a opo macOS.
Docker OSX Inicializao

Feito isso, ir reiniciar novamente e voc selecione a mesma opo macOS.

Show, nossa tela de bem vindo apareceu. Essa parte bastante lenta, mas aps isso ir ficar normal.

Tela de bem vindo macOS

Configure a sua maneira, mas no faa login no AppleID agora.

Aps esse processo, nossa rea de trabalho aparecer e ento iremos aguardar at a dock aparecer, pois aps isso o sistema fica mais fludo.

Tela de instalao mac OS Sem dock

Tela de instalao mac OS Com dock

Agora iremos utilizar o gerenciador brew para instalar as coisas mais rapidamente.

Abra o terminal no macOS e instale o brew com o comando:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Ir pedir sua senha definida anteriormente para instalar.

Agora iremos instalar o xcode na apple store.

Apple store xcode

Agora sim, podemos fazer o login da nossa conta AppleID.

Login apple store

Feito isso, aguarde a instalao.
Em seguida, abra o xcode e aceite os termos e aguarde instalar as dependncias.

Em seguida, v em Preferences -> Locations -> Command-Line Tools vai estar vazio, selecione a opo com a verso do xcode.

Quando a instalao terminar, abriremos o terminal novamente e instalaremos o cocoapods. Ele serve como um gerenciador de dependncias do xCode.

brew install cocoapods

Feito isso, nosso macOS est instalado e configurado para rodar os projetos.

Rodando um app com React Native

Vamos rodar um hello world do React Native para ver se est tudo certo, lembrando que no irei testar o android somente o iOS.

Abra o terminal

Instalao no node:
brew install node

Instalao do yarn (opcional):
npm install -g yarn

Criando um projeto react native:
npx react-native init teste

Se pedir pra instalar o cocoapods novamente, selecione a opo com brew.

Entrando no diretrio do react native:
cd teste

Entrando no diretrio do ios:
cd ios

Instalando as dependncias:
pod install

Voltando para o diretrio raiz:
cd ..

Listando os simuladores disponveis: (Opcional)
xcrun simctl list devices

Rodando o projeto utilizando xcode:
npx react-native run-ios --simulator="iPhone 13"
App rodando react native

Para uma experincia melhor, veja a seo: Criando uma conexo de pastas utilizando o sshfs

Rodando um app com Cordova

Vamos rodar um hello world do Quasar para ver se est tudo certo, lembrando que no irei testar o android somente o iOS.

Lembrando que o Quasar usa o Cordova/Capacitor pro iOS e Android.

Instalao no node:
brew install node

Instalao do yarn (opcional):
npm install -g yarn

Instalao do quasar:
yarn global add @quasar/cli

Instalao do cordova:
yarn global add cordova

Criando um projeto com Quasar-CLI:
quasar create teste

Entrando no diretrio do projeto:
cd teste

Adicionando cordova ao projeto:
quasar mode add cordova

Entrar no diretrio do cordova:
cd src-cordova

Adicionar o iOS ao projeto:
cordova platform add ios

Verificar se est tudo certo:
cordova requirements

Listar emuladores disponveis: (Opcional)
cordova emulate iOS --list

Instalar as dependncias do projeto:
yarn

Voltar ao diretrio raiz:
cd ..

Instalar as dependncias do projeto:
yarn

Rodar o quasar no modo desenvolvimento ioS:
quasar dev -m iOS -e "iPhone 8, 15.2"
macOS quasar

Para uma experincia melhor, veja a seo: Criando uma conexo de pastas utilizando o sshfs

Criando uma conexo de pastas utilizando o sshfs

Agora que fizemos tudo e nosso app j est rodando no macOS, temos um problema: Abrir nosso editor de cdigo ou IDE dentro do macOS uma experincia muito ruim por causa da lentido, glitches, mapping do teclado e etc. Dessa forma, eu pesquisei uma soluo para criar uma conexo de arquivos utilizando o SSH.

Ou seja, eu posso abrir o servidor de desenvolvimento dentro do macOS e criar uma conexo em que eu possa alterar os arquivos direto do meu linux ou do macOS, de forma que atualize em ambos os lados, como uma via dupla. Isso nos garante tirar o proveito de algumas coisas que existem no modo desenvolvimento, como o fast refresh.

Conexo do Linux para o Mac

Primeiramente, precisamos permitir a conexo via ssh por login no mac. Para isso, abriremos o terminal e digitaremos:

Comando para abrir editar o arquivo de configurao do ssh:
sudo nano /etc/ssh/sshd_config

Busque por PasswordAuthentication e coloque a configurao como yes e remova o # no comeo da linha.

Configurao sshd

Salve o arquivo.
V para em System Preferences -> Sharing -> Remote Login e ative para todos os usurios:

macOS configurao

Comando para reiniciar o ssh:
sudo launchctl stop com.openssh.sshd && sudo launchctl start com.openssh.sshd

Agora, no terminal do nosso Linux:

Instalao do sshfs:
sudo pacman -S sshfs

Pegando o IP do nosso container
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ID_CONTAINER

Criar uma pasta:
mkdir projeto

Comando para abrir a conexo:
sudo sshfs USER_MAC@IP_CONTAINER:/CAMINHO/DO/PROJETO/NO/MAC /CAMINHO/NO/LINUX -p 23

Exemplo:

Exemplo de conexo

Pronto, agora eu posso abrir o visual studio code no meu Linux e atualizar diretamente no Mac.

Se voc tiver um outro computador, pode fazer essa conexo tambm e deixar o seu principal apenas pra emular.

Conexo do Mac para o Linux

Mesmo processo anteriormente, s que o pacote do ssfs no mac pode ser instalado pelo comando abaixo.

Instalao sshfs no mac
brew install --cask macfuse && brew install gromgit/fuse/sshfs-mac

No Linux:

Comando para abrir editar o arquivo de configurao do ssh:
sudo nano /etc/ssh/sshd_config

Busque por PasswordAuthentication e coloque a configurao como yes e remova o # no comeo da linha.

Configurao sshd

Salve o arquivo.

Comando para reiniciar o SSH no Manjaro:
sudo systemctl restart sshd.service

De volta ao mac, criaremos uma pasta e abriremos a conexo.

Criar uma pasta:
mkdir projeto

Comando para abrir a conexo:
sudo sshfs USER_LINUX@IP_HOST:/CAMINHO/LINUX /CAMINHO/MAC -p 23

Aps rodar o comando, ir acontecer um erro:

Erro MAC

Abra as prefrencias e clique em Allow

MacOS Preferencias

Reincie o mac.

Agora podemos abrir nossa conexo: (Meu SSH est com uma porta diferente, mas a padro 22)

Conexo SSH OK

Feito isso, podemos atualizar de qualquer lado que tambm ir atualizar.

Consideraes finais

Muito obrigado por ler este tutorial, que alis, o primeiro que publico depois de anos. Qualquer dvida ou sugesto sempre bem vinda.

Ah, nunca atualize o mac.

:)


Original Link: https://dev.to/ianito/como-emular-um-ios-no-linux-utilizando-docker-3l75

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To