이 항목에서는 사용자가 PC 및 장치에서 앱에서 수행한 작업을 다시 시작하는 데 도움이 되는 방법을 설명합니다.
비고
2021년 7월부터 MSA(Microsoft 계정)를 통해 Windows 장치에서 활동 기록이 동기화된 사용자는 더 이상 타임라인에서 새 활동을 업로드할 수 있는 옵션이 없습니다. 여전히 타임라인을 사용하고 로컬 PC에서 활동 기록(최근 앱, 웹 사이트 및 파일에 대한 정보)을 볼 수 있습니다. AAD 연결 계정은 영향을 받지 않습니다.
사용자 활동 및 타임라인
우리의 시간은 매일 여러 장치에 걸쳐 있습니다. 버스에 있을 때는 휴대전화를 사용하고, 하루 동안은 PC를 이용하다가 저녁에는 휴대전화나 태블릿을 사용할 수 있습니다. Windows 10 빌드 1803 이상부터 사용자 활동을(를) 만들면 해당 활동이 Windows 타임라인과 Cortana의 '중단한 작업 이어서 하기' 기능에 표시됩니다. 타임라인은 사용자 활동을 활용하여 작업한 내용을 시간순으로 표시하는 풍부한 작업 보기입니다. 또한 여러 장치에서 작업한 내용을 포함할 수 있습니다.
마찬가지로 휴대폰을 Windows PC에 연결하면 이전에 iOS 또는 Android 디바이스에서 수행한 작업을 계속할 수 있습니다.
UserActivity는 사용자가 앱 내에서 작업 중인 구체적인 것으로 생각하십시오. 예를 들어, RSS 리더를 사용하는 경우, UserActivity는 당신이 읽고 있는 피드일 수 있습니다. 게임을 하고 있다면, UserActivity는 당신이 플레이 중인 레벨일 수 있습니다. 음악 앱에서 음악을 듣고 있는 경우, UserActivity은 듣고 있는 재생 목록일 수 있습니다. 문서 작업을 하는 경우 UserActivity가 작업을 중단한 위치일 수 있습니다. 즉, UserActivity 앱 내의 대상을 나타내므로 사용자가 수행한 작업을 다시 시작할 수 있습니다.
UserActivity.CreateSession호출하여 UserActivity 사용하는 경우 시스템은 해당 UserActivity시작 및 종료 시간을 나타내는 기록 레코드를 만듭니다. 시간이 지남에 따라, UserActivity에 다시 참여하면 여러 기록이 생성됩니다.
앱에 사용자 활동 추가
UserActivity Windows의 사용자 참여 단위입니다. 여기에는 활동이 속한 앱을 활성화하는 데 사용되는 URI, 활동을 설명하는 시각적 개체 및 메타데이터의 세 부분으로 구성됩니다.
-
ActivationUri 특정 컨텍스트로 애플리케이션을 다시 시작하는 데 사용됩니다. 일반적으로 이 링크는 체계(예: "my-app://page2?action=edit") 또는 AppUriHandler(예:
http://contoso.com/page2?action=edit)의 프로토콜 처리기 형태를 사용합니다. - VisualElements 사용자가 제목, 설명 또는 적응형 카드 요소로 활동을 시각적으로 식별할 수 있는 클래스를 노출합니다.
- 마지막으로 콘텐츠 특정 컨텍스트에서 활동을 그룹화하고 검색하는 데 사용할 수 있는 활동에 대한 메타데이터를 저장할 수 있습니다. 대개 https://schema.org 데이터 형식을 사용합니다.
앱에 UserActivity를 추가하려면 다음 단계를 따르십시오.
- 앱 내에서 사용자 컨텍스트가 변경되면(예: 페이지 탐색, 새 게임 레벨 등), 사용자 활동 개체를 생성하세요.
- UserActivity 개체를 필요한 최소 필드 집합으로 채웁니다: ActivityId, ActivationUri, 그리고 UserActivity.VisualElements.DisplayText.
- 앱에 사용자 정의 스킴 처리기를 추가하여 UserActivity로 다시 활성화할 수 있도록 합니다.
UserActivity 몇 줄의 코드만으로 앱에 통합할 수 있습니다. 예를 들어, MainPage 클래스 내의 MainPage.xaml.cs에 다음과 같은 코드가 있다고 가정해봅시다. (참고: using Windows.ApplicationModel.UserActivities;를 가정함)
UserActivitySession _currentActivity;
private async Task GenerateActivityAsync()
{
// Get the default UserActivityChannel and query it for our UserActivity. If the activity doesn't exist, one is created.
UserActivityChannel channel = UserActivityChannel.GetDefault();
UserActivity userActivity = await channel.GetOrCreateUserActivityAsync("MainPage");
// Populate required properties
userActivity.VisualElements.DisplayText = "Hello Activities";
userActivity.ActivationUri = new Uri("my-app://page2?action=edit");
//Save
await userActivity.SaveAsync(); //save the new metadata
// Dispose of any current UserActivitySession, and create a new one.
_currentActivity?.Dispose();
_currentActivity = userActivity.CreateSession();
}
위의 GenerateActivityAsync() 메서드의 첫 번째 줄은 사용자의 UserActivityChannel가져옵니다. 이 앱의 활동이 게시될 피드입니다. 다음 줄은 MainPage이라는 활동의 채널을 쿼리합니다.
- 앱은 사용자가 앱의 특정 위치에 위치할 때마다 동일한 ID가 생성되는 방식으로 활동의 이름을 지정해야 합니다. 예를 들어 앱이 페이지 기반인 경우 페이지의 식별자를 사용합니다. 문서를 기반으로 하는 경우 문서의 이름(또는 이름의 해시)을 사용합니다.
- 피드에 동일한 ID를 가진 기존 활동이 있는 경우 해당 활동은
UserActivity.State게시된)로 설정된 채널에서 반환됩니다. 해당 이름의 활동이 없고 새 활동이새 설정하여 반환되는 경우 - 활동은 귀하의 앱으로 한정되어 있습니다. 당신의 활동 ID가 다른 앱의 ID와 충돌할 걱정할 필요가 없습니다.
먼저 UserActivity을 가져오거나 생성한 후에, 나머지 두 개의 필수 필드인 UserActivity.VisualElements.DisplayText및 UserActivity.ActivationUri를 지정합니다.
다음으로, SaveAsync을(를) 호출하여 UserActivity 메타데이터를 저장한 후, 마지막으로 CreateSession을(를) 호출하면 UserActivitySession이 반환됩니다.
UserActivitySession은 사용자가 실제로 UserActivity에 참여하는 시점을 관리할 수 있는 개체입니다. 예를 들어 사용자가 페이지를 떠날 때 Dispose()에서 를 호출해야 합니다. 위의 예제에서는 또한 Dispose()호출하기 전에 _currentActivity에서 CreateSession()을 호출합니다. 이는 페이지의 멤버 필드로 _currentActivity을 만들었고, 새로운 작업을 시작하기 전에 기존 작업을 중지하려고 하기 때문입니다(참고: ?은 null 조건부 연산자로, 이는 멤버 액세스를 수행하기 전에 null인지 테스트합니다).
이 경우 ActivationUri 사용자 지정 체계이므로 애플리케이션 매니페스트에도 프로토콜을 등록해야 합니다. 이 작업은 Package.appmanifest XML 파일에서 또는 디자이너를 사용하여 수행됩니다.
디자이너를 변경하려면 프로젝트에서 Package.appmanifest 파일을 두 번 클릭하여 디자이너를 시작하고 선언 탭을 선택하고 프로토콜 정의를 추가합니다. 지금 작성해야 하는 유일한 속성은 Name입니다. 위에서 지정한 URI와 일치해야 합니다, my-app.
이제 프로토콜에 의해 활성화되었을 때 앱에 수행할 작업을 알려주는 코드를 작성해야 합니다. 다음과 같이 App.xaml.cs OnActivated 메서드를 재정의하여 URI를 기본 페이지에 전달합니다.
protected override void OnActivated(IActivatedEventArgs e)
{
if (e.Kind == ActivationKind.Protocol)
{
var uriArgs = e as ProtocolActivatedEventArgs;
if (uriArgs != null)
{
if (uriArgs.Uri.Host == "page2")
{
// Navigate to the 2nd page of the app
}
}
}
Window.Current.Activate();
}
이 코드는 앱이 프로토콜을 통해 활성화되었는지 여부를 검색합니다. 이 경우 앱이 활성화된 작업을 재개하기 위해 무엇을 해야 하는지 확인합니다. 간단한 앱이기 때문에 이 앱이 실행될 때 유일한 활동은 여러분을 보조 페이지로 이동시키는 것입니다.
적응형 카드를 사용하여 타임라인 환경 개선
사용자 활동은 Cortana 및 타임라인에 표시됩니다. 타임라인에 활동이 표시되면 어댑티브 카드 프레임워크를 사용하여 표시합니다. 각 활동에 적응형 카드를 제공하지 않으면 타임라인은 애플리케이션 이름 및 아이콘, 제목 필드 및 선택적 설명 필드를 기반으로 간단한 활동 카드를 자동으로 만듭니다. 다음은 적응형 카드 페이로드 및 해당 페이로드가 생성하는 카드의 예입니다.
]
적응형 카드(adaptive card) 페이로드 JSON 문자열 예시:
{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.0",
"backgroundImage": "https://winblogs.azureedge.net/win/2017/11/eb5d872c743f8f54b957ff3f5ef3066b.jpg",
"body": [
{
"type": "Container",
"items": [
{
"type": "TextBlock",
"text": "Windows Blog",
"weight": "bolder",
"size": "large",
"wrap": true,
"maxLines": 3
},
{
"type": "TextBlock",
"text": "Training Haiti’s radiologists: St. Louis doctor takes her teaching global",
"size": "default",
"wrap": true,
"maxLines": 3
}
]
}
]
}
적응형 카드의 페이로드를 JSON 문자열로 변환한 후 다음과 같이 UserActivity에 추가합니다.
activity.VisualElements.Content =
Windows.UI.Shell.AdaptiveCardBuilder.CreateAdaptiveCardFromJson(jsonCardText); // where jsonCardText is a JSON string that represents the card
플랫폼 간 및 서비스 간 통합
앱이 플랫폼 간(예: Android 및 iOS)을 실행하거나 클라우드에서 사용자 상태를 유지 관리하는 경우 Microsoft Graph통해 사용자 활동을 게시할 수 있습니다. 애플리케이션 또는 서비스가 Microsoft 계정으로 인증되면 위에서 설명한 것과 동일한 데이터를 사용하여 활동 및 기록 개체를 생성하기 위해 두 번의 간단한 REST 호출이 필요합니다.
요약
UserActivity API를 사용하여 타임라인 및 Cortana에 앱을 표시할 수 있습니다.
- UserActivity API 대해 자세히 알아보기
- 샘플 코드확인하세요.
- 더 정교한 적응형 카드를 확인하세요.
- iOS, Android 또는 웹 서비스에서 UserActivity를 Microsoft Graph를 통해 게시합니다.
- GitHub에서 Project Rome에 대해 자세히 알아보세요.
주요 API
관련 항목
- 사용자 활동(프로젝트 로마 문서)
- 적응형 카드
- 적응형 카드 시각화 도우미를 샘플
- URI 활성화 처리하기
- Microsoft Graph, 활동 피드 및 적응형 카드 사용하여 모든 플랫폼에서 고객과 소통
- Microsoft Graph