참고: 두 가지 서명 구성표는 모두 Android Gradle 플러그인 2.2에서 기본적으로 사용됩니다.


더 작은 APK를 위한 릴리스 빌드

저희는 이번 기회에 패키지 작성 도구를 다시 작성할 때 릴리스 APK의 크기를 일정 수준 최적화했으며, 이에 따라 Play Store에서 다운로드 속도를 높이고 델타 업데이트 크기를 줄여 기기에서 낭비되는 공간을 줄이는 성과를 얻었습니다. 다음은 저희가 수행한 몇 가지 변경 사항입니다.
  • 애플리케이션 패키지 내 파일들이 정렬되어 APK간의 차이가 최소화됩니다.
  • 모든 파일 타임스탬프와 메타데이터는 0으로 처리됩니다.
  • 레벨 6 및 레벨 9 압축이 모든 파일에 대해 병렬로 검사되어 가장 적합한 압축 레벨이 사용됩니다. 즉, L9이 크기 면에서 거의 이점이 없다면 성능 향상을 위해 L6가 선택될 수 있습니다.
  • 네이티브 라이브러리가 압축되지 않고 페이지가 정렬된 상태로 APK에 저장됩니다. 이에 따라 Android 6.0 Marshmallow의 android:extractNativeLibs="false" 옵션이 지원되며, 이를 통해 애플리케이션은 기기에서 더 적은 공간을 사용할 뿐만 아니라 Play Store에서는 더 작은 업데이트를 생성할 수 있습니다.
  • Play Store 업데이트 알고리즘을 더욱 효과적으로 지원하기 위해 Zopfli 압축은 사용되지 않습니다. Zopfli로 APK를 다시 압축하지 않는 것이 좋습니다. 여전히 프로젝트에서 PNG 파일과 같은 개별 리소스를 사전에 최적화하는 것이 좋습니다.
이렇게 변경함으로써 사용자가 속도가 연결 속도가 느리거나 성능이 떨어지는 기기를 사용하는 상황에서도 정상적으로 앱을 다운로드하고 업데이트할 수 있도록 릴리스를 가능한 한 작게 만드는 데 도움이 됩니다. 하지만 디버그 빌드는 어떨까요?


설치 속도를 높이기 위한 디버그 빌드

앱을 개발할 때는 반복 주기, 즉 코드를 변경하여 빌드하고 연결된 기기나 에뮬레이터에 배포하는 과정을 빠르게 유지하고 싶으실 겁니다. Android Studio 2.0부터는 이 모든 단계를 최대한 빠르게 진행할 수 있도록 노력하고 있습니다. Instant Run을 통해 이제는 런타임 중에 변경된 코드와 리소스만 업데이트할 수 있으며, 그와 동시에 새 에뮬레이터는 멀티프로세서를 지원하고 더욱 빠른 APK 전송과 설치가 가능하도록 ADB 속도를 높여 줍니다. 빌드 기능 개선을 통해 그 시간을 훨씬 더 단축할 수 있으며, Android Studio 2.2에서 디버그 빌드를 위한 증분식 패키징과 병렬 압축 기능을 도입할 예정입니다. 대상 기기 밀도와 ABI를 위한 선택적인 리소스 패키징 등의 다른 기능과 더불어, 이 기능 덕분에 훨씬 더 빠르게 개발 작업을 수행할 수 있을 것입니다.

주의: Instant Run용으로 생성되었거나 디버그 빌드를 호출하여 생성된 APK 파일은 Play Store에 배포할 수 없습니다! 이 파일에는 Instant Run을 위한 추가 기기 코드가 포함되어 있으며 빌드를 시작할 때 연결되어 있던 기기를 제외한 기타 기기 구성의 리소스는 빠져 있습니다. Android Studio의 Generate Signed APK 명령어나 assembleRelease Gradle 작업을 사용하여 생성할 수 있는 APK의 릴리스 버전만 배포해야 합니다.

게시자: Wojtek Kaliciński, Android 디벨로퍼 어드보케


