Apple uvolnil iPhone 3.0, Safari 4.0.1 a Bluetooth update

19. 6. 2009

Sdílet

Poslední dny byly ve znamení novinek od společnosti Apple, kdy bylo uvolněno hned několik významných softwarových aktualizací. My se blíže zaměříme na iPhone 3.0, prohlížeč Safari 4.0.1 a krátce pak na Bluetooth Firmware update 2.0.

Jak bylo již dříve zástupci Applu slibováno, nový software pro smartphony iPhone 3.0 obsahuje více než 100 novinek a vylepšení. Mezi ně patří např. možnost kopírování a vkládání údajů přes schránku (v zabudovaných aplikací), která bude dostupná pro  texty, bloky HTML kódu či obrázky. Kopírovat a vkládat také bude nově možné i mezi aplikacemi a tuto funkcionalitu budou moci využít i nezávislí vývojáři pro své vlastní softwarové produkty pro iPhone. Další novinou je rozšířená podpora multimediálních zpráv MMS, která umožní přijímat a odesílat fotografie, kontaktní informace, zvukové soubory a lokaci. Aplikace hlasového záznamníku nově disponuje funkcemi sdílení a editování zvuku, technologie Spotlight rozšířuje možnosti vyhledávání informací uložených v přístroji a vylepšení se dočkal i klient CalDAV pro správu událostí na serveru. Přibyla také možnost synchronizovat poznámky přes iTunes a nebo např. podpora stereo A2DP Bluetooth, automatické vyplňování, anti-phishingová technologie či rozšířené rodičovské nastavení, které umožní přístup jen k vybraným funkcím.

Velikost aktualizačního souboru se pohybuje mezi 230 – 260 MB podle toho, jaký přístroj je jím aktualizován a je potřeba nainstalovat jej přes aplikaci iTunes ve verzi 8.2. Aktualizace je dostupná všem uživatelům iPhonu bezplatně, nicméně majitelé iPodu Touch si za upgrade na verzi 3.0 musí zaplatit 10 dolarů. Apple také začal prosazovat, že všechny aplikace dostupné přes AppStore musí podporovat novou verzi softwaru. Více najdete v článku Apple: iPhone 3.0 se stává novým standardem.

Další novinkou určenoi hlavně pro majitele Maců je webový prohlížeč Safari ve verzi 4.0.1, který přináší několik drobných oprav oproti verzi 4.0. Instalační soubor má délku 43,8 MB a ke stažení je prostřednictvím softwarových aktualizací nebo ze stránek výrobce. Opraveny byly např. problémy při spolupráci s aplikací iPhoto 09 pro Mac OS X při snaze publikovat fotografie na Facebook. Sám Apple pak o novém Safari 4 tvrdí, že se jedná o nejrychlejší prohlížeč pro Windows i Mac OS a kromě nových funkcí jako např. Top Sites pro náhled často zobrazovaných stránek či Cover Flow pro procházení historie záložek prostřednictvím náhledu má být díky novému enginu Nitro až 4,5x rychlejší ve zpracování JavaScriptu než Safari 3 pro Windows a Mac.

Poslední aktualizace se týká opravy problémů všech počítačů Mac, které jsou vybaveny Bluetooth čipsetem Broadcom, neboť jejich uživatelé se často setkávali s hláškou „Connection Lost“ a řešení by měl přinést update firmware 2.0, který má velikost 1,78 MB a vyžaduje Mac OS X 10.5.7. Bluetooth Firmware update 2.0 je k dispozici ke stažené taktéž ze stránek podpory společnosti Apple.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »