Pebble.js로 시계앱 개발하기

pebble-three

소개

기본적으로 페블앱을 개발할때는 C언어를 이용하여 개발하게 됩니다. 하지만 Pebble.js (Simply.js에서 파생)를 이용하는 대안도 있습니다. Pebble.js는 패블을 위한 시계앱을 만드는데 단지 자바스크립트만으로 개발을 할 수 있게 해줍니다. 이 튜토리얼에서는 JS환경에서 사용자에게 날씨 정보를 보여주는 기본적인 시계앱을 만들어 볼 예정입니다. 한번 시작해 볼까요?

Pebble.js 기본

Pebble.js 시계앱 개발에 앞서 CloudPebble이라는 클라우드 환경의 개발툴을 사용할 것입니다. 새로운 프로젝트를 생성할 때 “Project Type”에서 “Pebble.js”를 선택하시기 바랍니다. 이렇게 프로젝트를 생성하면 app.js라는 이름의 템플릿 파일이 주어집니다.

pebblewatch_cloud_ide_02

우리의 시계앱을 개발하기위해 먼저 app.js를 선택한 뒤에 다음의 코드를 제외한 나머지 코드를 모두 삭제합니다.

var UI = require('ui');

이 UI 모듈은 Window와 Card를 사용하여 시계앱 레이아웃을 구성할 수 있게 해줍니다. 먼저 날씨 정보가 다운로드중임을 알려주기 위한 새로운 Card 를 만들겠습니다. 다음의 코드를 require() 밑에 바로 추가하여 Card 를 만들고 보여주도록 해보겠습니다.

// Create a Card with title and subtitle
var card = new UI.Card({
  title:'Weather',
  subtitle:'Fetching...'
});

// Display the Card
card.show();

이 코드는 다음과 같이 보여지는 Card를 생성해줄 것입니다.

pebblewatch_cloud_ide_03

Card 엘리먼트의 생성자로 title과 subtitle을 지정하였더니 자동으로 제목과 부제목의 레이아웃을 제공하는것을 알 수 있습니다. 마찬가지로 body, style, scrollable 등등의 설정을 할 수 있습니다.

날씨 정보를 보여주는 앱 개발

우리는 OpenWeatherMap.org에서 날씨 정보를 가져오고 위치와 온도와 날씨 정보를 Card에 보여줄 것입니다. 정보를 가져오기 위해서 우리는 Pebble.js에 기본 포함되어있는 ajax 라이브러리를 사용할 것입니다.

첫번째로 알맞은 required() 를 JS 파일의 최상단에 추가하여 ajax() 함수에 접근할 수 있도록 합니다.

var ajax = require('ajax');

다음 단계로 날씨 정보를 제공하는 API에 접근하기 위해 사용할 URL http://api.openweathermap.org/data/2.5/weather 에 도시 이름을 q 인자에 넣어 정보를 요청하겠습니다.

// Construct URL
var cityName = 'London';
var URL = 'http://api.openweathermap.org/data/2.5/weather?q=' + cityName;

다음으로 위의 요청 URL과 요청 타입과 성공/실패에 대한 콜백을 정의합니다.

// Make the request
ajax(
  {
    url: URL,
    type: 'json'
  },
  function(data) {
    // Success!
    console.log('Successfully fetched weather data!');
  },
  function(error) {
    // Failure!
    console.log('Failed fetching weather data: ' + error);
  }
);

날씨 정보가 정상적으로 다운로드 되었다면 data에 담겨서 성공 콜백으로 들어오게 될 것입니다. 여기서 위치나 온도 정보나 날씨에 대한 부가적인 정보를 얻을 수 있습니다.

function(data) {
  // Success!
  console.log('Successfully fetched weather data!');

  // Extract data
  var location = data.name;
  var temperature = Math.round(data.main.temp - 273.15) + 'C';

  // Always upper-case first letter of description
  var description = data.weather[0].description;
  description = description.charAt(0).toUpperCase() + description.substring(1);
}

마지막 단계는 Card안의 title, subtitle, body 필드들을 이용해 유저에게 원하는 정보를 보여주는 단계입니다. 성공 콜백안에서 Card가 제공하는 subtitle()과 body() 함수를 이용하여 값을 전달 할 수 있습니다.

// Show to user
card.subtitle(location + ', ' + temperature);
card.body(description);