Unity용 Firebase SDK를 직접 시험해 보세요! 바로 여기서 사용할 수 있으며, 개발자가 꽤 멋진 게임을 더 쉽게 빌드할 수 있게 해주는 기능이 전부 포함되어 있습니다.

Todd Kerpelman 디벨로퍼 어드보케

▶ 원문 링크



이런 실험을 통해 머신 러닝이 이미지, 그림, 언어, 소리 등과 같은 모든 종류의 것들을 어떻게 이해하는지 알 수 있습니다. 이런 실험은 웹 개발자, 음악가, 게임 디자이너, 새 소리 연구가, 데이터 시각화 전문가 등 각기 다른 관심 사항을 가진 사람들이 고안한 것으로, 참여한 모든 이가 머신 러닝을 사용하는 방법에 대한 각자의 아이디어를 제공하고 있습니다.

또한, 코드 작성자도 자신만의 실험을 더욱 쉽게 만들어 볼 수 있도록 하고 싶습니다. 저희가 특별히 선보이는 많은 프로젝트는 Cloud Vision API, Tensorflow 및 머신 러닝 커뮤니티에서 얻을 수 있는 기타 라이브러리 등, 누구라도 사용할 수 있는 도구를 사용해 빌드한 것입니다. 이 사이트에는 제작자들이 자신의 작업 방식을 설명하는 동영상과 함께, 시작하는 데 도움이 되는 오픈소스 코드로 연결해 주는 링크가 포함되어 있습니다. A.I. Experiments 웹 사이트에 들러 자신이 직접 만든 결과물을 제출하거나 다른 사람들이 올려둔 것을 살펴시기 바랍니다.

머신 러닝으로 어떤 일을 할 수 있는지 더 심층적으로 알고 싶으면 Google Arts & Culture에서 동료 개발자들의 새로운 실험을 확인해 보세요.

Alexander Chen, Creative Lab

▶ 원문 링크


Google 웹마스터 센터는 귀하에게 도움이 되길 바라며 지난 몇 주간 Accelerated Mobile Pages에 대한 수많은 세부사항을 정리했습니다. 다음의 주제를 다룹니다.

또한 웹마스터 포럼에서 Google 검색에서 AMP 사용을 시작하는 것에 대한 몇 가지 AMP 질문을 확인했습니다. 도움을 드리고자 Google 웹마스터 센터에서 확인한 가장 일반적인 질문 몇 가지를 정리해 보았습니다.


질문: 웹사이트의 AMP 페이지 제작을 고려하고 있습니다. 장점이 무엇인가요? 어떤 사이트와 페이지에 AMP가 적합한가요?

사용자는 빠르고 수월하게 로드되는 콘텐츠를 좋아합니다. AMP 형식을 사용하면 사용자가 모바일 기기에서 콘텐츠를 사용하고 몰입할 의향을 높여줄 수 있습니다. 연구에 따르면 사용자 중 40%가 로드에 3초 이상 걸리는 사이트를 떠납니다. The Washington Post는 AMP를 적용한 결과 기사 로드 시간이 88% 감소하고 모바일 검색결과에서 재방문하는 사용자 수가 23% 증가했습니다.

AMP 형식은 뉴스, 레시피, 영화 목록, 제품 페이지, 리뷰, 동영상, 블로그 등 모든 정적 웹 콘텐츠에 유용합니다.

질문: 이미 문제를 해결했는데도 Search Console에 AMP 페이지 오류가 기록됩니다. 왜 아직도 오류가 표시되나요?

간단히 답변하면 Search Console에 AMP 페이지 변경사항이 업데이트될 때까지 약 1주가 걸립니다. 더 자세한 답변은 Google 웹마스터 트렌드 분석 담당자 John Mueller가 Search Console 지연 문제에 대해 공유한 자세한 게시물을 참조하세요.

질문: AMP 페이지가 Google 검색에 표시되지 않습니다. 어떻게 하나요?

유효한 AMP 페이지만 Google 검색에 표시됩니다. AMP HTML 웹 유효성 검사 도구Chrome 또는 Opera 확장 프로그램을 사용하여 AMP 페이지의 유효성을 검사하거나 크론 작업과 같은 좀 더 자동화된 프로세스를 통해 새 콘텐츠가 모두 유효한지 확인합니다.

