;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Apple altera teste de software depois de falhas em iPhone 11

Reprodução
Imagem: Reprodução

Mark Gurman

Da Bloomberg

21/11/2019 14h07

A Apple decidiu reformular seus testes de software depois que várias falhas afetaram as novas versões dos sistemas operacionais do iPhone e iPad, segundo pessoas com conhecimento do assunto. O diretor de software Craig Federighi e sua equipe, que inclui Stacey Lysik, anunciaram as mudanças em uma recente reunião interna com desenvolvedores de software da empresa.

A nova abordagem exige que as equipes de desenvolvimento da Apple garantam que versões de teste, conhecidas como "compilações diárias", de futuras atualizações de software desabilitem automaticamente recursos inacabados ou com falhas. Quem realizar os testes terá a opção de ativar seletivamente esses recursos, por meio de um novo processo interno e menu de configurações denominado Flags, permitindo isolar o impacto de cada adição individual no sistema.

Quando o iOS 13 da empresa foi lançado juntamente com o iPhone 11 em setembro, usuários e desenvolvedores de aplicativos foram confrontados com uma série de falhas de software. Os aplicativos falharam ou iniciavam lentamente. O sinal celular era inconsistente. Ocorreram erros na interface de usuário em aplicativos como "Mensagens", problemas de busca em todo o sistema e ao abrir e-mails.

Alguns novos recursos, como o compartilhamento de pastas de arquivos no iCloud e a transmissão de músicas para vários AirPods, estavam atrasados ou ainda indisponíveis. Isso resultou em uma das atualizações de sistema operacional mais problemáticas e inacabadas da história da Apple.

"O iOS 13 continua a destruir meu moral", escreveu o desenvolvedor Marco Arment no Twitter. "O mesmo", respondeu Jason Marr, cocriador do aplicativo de lista de compras AnyList. "A Apple realmente mostrou falta de respeito por seus desenvolvedores e seus clientes com o iOS 13."

Os problemas mostram como os iPhones se tornaram complexos e com que facilidade os usuários podem se decepcionar com uma empresa conhecida pela fácil integração de hardware e software. As atualizações anuais de software, programadas para serem lançadas juntamente com os novos iPhones, são essenciais para que a Apple ofereça novos recursos e impeça que os usuários migrem para o Android. Os sistemas operacionais atualizados também oferecem aos desenvolvedores mais ferramentas para a criação de aplicativos, catalisando mais receita para a Apple na App Store.

A porta-voz da Apple, Trudy Muller, não quis comentar.

O novo processo de desenvolvimento deve ajudar as primeiras versões internas do iOS a serem mais utilizáveis. Antes do desenvolvimento do iOS 14, algumas equipes acrescentavam recursos todos os dias que não eram totalmente testados, enquanto outras equipes contribuíam com alterações semanalmente. "Era como uma receita, com muitos cozinheiros adicionando ingredientes", disse uma pessoa com conhecimento do processo.

O software de teste normalmente sofre tantas mudanças em diferentes estágios de desenvolvimento que acaba dificultando o uso dos aparelhos. Com isso, os responsáveis pelos testes perdem controle "sobre o que está funcionando e o que não está funcionando", disse a pessoa. Isso minou o objetivo principal do processo de teste, enquanto engenheiros da Apple tentavam verificar como o sistema operacional estava reagindo a muitos dos novos recursos, levando a alguns dos problemas do iOS 13.

iPhone 11 Pro e iPhone 11 Pro Max: conheça todos os detalhes dos aparelhos

UOL Tilt