다시 컴파일 뒤 재설치를 한 뒤에 다음과 같은 화면을 보실 수 있습니다.

pebblewatch_cloud_ide_04

시간별 일기예보를 제공하는 앱 개발

일기예보를 보여주기 위한 가장 적절한 방법은 Pebble.js가 제공하는 Menu 객체를 사용하는것입니다. 이 객체는 Card와 비슷하지만 다수의 섹션과 메뉴 아이템들로 구성할 수 있습니다. 예를 들어 페블 시스템 메뉴에 들어가면 Music, Notification, Alarms 기타등등이 보이는데 이것을 생각하시면 됩니다.

새로운 프로젝트에서 시작할 예정인데 이전 프로젝트와 마찬가지로 UI와 ajax 모듈을 마찬가지로 require()를 이용하여 로드합니다.

var UI = require('ui');
var ajax = require('ajax');

이전 프로젝트에서는 Card에서 시작하였었지만 이번에는 UI 요소들을 원하는 위치에 마음대로 배치할 수 있는 Window를 이용해 보겠습니다. 이 Window는 날씨 정보가 다운로드 될때까지 보여질 스플래시 스크린으로 제공할 것입니다. 사용자가 기다리는 동안 보여질 하나의 Text 엘리먼트를 추가합니다. 이 새로운 엘리먼트는 Vector2 모듈(x, y좌표 또는 가로, 세로 길이를 표시하는데 쓰임)을 필요로합니다. UI 모듈과 마찬가지 방법으로 JS 파일의 최상단에 다음을 추가해줍니다.

var Vector2 = require('vector2');

다음은 Window와 Text 엘리먼트를 생성하겠습니다. Text의 경우 다음에서 보여지는것과 같이 다양한 속성을 부여할 수 있습니다.

// Show splash screen while waiting for data
var splashWindow = new UI.Window();

// Text element to inform user
var text = new UI.Text({
  position: new Vector2(0, 0),
  size: new Vector2(144, 168),
  text:'Downloading weather data...',
  font:'GOTHIC_28_BOLD',
  color:'black',
  textOverflow:'wrap',
  textAlign:'center',
  backgroundColor:'white'
});

// Add to splashWindow and show
splashWindow.add(text);
splashWindow.show();

위의 코드의 결과물은 다음과 같을것입니다.

pebblewatch_cloud_ide_05 이번에는 시간단위의 일기예보 정보를 가져와보겠습니다. 이전과 비슷하게 런던의 일기예보 정보를 가져오는 예제 코드는 다음과 같습니다.

// Make request to openweathermap.org
ajax(
  {
    url:'http://api.openweathermap.org/data/2.5/forecast?q=London',
    type:'json'
  },
  function(data) {

  },
  function(error) {
    console.log('Download failed: ' + error);
  }
);

여기서 성공할 때에 받게 되는 정보는 이전과 크게 다르지 않지만 위치정보(data.city.coord), 도시 이름(data.city.name) 그리고 국가 이름(data.city.country) 마지막으로 미래의 일기예보 정보(data.list)가 담겨오게 됩니다. 여기서 이 list 필드가 가장 중요하게 봐야 하는 데이터입니다.

이 list 배열은 시간별 일기예보 정보가 3시간 단위로 제공합니다. 우리가 ajax() 호출을 통해 요청을 성공하였다면 현재 시간 이후의 10개의 일기예보 정보를 받게 됩니다. 다음에서 보여드릴 함수는 이러한 데이터를 보여주기 위한 데이터로 가공하는 역할을 합니다.

var parseFeed = function(data, quantity) {
  var items = [];
  for(var i = 0; i < quantity; i++) {
    // Always upper case the description string
    var title = data.list[i].weather[0].main;
    title = title.charAt(0).toUpperCase() + title.substring(1);

    // Get date/time substring
    var time = data.list[i].dt_txt;
    time = time.substring(time.indexOf('-') + 1, time.indexOf(':') + 3);

    // Add to menu items array
    items.push({
      title:title,
      subtitle:time
    });
  }

  // Finally return whole array
  return items;
};

우리는 이제 이 함수를 이용하여 다음의 10시간의 일기예보를 사용할 수 있게 되었습니다.

// Create an array of Menu items
var menuItems = parseFeed(data, 10);