AMP 페이지에 schema.org 구조화된 데이터를 포함하는 것을 전반적으로 권장하며(JSON-LD 추천) 이는 특히 뉴스 게시자에게 중요합니다. 유효한 마크업 속성을 포함하는 뉴스 콘텐츠는 Google 검색 결과의 주요 뉴스 섹션에 표시될 수 있습니다. 구조화된 데이터를 테스트하려면 구조화된 데이터 테스트 도구를 사용해 보세요.

여기에서 해결되지 않은 질문이 있으면 아래의 댓글이나 Google 웹마스터 Google+ 페이지에 의견을 공유해 주세요. 자유롭게 웹마스터 도움말 포럼에 글을 게시하셔도 좋습니다.

게시자: Tomo Taylor, AMP 커뮤니티 관리자

▶ 원문 링크



사용자가 앱을 승인한 후에는 인증 코드와 함께 도메인으로 다시 리디렉션됩니다. 서버 쪽에서는 Instagram 앱의 사용자 인증 정보를 사용하여 액세스 토큰을 얻기 위해 인증 코드를 교환할 수 있습니다. 인증 코드를 교환하는 프로세스에서 Instagram은 사용자 ID도 반환합니다. LinkedIn 등의 다른 OAuth 2.0 공급자를 이용하는 경우에는 가끔 추가적인 요청이 필요하기도 합니다.
서버에서 Instagram 사용자 정보를 가져온 후 Firebase 맞춤 인증 토큰을 생성합니다. 사용자는 이 토큰을 통해 signInWithCustomToken 메서드를 사용하여 웹 앱에서 Firebase에 로그인할 수 있습니다.
클라이언트에서 Firebase 프로필을 업데이트할 수 있도록 표시 이름, 사진 URL 등, Instagram에서 가져온 사용자 프로필 정보도 전달해보겠습니다. (참고: Instagram은 사용자의 이메일을 제공하지 않으므로 이메일 정보가 없는 Firebase 계정을 가지게 될 텐데, 그래도 괜찮습니다.) 작업을 마쳤으면 팝업을 닫습니다. 그러면 이제 사용자가 Instagram 계정에서 가져온 프로필 데이터로 Firebase에 로그인됩니다.


실제로 빌드해 봅시다!

이제 좀 더 세부적으로 들어가서, 이 통합의 핵심 요소를 구현하는 방법을 살펴봅시다. Node.js에서 백엔드를 작성해볼게요.


Instagram으로 앱 등록

웹 앱에 Instagram 인증 흐름을 시작하는 버튼을 추가해야 합니다. 이를 수행하려면 먼저 OAuth 2.0에 필요한 앱 사용자 인증 정보를 가져올 수 있도록 애플리케이션을 콘솔에 등록해야 합니다.
Instagram 앱 구성에서 http://localhost:8080/instagram-callback(테스트용) 및 https:///instagram-callback(프로덕션 도메인)을 유효한 리디렉션 URI로 허용 목록에 추가했는지 확인하세요. Instagram 클라이언트 ID클라이언트 비밀번호는 따로 잘 적어두세요. 나중에 필요하니깐요.

클라이언트 ID와 비밀번호를 가져오려면 앱을 등록하고 콜백 URL을 허용 목록에 추가하세요. 이는 모든 OAuth 2.0 공급자 이용 시 진행해야 하는 일반적인 단계입니다.


Instagram의 OAuth 2.0 구성

서버에서 OAuth 2.0 프로토콜의 세부 정보를 숨기는 데 도움이 되는 simple-oauth2 패키지를 사용하겠습니다. 이 패키지를 설정하려면 Instagram 클라이언트 ID와 비밀번호, 그리고 Instagram의 OAuth 2.0 토큰 및 승인 엔드포인트와 같은 몇 가지 값을 제공해야 합니다. 다음은 Instagram에 사용해야 하는 값입니다.
// Instagram OAuth 2 setup
const credentials = {
 client: {
   id: YOUR_INSTAGRAM_CLIENT_ID, // Change this!
   secret: YOUR_INSTAGRAM_CLIENT_SECRET, // Change this!
 },
 auth: {
   tokenHost: 'https://api.instagram.com',
   tokenPath: '/oauth/access_token'
 }
};
const oauth2 = require('simple-oauth2').create(credentials);


