;(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

Microsoft e outros aliados se juntam à Epic no processo contra a Apple

Epic Games, dona de Fortnite, acusa Apple de monopólio - Divulgação/HowToGeek
Epic Games, dona de Fortnite, acusa Apple de monopólio Imagem: Divulgação/HowToGeek

De START, em São Paulo

01/02/2022 11h03

A longa batalha judicial entre a Epic Games e a Apple ganhou novos personagens. A Epic, proprietária de Fortnite, voltou à Justiça após uma decisão favorável à rival em setembro. Mas agora, veio com aliados de peso.

A Microsoft, e organização Electronic Frontier Foundation e os procuradores de 35 Estados dos EUA colaboraram com documentos que argumentam que as práticas de pagamento impostas pela Apple a seus parceiros são ilegais.

"A conduta da Apple tem prejudicado e continua prejudicando os criadores de aplicativos móveis e milhões de cidadãos", afirma um dos documentos submetidos pelos procuradores. "A Apple continua monopolizando a distribuição de aplicativos e as soluções de pagamento dentro do app no iPhone, asfixiando a concorrência, enquanto acumula lucros supercompetitivos. A Apple deve prestar contas da sua conduta".

Já os documentos oferecidos pela Microsoft atestam que "uma decisão judicial que favoreça a Apple pode deixar pouco espaço para impedir a empresa de tirar partido do seu controle do iOS e excluir a concorrência em inúmeros mercados adjacentes".

O processo pode ter consequências enormes. Se a acusação de monopólio da Apple for considerada procedente, é possível que se estenda também ao Google, que tem práticas similares nos dispositivos móveis Android. O Google chegou a cogitar comprar a Epic Games.

Relembre o caso até agora

A Apple exige que todos os pagamentos dentro de apps sejam feitos por meio do seu próprio sistema - e, para isso, cobra uma taxa significativa. A Epic recusou o formato e ou a oferecer um sistema próprio para os jogadores de Fortnite que quisessem comprar skins e outros itens no jogo. A Apple então entrou na Justiça, acusando a desenvolvedora de não cumprir regras previstas em contrato.

Em setembro, a Justiça dos EUA deu ganho de causa à empresa do iPhone. A Epic teve de pagar uma indenização de US$ 6 milhões.

Mas a juíza que decidiu o caso também estabeleceu que a Apple precisaria mudar a política da loja, permitindo que apps incluíssem botões ou links com informação sobre meios de pagamento alternativos, de modo que os desenvolvedores tivessem contato direto com esses clientes, por meio dos dados fornecidos no registro no aplicativo.

O prazo para as mudanças deveriam acontecer em dezembro, mas a Apple solicitou mais tempo, citando preocupações com a segurança desses dados.

Em janeiro, a Epic, decidiu recorrer da decisão e retomou o processo na Justiça. Ela alega que, se a sentença não fosse contestada, "iria pôr em causa os princípios estabelecidos da lei antimonopólio e minar uma política antimonopólio sólida". E, pelo visto, a Microsoft e seus aliados concordam.

SIGA O START NAS REDES SOCIAIS

Twitter: https://twitter.com/start_uol
Instagram: https://www.instagram.com/start_uol/
Facebook: https://www.facebook.com/startuol/
TikTok: https://www.tiktok.com/@start_uol?
Twitch: https://www.twitch.tv/startuol