Criação de um Android App Bundle
Android Emulator Snapshots
Energy Profiler Confira a descrição completa dos principais recursos organizados por fluxo de desenvolvimento na lista abaixo e no blog da versão canário:
Esquerda: Design da sandbox de AR/RV da I/O 2018. Direita: Arte principal das plataformas do Light Board A arte foi criada em Maya e Cinema 4D. Criamos materiais baseados em física para os modelos usando o Substance Painter. Assim como a iteração contínua é fundamental para a engenharia, ela também é importante para criar ativos de arte. Sabendo disso, controlamos com muita atenção nosso pipeline de conteúdo, mesmo em um projeto relativamente simples como esse. Isso nos permitiu experimentar diversos visuais e estilos de plataforma com muita rapidez antes de chegarmos ao design final. Na área de engenharia, selecionamos o Unity como ambiente de desenvolvimento. O Unity nos deu algumas vantagens importantes. Primeiro, é fácil criar gráficos 3D muito bacanas e colocá-los para funcionar na hora. Segundo, o componente do mecanismo já está completo, então pudemos começar a iterar imediatamente no código de jogabilidade. Quanto à arte, ele nos permitiu testar opções de jogabilidade antes de tomarmos uma decisão final. Além disso, o Unity nos deu suporte a Android e iOS sem quase termos tido trabalho. Para tratar do aspecto multijogador, usamos o Firebase Realtime Database. Estávamos preocupados com o desempenho da rede no evento e, por isso, sentimos que a natureza permanente de um banco de dados seria mais tolerante a redes ruins. E, no fim das contas, deu tudo certo e conseguimos dar ao pessoal a chance de sair e voltar a jogos de graça! Desenvolver o Light Board foi muito divertido para nós. Esperamos que as pessoas possam usá-lo como exemplo da facilidade que se tem não só para criar aplicativos de realidade aumentada, mas de se usar recursos impressionantes, como os Cloud Anchors. Não deixe de dar uma olhada no nosso repositório de código aberto para testar o Light Board!
kind: Service apiVersion: v1 metadata: name: mongo Spec: type: ClusterIP ports: - port: 27017 targetPort: 27017
kind: Endpoints apiVersion: v1 metadata: name: mongo subsets: - addresses: - ip: 10.240.0.4 ports: - port: 27017
mongodb://mongo
mongodb://<dbuser>:<dbpassword>@ds149763.mlab.com:49763/dev
mongodb://<dbuser>:<dbpassword>@ds145868.mlab.com:45868/prod
kind: Service apiVersion: v1 metadata: name: mongo spec: type: ExternalName externalName: ds149763.mlab.com
mongodb://<dbuser>:<dbpassword>@mongo:<port>/dev
kind: Service apiVersion: v1 metadata: name: mongo spec: ports: - port: 27017 targetPort: 49763 --- kind: Endpoints apiVersion: v1 metadata: name: mongo subsets: - addresses: - ip: 35.188.8.12 ports: - port: 49763
mongodb://<dbuser>:<dbpassword>@mongo/dev
Os apps com conteúdo imersivo podem exibir esse conteúdo em tela cheia nos dispositivos com recorte de tela. Se o seu aplicativo usa notificações de mensagem, aproveite as mudanças de MessagingStyle para deixar as notificações ainda mais úteis e práticas. Agora você pode exibir conversas, anexar fotos e adesivos e até sugerir respostas inteligentes. Num futuro próximo, você vai poder usar o ML Kit para gerar sugestões de resposta inteligente para o seu aplicativo.
Notificações MessagingStyle com conversas e respostas inteligentes (à esquerda), imagens e adesivos (à direita).
apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: transcoding-worker namespace: video spec: minReplicas: 1 maxReplicas: 20 metrics: - external: metricName: pubsub.googleapis.com|subscription|num_undelivered_messages metricSelector: matchLabels: resource.labels.subscription_id: transcoder_subscription targetAverageValue: "10" type: External scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: transcoding-worker
apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: frontend namespace: video spec: minReplicas: 4 maxReplicas: 40 metrics: - type: Pods pods: metricName: open_connections targetAverageValue: 100 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: frontend
containers: ... - name: prometheus-to-sd image: gcr.io/google-containers/prometheus-to-sd:v0.2.6 command: - /monitor - --source=:http://localhost:8080 - --stackdriver-prefix=custom.googleapis.com - --pod-id=$(POD_ID) - --namespace-id=$(POD_NAMESPACE) env: - name: POD_ID valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.uid - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: frontend namespace: video spec: minReplicas: 4 maxReplicas: 40 metrics: - type: Pods pods: metricName: open_connections targetAverageValue: 100 - type: Resource resource: name: cpu targetAverageUtilization: 60 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: frontend
{ "message": { "webpush": { "notification": { "title": "Fish Photos 🐟", "body": "Thanks for signing up for Fish Photos! You now will receive fun daily photos of fish!", "icon": "firebase-logo.png", "image": "guppies.jpg", "data": { "notificationType": "fishPhoto", "photoId": "123456" }, "click_action": "https://example.com/fish_photos", "actions": [ { "title": "Like", "action": "like", "icon": "icons/heart.png" }, { "title": "Unsubscribe", "action": "unsubscribe", "icon": "icons/cross.png" } ] } }, "token": "<APP_INSTANCE_REGISTRATION_TOKEN>" } }
like
unsubscribe
// Retrieve an instance of Firebase Messaging so that it can handle background messages. const messaging = firebase.messaging(); // Add an event listener to handle notification clicks self.addEventListener('notificationclick', function(event) { if (event.action === 'like') { // Like button was clicked const photoId = event.notification.data.photoId; like(photoId); } else if (event.action === 'unsubscribe') { // Unsubscribe button was clicked const notificationType = event.notification.data.notificationType; unsubscribe(notificationType); } event.notification.close(); });