Instagram 인증 흐름 시작

서버에서 사용자를 Instagram의 동의 화면으로 리디렉션하는 URL 핸들러를 추가하세요. 이 작업의 일부로, 사용자가 Instagram 인증 흐름을 거친 후 다시 리디렉션되는 경로인 리디렉션 URI를 입력해야 합니다. 이 경우에는 /instagram-callback을 콜백 핸들러 경로로 사용하겠습니다.

app.get('/redirect', (req, res) => {
  // Generate a random state verification cookie.
  const state = req.cookies.state || crypto.randomBytes(20).toString('hex');
  // Allow unsecure cookies on localhost.
  const secureCookie = req.get('host').indexOf('localhost:') !== 0;
  res.cookie('state', state.toString(), {maxAge: 3600000, secure: secureCookie, httpOnly: true});
  const redirectUri = oauth2.authorizationCode.authorizeURL({
    redirect_uri: `${req.protocol}://${req.get('host')}/instagram-callback`,
    scope: 'basic',
    state: state
  });
  res.redirect(redirectUri);
});

또한, 세션 고정 공격을 피하기 위해 OAuth 요청의 상태 매개변수에 임의의 문자열을 전달하고 이를 HTTP 쿠키로도 저장합니다. 이를 통해 반환되는 상태 매개변수를 쿠키에 저장된 매개변수와 비교하고 흐름이 앱에서 발생했는지 확인할 수 있습니다.

클라이언트에서 다음과 같이 팝업을 트리거하는 버튼을 추가하세요.

function onSignInButtonClick() {
  // Open the Auth flow in a popup.
  window.open('/redirect', 'firebaseAuth', 'height=315,width=400');
};

사용자가 로그인 버튼을 클릭하면 팝업이 열리면서 Instagram 동의 화면으로 리디렉션됩니다.

사용자가 승인하면 code URL 쿼리 매개변수에 전달된 승인 코드와 앞서 전달한 state 값과 함께 /instagram-callback URL 핸들러로 다시 리디렉션됩니다.


액세스 토큰을 얻기 위한 승인 코드 교환

사용자가 콜백 URL로 다시 리디렉션되면 다음을 수행하세요.
  • 상태 쿠키가 상태 URL 쿼리 매개변수와 동일한지 확인하세요.
  • 인증 코드를 교환하여 액세스 토큰을 얻고 Instagram에서 사용자 ID를 검색하세요.
app.get('/instagram-callback',(req, res) => {
  // Check that we received a State Cookie.
  if (!req.cookies.state) {
    res.status(400).send('State cookie not set or expired. Maybe you took too long to authorize. Please try again.');
  // Check the State Cookie is equal to the state parameter.
  } else if (req.cookies.state !== req.query.state) {
    res.status(400).send('State validation failed');
  }

  // Exchange the auth code for an access token.
  oauth2.authorizationCode.getToken({
    code: req.query.code,
    redirect_uri: `${req.protocol}://${req.get('host')}/instagram-callback`
  }).then(results => {
    // We have an Instagram access token and the user identity now.
    const accessToken = results.access_token;
    const instagramUserID = results.user.id;
    const profilePic = results.user.profile_picture;
    const userName = results.user.full_name;

    // ...

  });
});

이제 이 구현의 OAuth 2.0 관련 부분을 마쳤으므로, 다음으로 할 일은 대부분 Firebase와 관련된 일입니다.

다음으로, Firebase 맞춤 인증 토큰을 생성하고, 맞춤 인증 토큰으로 사용자를 로그인시키고 Firebase 사용자 프로필을 업데이트할 HTML 페이지를 제공합니다(이에 대해서는 나중에 자세히 설명함).