// Check the items are extracted OK
for(var i = 0; i < menuItems.length; i++) {
  console.log(menuItems[i].title + ' | ' + menuItems[i].subtitle);
}

지금까지 개발한 코드를 저장하고 컴파일한 뒤 ‘VIEW LOGS’를 눌러 다음과 같은 로그가 출력된것을 확인할 수 있습니다.

[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Few clouds | 07-30 21:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Sky is clear | 07-31 00:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Sky is clear | 07-31 03:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Few clouds | 07-31 06:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Broken clouds | 07-31 09:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Few clouds | 07-31 12:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Broken clouds | 07-31 15:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Few clouds | 07-31 18:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Broken clouds | 07-31 21:00
[PHONE] pebble-app.js:?: PJSTUT2__1/pebble-js-app.js:156 Few clouds | 08-01 00:00

이제 Menu 객체를 사용하여 이 아이템들을 사용자에게 보여줄 수 있도록 해보겠습니다. ajax()의 성공 콜백안에서 parseFeed()를 호출 뒤에 Menu 객체를 다음과 같이 알맞은 섹션과 아이템들을 사용하여 생성합니다.

// Construct Menu to show to user
var resultsMenu = new UI.Menu({
  sections: [{
    title: 'Current Forecast',
    items: menuItems
  }]
});

// Show the Menu, hide the splash
resultsMenu.show();
splashWindow.hide();

이 코드에서 resultsMenu.show()를 호출한 뒤에 splashWindow.hide() 호출하여 Window 스택을 관리하고 있는데 이는 사용자가 BACK 버튼을 눌러 또다시 스플레시 화면을 보는 상황을 막기 위해서입니다.

저장하고 컴파일하고 설치한뒤에 다음과 같이 일기 예보 정보가 보여지는 MenuLayer를 볼 수 있습니다. 이번에는 Menu 의 아이템들중에 선택된(SELECT 버튼을 누름, 오른쪽 가운데 버튼) 일기예보 정보의 상세 정보를 보여주는 기능을 추가해 보겠습니다. resultsMenu에 Menu.on() 함수를 구현함으로 써 SELECT 버튼의 이벤트를 처리할 수 있습니다.

// Add an action for SELECT
resultsMenu.on('select', function(e) {
  console.log('Item number ' + e.itemIndex + ' was pressed!');
});

다시 컴파일하고 실행하여 보면 Menu 에서 SELECT 버튼을 누르면 다음과 같은 로그가 출력되는것을 확인할 수 있습니다.

[PHONE] pebble-app.js:?: PJSTUT3__1/pebble-js-app.js:169 Item number 1 was 
pressed!

SELECT 버튼이 눌려 원하는 일기 예보 정보가 선택되면 우리는 새로운 Card 를 만들어 상세 정보를 보여줄 것입니다. 또한 BACK 버튼이 눌리면 다시한번 Menu 목록을 보여줌으로 써 다른 선택을 할 수 있도록 해줄 것입니다.

첫번째 단계로 .on() 콜백에서 console.log() 대신의 다음과 같이 Card를 생성하는 코드를 추가해줍니다. 여기서는 온도, 기압, 바람 정보를 문자열 형태로 보여줄것입니다.

// Add an action for SELECT
resultsMenu.on('select', function(e) {
  // Get that forecast
  var forecast = data.list[e.itemIndex];

  // Assemble body string
  var content = data.list[e.itemIndex].weather[0].description;

  // Capitalize first letter
  content = content.charAt(0).toUpperCase() + content.substring(1);

  // Add temperature, pressure etc
  content += '\nTemperature: ' + Math.round(forecast.main.temp - 273.15) + '°C' 
  + '\nPressure: ' + Math.round(forecast.main.pressure) + ' mbar' +
    '\nWind: ' + Math.round(forecast.wind.speed) + ' mph, ' + 
    Math.round(forecast.wind.deg) + '°';
});

content 문자열이 만들어지고 나면 이 정보를 상세 정보를 보여주는 Card를 생성하는데 사용할 것입니다.

// Create the Card for detailed view
var detailCard = new UI.Card({
  title:'Details',
  subtitle:e.item.subtitle,
  body: content
});
detailCard.show();

다시 저장하고 재실행 한뒤에 확인해 보면 Menu 아이템중에 SELECT를 눌러 선택을 하게 되면 그 시간에 대한 상세 정보를 보여주는 화면이 나오는 것을 확인할 수 있습니다.

pebblewatch_cloud_ide_06

흔들어서 정보 업데이트 하기

마지막으로 부수적인 기능을 구현해 볼것인데. Accel API를 사용하여 페블의 가속도 센서를 사용하여 정보를 업데이트하는 기능을 추가해보겠습니다. 이 기능을 구현하여 사용자가 손목을 흔들기만 함으로 써 날씨 정보가 업데이트 될 것입니다.

첫번째로는 JS파일의 최상단에 추가적인 require() 를 추가해주는것입니다.

var Accel = require('ui/accel');

다음으로는 가속도 센서를 앱이 시작될 때 초기화 해줍니다. 이 코드를 ajax 호출이 끝나는 시점에 호출해 줍니다.

// Prepare the accelerometer
Accel.init();

우리가 구현하려는 기능은 데이터가 이미 다운로드 되어 준비된 상태이고 여기서 정보를 업데이트 하는 기능입니다. 우리는 ajax() 성공 콜백에서 resultsMenu가 만들어지고 보여진 뒤에 “tap”이라는 리스너를 설정할 것입니다. 여기서 accelTap 리스너를 resultsMenu에 추가함으로써 detailCard가 보여지지 않을 때에 업데이트가 일어나는 것을 보장할 수 있습니다.

// Register for 'tap' events
resultsMenu.on('accelTap', function(e) {
  console.log('TAP!');
  console.log('axis: ' + e.axis + ', direction:' + e.direction);
});

tap 이벤트에는 e.axis와 e.direction이 담겨오게 되지만 일단 여기서는 사용할 필요가 없으니 날씨 정보를 업데이트 하는 코드를 추가하도록 하겠습니다.

// Register for 'tap' events
resultsMenu.on('accelTap', function(e) {
  // Make another request to openweathermap.org
  ajax(
    {
      url:'http://api.openweathermap.org/data/2.5/forecast?q=London',
      type:'json'
    },
    function(data) {

    },
    function(error) {
      console.log('Download failed: ' + error);
    }
  );
});

다음으로는 성공 콜백에서 parseFeed를 호출하여 사용자가 읽을 수 있는 형태로 데이터를 다시 생성하고 기존의 Menu에서 items() 함수를 사용하여 보여지고 있던 데이터를 새로운 데이터로 변경합니다. 여기서 0이라는 섹션 번호를 지정하였는데 우리는 하나의 섹션밖에 사용하고 있지 않으므로 0으로 지정하였습니다.

function(data) {
  // Create an array of Menu items
  var newItems = parseFeed(data, 10);

  // Update the Menu's first section
  resultsMenu.items(0, newItems);
}

마지막으로 다운로드가 완료되었을 때 짧은 진동을 추가해 보도록 하겠습니다. require()를 이용하여 Vibe 모듈을 임포트합니다.

var Vibe = require('ui/vibe');

데이터의 다운로드가 완료되었을 때 items() 메소드를 이용하여 새로운 데이터로 교체를 하고 난 뒤에 다음의 코드를 호출하여 진동을 발생 시킬 수 있습니다.

// Notify the user
Vibe.vibrate('short');

이제 다시 컴파일하고 실행해 보면 손목을 흔들면 몇초 후 짧은 진동이 오고 Menu 데이터 역시 변경된 것을 확인할 수 있게 됩니다.

참고 : Build A Watchapp with Pebble.js

애플와치 Glance 핵심 사항 정리

watchkit_logo

Glance(흘낏 보다)는 당신의 앱에서 중요한 정보를 사용자에게 보여주기 위한 보조적인 방법입니다. 모든 앱이 Glance를 필요로 하지는 않습니다. Glance를 이용하여 적절한 시점에 관련된 정보를 보여줄 수 있습니다. 예를 들어 캘린더 앱의 Glance는 사용자의 다음 미팅 정보를 보여줄 수 있습니다. 항공사 앱이라면 곧 다가올 비행의 공항 게이트 정보를 보여줄 수 있습니다. 다음 그림은 사용자의 To-do 리스트중에 처리한 일과 남은 일의 갯수를 보여주는 예시 화면입니다.

applewatch_glance_essential_01

Glance는 WatchKit 앱과 WatchKit 익스텐션의 일환으로 제공됩니다. 당신의 Glance 인터페이스에는 WatchKit 앱의 스토리보드 파일에 포함되며 이 인터페이스는 커스텀 WKInterfaceController에 의해 관리됩니다. 하지만 Glance 인터페이스 컨트롤러에서 구현할 수 있는 유일한 작업은 Glance를 위한 컨텐츠를 보여주는것 뿐입니다. Glance는 유저의 상호작용(Interactivity)을 구현할 수 없습니다. Glance 화면을 탭할 경우 자동으로 WatchKit 앱을 실행하게 됩니다.

Glance 생명 주기

Glance 인터페이스 컨트롤러의 생명 주기는 사용자에게 빨리 보여주기 위해 좀 더 일찍 초기화 된다는 점을 제외하면 다른 인터페이스 컨트롤러와 동일합니다. Glance가 초기화 되고 사용자에게 보여지기 까지 적지 않은 시간이 소요될 수 있기 때문에 willActivate 메소드에서 보여줄 정보가 업데이트 될 수 있도록 해야 합니다. 인터페이스 컨트롤러의 생명 주기에 대해 더 알아보고 싶을 경우 WatchKit Extension Life Cycle을 확인하십시오.

Glance 인터페이스 가이드라인

XCode는 앱의 컨텐츠를 정렬하는 방법으로 고정된 레이아웃을 제공합니다. 당신의 컨텐츠를 보여주기 위한 적절한 레이아웃을 선택한 다음에는 다음의 가이드라인을 확인하시기 바랍니다.

  • 정보를 신속하게 전달 할 수 있도록 당신의 Glance를 디자인 하십시오. 많은 텍스트를 보여주려 하지 마십시오. 적절한 디자인, 색상, 애니메이션을 사용하여 정보를 제공하십시오.
  • 가장 중요한 정보에 집중하십시오. Glance는 당신의 WatchKit 앱을 대체하는 역할을 하지 않습니다. iOS의 정제된 버전이 WatchKit 앱이라면 Glance는 WatchKit 앱의 정제된 버전입니다.
  • Glance 인터페이스에 상호작용하는 컨트롤을 포함하지 마십시오. 버튼, 스위치, 슬라이더, 메뉴와 같은 상호작용하는 컨트롤들은 사용할 수 없습니다.
  • 당신의 Glance 인터페이스에 테이블이나 지도를 사용하지 마십시오. 이들은 기능적으로 금지되지는 않지만 공간 제약상 테이블과 지도는 효율적으로 정보를 제공하기 어렵습니다.
  • 시점에 적절한 정보를 보여주십시오. 사용자에게 중요한 시간과 위치 정보를 포함하여 모든 사용가능한 리소스를 사용하십시오. 당신의 인터페이스 컨트롤러가 초기화 되고 사용자에게 보여지기 까지 발생하는 변화를 감안하여 Glance 에 보여질 정보를 업데이트 하는것을 잊지 마십시오.
  • 모든 텍스트에 시스템 폰트를 사용하십시오. 당신의 Glance에 커스텀 폰트를 사용하기 위해서는 반드시 커스텀 폰트를 이미지로 렌더링 한 후에 이미지를 보여주십시오.

하나의 앱은 하나의 Glance 인터페이스 컨트롤러만을 가질 수 있기 때문에 이 컨트롤러에서 당신이 보여주고자 하는 정보를 반드시 보여주어야 합니다.

Glance 인터페이스 관리

당신의 XCode 프로젝트에 WatchKit 앱 타겟을 주가할 때 Glance 인터페이스를 원하는지 여부를 선택할 수 있습니다. 프로젝트 초기화 시점에 이것을 잊고 있었다면 나중에도 추가할 수 있습니다. Glance 인터페이스 컨트롤러는 앱의 스토리보드와는 조금 다른 형태를 띄고 있습니다. Glance의 인터페이스 컨트롤러는 Glance 시작 지점에 붙어있고 자체적으로 기본 레이아웃을 가지고 있습니다.

applewatch_glance_essential_02

구동 시점에 당신의 Glance의 컨텐츠를 설정하기 위해서는 WKInterfaceController를 상속한 커스텀 클래스를 사용해야 합니다. 당신의 WatchKit 앱을 구현하는 것과 동일한 방법으로 상속을 받아 구현하시면 됩니다.

앱에 Glance 인터페이스를 추가하기

WatchKit 앱 타겟을 생성할 때 Glance 인터페이스를 구현을 위한 파일들을 생성할지 묻는 “Include Glance Scene” 옵션을 선택할 수 있습니다. 선택할 경우 XCode는 Glance 스토리보드 씬과 커스텀 Glance 인터페이스 컨트롤러 클래스를 제공합니다. 만약 타겟을 추가할 때 이 옵션을 선택하지 못하였다면 다음과 같은 방법으로 수동으로 추가할 수 있습니다.

  1. 당신의 프로젝트에서 WKInterfaceController 를 상속한 클래스를 생성합니다. 새로운 소스 파일을 추가하고 WatchKit 익스텐션 타겟에 추가합니다. GlanceInterfaceController과 같이 적절한 이름으로 만들어 줍시다.
  2. 당신의 스토리보드 파일에서 Glance 인터페이스 컨트롤러를 드래그하여 추가해 줍니다. 이 씬은 위에서 봤었던 스크린샷처럼 Glance 시작 지점 화살표가 붙어있게 됩니다.
  3. 방금 추가한 Glance 인터페이스 컨트롤러를 선택하고 “Identity Inspector”를 선택합니다.
  4. 위에서 생성한 Glance 인터페이스 컨트롤러 클래스를 설정해 줍니다.

WatchKit 앱은 단 하나의 Glance 인터페이스만을 가질 수 있습니다. 당신 앱의 스토리보드에 두개 이상의 Glance 인터페이스 컨트롤러를 추가하지 않도록 주의하십시오.

Glance 인터페이스 컨트롤러를 구현하고 업데이트 하기

Glance 인터페이스 컨트롤러의 구현은 라벨과 이미지들로 이루어진 컨텐츠들의 세팅이기 때문에 상대적으로 간단합니다.

  • init 과 awakeWithContext: 메소드들을 사용하여 Glance 인터페이스를 초기화 하고 라벨과 이미지들의 초기값을 설정하십시오.
  • willActivate 메소드에서 Glance 인터페이스가 화면에 보여지기 전에 표시되어야 하는 정보를 업데이트 하십시오.

Glance가 화면에 보여지고 난 뒤에 컨텐츠를 업데이트 하기 위해서는 NSTimer 객체를 이용하여 주기적으로 업데이트를 할 수 있습니다. 당신은 스스로 업데이트하는 WKInterfaceDate 와 WKInterfaceTimer 객체를 사용하여 업데이트를 할 필요가 없습니다.

Glance로부터의 앱 구동을 커스터마이징하기

사용자가 Glance 화면을 탭하면 애플 와치는 이 Glance에 대응하는 WatchKit 앱을 구동합니다. 일반적으로 메인 인터페이스 컨트롤러가 구동됩니다. Glance로 부터 앱이 구동될 때 해야 할일을 커스터마이징 하기위해서는 다음을 따르기 바랍니다.

  • Glance 인터페이스 컨트롤러에서
    • Glance의 init과 willActivate 메소드들을 일반적인 방법으로 구현합니다.
    • 원하는 시점에 당신의 앱이 필요로하는 부가적인 정보를 userInfo에 담아 updateUserActivity:userInfo:webpageURL: 메소드를 호출합니다. 구동 시점에 여기서 넘겨받은 데이터를 토대로 다른 인터페이스 컨트롤러를 보여줄 수 있습니다.
  • 앱의 메인 인터페이스 컨트롤러에서
    • handleUserActivity: 메소드를 구현하십시오. userInfo Dictionary를 이용하여 적절한 UI를 설정할 수 있습니다.

updateUserActivity:userInfo:webpageURL: 메소드를 호출하면 WatchKit은 메인 인터페이스 컨트롤러의 handleUserActivity: 메소드를 구동시점에 호출하게 됩니다. 이 handleUserActivity: 메소드의 구현부에서 적절한 UI를 선택할 수 있습니다. 예를 들어 페이지 기반 앱의 경우 가장 처음에 보여줄 페이지가 몇페이지인지를 선택하게 할 수 있습니다.

참고 : Glance EssentialsManaging Your Glance Interface