app.get('/instagram-callback', (req, res) => {

    // ...

  }).then(results => {
    // We have an Instagram access token and the user identity now.
    const accessToken = results.access_token;
    const instagramUserID = results.user.id;
    const profilePic = results.user.profile_picture;
    const userName = results.user.full_name;
      
    // Create a Firebase custom auth token.
    const firebaseToken = createFirebaseToken(instagramUserID);

    // Serve an HTML page that signs the user in and updates the user profile.
    res.send(
        signInFirebaseTemplate(firebaseToken, userName, profilePic, accessToken)));
  });
});


맞춤 인증 토큰 생성

Firebase 맞춤 인증 토큰을 생성하려면 서비스 계정 사용자 인증 정보를 사용하여 Firebase를 설정해야 합니다. 그러면 이런 토큰을 만드는 데 필요한 관리 권한이 부여됩니다. 서비스 계정 사용자 인증 정보 파일을 service-account.json으로 저장해야 합니다.

const firebase = require('firebase');
const serviceAccount = require('./service-account.json');
firebase.initializeApp({
  serviceAccount: serviceAccount
});

맞춤 인증 토큰은 간단히 만들 수 있습니다. Instagram의 사용자 ID를 기반으로 사용자의 uid를 선택하기만 하면 됩니다.

function createFirebaseToken(instagramID) {
  // The uid we'll assign to the user.
  const uid = `instagram:${instagramID}`;

  // Create the custom token.
  return firebase.auth().createCustomToken(uid);
}

(참고: 서비스 계정 사용자 인증 정보는 안전하게 지켜야 하므로, 맞춤 토큰은 항상 서버 쪽에서 생성해야 합니다.)

맞춤 토큰을 생성했으면 Firebase에 로그인하는 클라이언트에 이를 전달할 수 있습니다.


맞춤 토큰을 사용하여 로그인

이 시점에서 서버는 팝업 창 내에서 실행되는 HTML 페이지를 제공하며 다음 작업을 수행합니다.
  • 나중에 Instagram API에 액세스해야 하는 경우 Instagram 액세스 토큰을 실시간 데이터베이스에 저장합니다. (참고: 사용자만 읽을 수 있도록 하는 보안 규칙을 사용해야 합니다.)
  • Firebase 사용자의 이름과 프로필 사진을 업데이트합니다.
  • 사용자를 로그인시키고 팝업을 닫습니다.

기본 Firebase 앱을 사용하는 대신 임시 Firebase 앱 인스턴스를 사용하여 프로필을 업데이트하는 것도 하나의 묘책입니다. 그러면 사용자의 프로필이 업데이트되기 전에 기본 페이지에서 인증 리스너가 트리거되지 않도록 차단됩니다.

app.get('/instagram-callback', (req, res) => {

    // ...

    // Serve an HTML page that signs the user in and updates the user profile.
    res.send(
        signInFirebaseTemplate(firebaseToken, userName, profilePic, accessToken)));
  });
});

function signInFirebaseTemplate(token, displayName, photoURL, instagramAccessToken) {
 return `
   <script src="https://www.gstatic.com/firebasejs/3.4.0/firebase.js"></script>
   <script src="promise.min.js"></script><!-- Promise Polyfill for older browsers -->
   <script>
     var token = '${token}';
     var config = {
       apiKey: MY_FIREBASE_API_KEY, // Change this!
       database URL: MY_DATABASE_URL // Change this!
     };
     // We sign in via a temporary Firebase app to update the profile.
     var tempApp = firebase.initializeApp(config, '_temp_');
     tempApp.auth().signInWithCustomToken(token).then(function(user) {
    
       // Saving the Instagram API access token in the Realtime Database.
       const tasks = [tempApp.database().ref('/instagramAccessToken/' + user.uid)
           .set('${instagramAccessToken}')];
  
       // Updating the displayname and photoURL if needed.
       if ('${displayName}' !== user.displayName || '${photoURL}' !== user.photoURL) {
         tasks.push(user.updateProfile({displayName: '${displayName}', photoURL: '${photoURL}'}));
       }
  
       // Wait for completion of above tasks.
       return Promise.all(tasks).then(function() {
         // Delete temporary Firebase app and sign in the default Firebase app, then close the popup.
         var defaultApp = firebase.initializeApp(config);
         Promise.all([
             defaultApp.auth().signInWithCustomToken(token),
             tempApp.delete()]).then(function() {
           window.close(); // We’re done! Closing the popup.
         });
       });
     });
   </script>`;
}

사용자가 팝업에서 기본 Firebase 앱에 로그인된 후 인증 상태 리스너가 기본 페이지에서 트리거됩니다. Firebase에서는 인증 상태가 여러 탭 간에 공유된다는 점을 기억하세요. 사용자 프로필 정보를 표시하고, 실시간 데이터베이스, Firebase 저장소 등을 사용할 수 있습니다.


직접 시험해 보세요!

저희는 개발자 여러분이 시험해 볼 수 있는 데모 앱을 https://instagram-auth.appspot.com/에 만들어 두었습니다.

이 샘플은 오픈소스입니다. Github(https://github.com/firebase/custom-auth-samples)에서 관련 리소스를 자유롭게 살펴보시기 바랍니다.


Android와 iOS는 어떠냐고요?

지금까지 이 글에서 보여드린 코드는 웹 앱에서 작동하는 코드입니다. Instagram 인증을 Android 또는 iOS 앱에 추가하는 데는 몇 가지 기법이 있으며 이 게시물에서는 이에 대해 다루지 않을 것이므로 계속해서 새로운 소식이 있는지 눈여겨보시기 바랍니다!


다 되었습니다!

다른 ID 공급자에 대한 샘플을 찾고 있거나 이를 통합하는 데 문제가 있는 경우 댓글을 쓰거나 GitHub 리포지토리 문제를 사용하여 알려주시면 저희가 성심껏 도와드리겠습니다!

▶ 원문 링크
Share on Twitter Share on Facebook

캡션: Noto 글꼴에서 지원하는 110,000자 이상의 문자 중 몇 가지 샘플입니다.


Noto 프로젝트는 Google Android 및 ChromeOS 운영체제의 필요로 시작되었습니다. 시작할 당시에는 이 문제가 얼마나 심각한지 인식하지 못했습니다. 따라서 수백 개의 언어를 대상으로 디자인 및 기술적인 측면에서 테스트를 수행해야 했으며, 특정 스크립트의 경우 전문가의 전문 지식이 필요했습니다. 예를 들어, 아랍어의 경우 각 문자에는 그 다음에 오는 텍스트에 따라 달라지는 4개의 문자 모양(즉, 문자가 취할 수 있는 모양)이 있습니다. 인도어의 경우, 문자 모양이 주변 텍스트에 따라 재정렬되거나 두 개로 분할될 수 있습니다.

이러한 중요한 목표를 실현하기 위해 Monotype, Adobe 및 자원 봉사 검토자로 구성된 훌륭한 네트워크를 포함하여 활자 및 글꼴 디자인 부문의 전문가와 협력해 왔습니다. 매일 사용되는 공통 언어에서 '두부 문제를 방지'하는 것을 뛰어넘어 Noto는 디지털화를 통해 자주 사용되지 않는 언어에 대한 기록과 문화를 유지할 목적으로도 사용됩니다. 새로운 문자가 유니코드 표준에 도입될 때 마다 Google은 이 문자를 Noto 글꼴 모음에 추가할 예정입니다.

Google은 이 글꼴 모음과 함께 개방성, 접근성, 혁신을 구현하는 데 최선을 다하고 있습니다. 전체 Noto 글꼴 모음, 디자인 소스 파일 및 글꼴 구성 파이프라인을 아래 링크에서 무료로 이용할 수 있습니다. 국경과 문화의 벽을 뛰어넘어 서로 나누고 소통하는 정신으로 즐겁게 이용해 보시기 바랍니다!

게시자: Xiangye Xiao 및 Bob Jung, 국제화
▶ 원문 링크

Share on Twitter Share on Facebook


서버 푸시 테스트

Firebase 호스팅은 Link 헤더를 사용하여 HTTP/2 서버 푸시를 시험적으로 지원합니다. 서버 푸시를 사용하면 초기 요청 수행 시 서버가 추가 리소스를 위한 콘텐츠를 자동으로 전송할 수 있습니다. 서버 푸시의 가장 일반적인 용도는 페이지가 로드될 때 연결된 자산(예: JavaScript 또는 CSS 파일)을 전송하는 것입니다.

Firebase 호스팅에 서버 푸시를 구성하려면 다음과 같이 Link 헤더를 firebase.json 구성에 추가해야 합니다.
{
  "hosting": {
    "headers": [
      {
        "source": "/",
        "headers": [{"key": "Link", "value": "</js/app.js>;rel=preload;as=script,</css/app.css>;rel=preload;as=style"}]
      },
      {
         "source": "/users/*",
        "headers": [{"key": "Link", "value": "</js/app.js>;rel=preload;as=script,</css/app.css>;rel=preload;as=style;nopush,</css/users.css>;rel=preload;as=style"}]
      }
    ]
  }
}


여기서는 루트 경로에서 /js/app.js와 /css/app.css를 미리 로드하고, /users/*와 일치하는 경로에서 /css/users.css를 추가로 미리 로드하는 데 서버 푸시를 사용합니다. 브라우저 캐시에 이미 있을 가능성이 큰 파일에 대해서는 (두 번째 예제의 app.css에 대한 지시문과 같이) nopush 지시문을 사용하여 HTTP/2 푸시를 사용하지 않고 자산을 미리 로드할 수 있습니다.

서버 푸시는 아직 초기 단계이므로 다음과 같이 명심해야 할 사항이 몇 가지 있습니다.
  1. Link 헤더를 설정하는 데 와일드카드를 사용하는 경우 주의해야 합니다. 리소스가 그 자체를 미리 로드하도록 설정하면 안 됩니다.
  2. 서버 푸시는 성능과 대역폭 사용 간에 균형을 맞추는 기술입니다. 즉, 브라우저에서 이미 캐싱된 자산을 푸시할 경우 불필요한 데이터를 전송하게 됩니다. 푸시되는 자산을 성능에 중요한 작은 자산으로 유지하도록 노력하고, 사용자가 휴대기기에서 추가 데이터에 대한 비용을 지불해야 할 수 있다는 점을 알고 있어야 합니다!
  3. 미리 로드하기 기능은 푸시를 사용하지 않고도 탁월한 성능을 제공하는 데 유용합니다! ;nopush를 미리 로드 Link 헤더에 추가하면 브라우저는 서버 푸시 없이 자산을 미리 로드합니다. 이는 브라우저에 이미 캐싱되어 있을 수 있다고 생각하는 자산에 유용합니다.
저희는 HTTP/2가 최초의 로드 환경을 개선할 잠재력이 얼마나 될지 무척 기대되며, 서버 푸시를 단순하고 안정적이며 사이트에 효과적인 것으로 만들어줄 더 많은 방법을 강구하고 있습니다.

맞춤 도메인 마이그레이션

HTTP/2로 마이그레이션하면서, 저희는 SSL 인증서를 SNI(Server Name Indication)로 전환하는 중입니다. SNI는 계속해서 인프라를 더욱 안정적으로 확장할 수 있도록 해주며, 전 세계 98% 브라우저에서 지원됩니다. 이러한 변화는 사용자 트래픽에 영향을 미칠 가능성이 있으므로, 2016년 12월까지 기존의 맞춤 도메인을 자동으로 전환하지 않을 계획입니다.

2016년 8월 11일 이전부터 Firebase 호스팅에 맞춤 도메인을 보유한 분이라면 DNS 레코드를 업데이트해야 HTTP/2를 이용할 수 있습니다. dig <your-site>.firebaseapp.com을 실행하여 SNI로 이미 전환되었는지 확인할 수 있습니다. 결과에 s-sni.firebaseapp.com이 표시되면 사이트가 이미 마이그레이션된 것입니다.

CNAME을 사용하는 경우 마이그레이션하려면 s-sni.firebaseapp.com을 가리키도록 DNS를 업데이트해야 합니다. A 레코드를 사용하는 경우에는 다음과 같이 업데이트하십시오.

151.101.1.195
151.101.65.195

DNS를 변경하고 그 변경 내용이 전파되면 사이트가 HTTP/2로 구동될 것입니다! 올해 말까지 모든 Firebase 호스팅 트래픽을 HTTP/2와 SNI로 전환할 예정입니다. 따라서 SNI가 사용자에게 어떤 영향을 미칠지 걱정된다면 지원 사이트를 방문하시기 바랍니다.

Firebase 호스팅과 관련된 저희의 목표는 모든 이가 PWA(Progressive Web Apps) 개발의 모범 사례를 자유롭게 활용하도록 하는 것입니다. HTTP/2는 이런 목표를 향한 여정에서 거치는 또 하나의 단계이며, 여러분이 이를 활용하여 무엇을 빌드할지 정말 기대됩니다!

▶ 원문 링크
Share on Twitter Share on Facebook


Google VR SDK 1.0을 사용하여 훨씬 더 쉽게 개발 작업을 시작할 수 있도록 하기 위해, 저희는 이미 익숙한 게임 엔진과 도구를 사용할 수 있도록 Unity 및 Unreal과 제휴했습니다. 또한, 설명서 전문, 참조 샘플 앱 및 가이드를 게시하여 사이트를 업데이트했습니다.

기본 Unity 통합

이번 릴리스에서는 Unity에 기본적으로 통합된 Daydream을 선보입니다. 이를 통해 Daydream 개발자는 VR 렌더링에 Unity의 최적화된 기능을 모두 활용할 수 있습니다. 또한, 헤드 추적, 딥 링크 및 간편한 안드로이드 매니페스트 구성과 같은 기능도 추가로 지원합니다. 많은 Daydream 실행 앱이 이미 이런 최신 통합 기능과 연동되고 있으며, 지금 새로운 Unity 바이너리(여기)와 Daydream 플러그인(여기)을 다운로드할 수 있습니다.

기본 UE4 통합

저희는 UE4 기본 통합을 더욱 개선했으며, 이는 개발자가 더욱 향상된 프로덕션 수준의 품질을 제공하는 Daydream 앱을 빌드하는 데 도움이 될 것입니다. 이 최신 버전에는 편집기에서 Daydream 컨트롤러 지원 기능, 넥 모델(neck model), 새로운 렌더링 최적화 기능 등이 추가되었습니다. UE4 개발자는 여기에서 소스를 다운로드할 수 있습니다.


지금 시작하세요.

초기 Daydream 지원 휴대폰 및 헤드셋이 이번 가을에 출시될 예정이지만, 지금 바로 Google VR SDK 1.0과 DIY 개발자 키트를 사용하여 고품질의 Daydream 앱 개발을 시작할 수 있습니다.

저희는 또한 Daydream을 위한 훌륭한 콘텐츠를 빌드하는 더욱 많은 개발자와 긴밀하게 작업할 수 있도록 현재 DAP(Daydream Access Program) 참가 신청을 받고 있습니다. DAP 참가 신청을 하려면 Daydream 앱 제안서를 제출하시기 바랍니다.

Daydream 플랫폼을 위한 콘텐츠를 만들 때는 앱이 모든 Daydream 지원 휴대폰과 헤드셋에서 아무런 문제 없이 원활하게 작동해야 한다는 점에 유의하세요. Daydream은 이제 막 시작되었으므로 함께 협력하여 새로운 몰입형 대화식 VR 환경을 빌드하는 데 도움을 드릴 수 있게 되기를 고대합니다. 곧 제공될 Daydream 지원 휴대폰 및 Daydream 헤드셋과 컨트롤러에 대한 추가 정보에 계속 관심을 가져 주세요.

▶ 원문 링크
Share on Twitter Share on Facebook


Google Play 개발자 지원팀에 문의하기 [링크]


    게시자: Google Play 개발자 지원팀
    Share on Twitter Share on Facebook