앱 URI 처리기를 사용하여 웹 사이트에 대해 앱 활성화

웹 사이트용 앱은 앱을 웹 사이트와 연결하여 사용자가 웹 사이트 링크를 열면 브라우저가 열리지 않고 앱이 실행되도록 합니다. 앱이 설치되지 않은 경우 일반적으로 브라우저에 웹 사이트가 열립니다. 인증을 받은 콘텐츠 소유자만이 링크를 등록할 수 있으므로, 사용자는 이 환경을 신뢰할 수 있습니다. 사용자는 설정 > 앱 > 웹 사이트용 앱으로 이동하여 등록된 웹과 앱 연결을 모두 확인할 수 있습니다.

다음은 웹과 앱 연결을 사용하는 데 필요한 사항입니다.

  • 앱이 매니페스트 파일에서 처리할 URI 식별하기
  • 앱과 웹 사이트 간의 연결을 정의하는 JSON 파일입니다. 앱 매니페스트 선언과 같은 호스트 루트에 앱 패키지 패밀리 이름이 있습니다.
  • 앱에서 활성화를 처리하세요.

참고 항목

Windows 10 크리에이터스 업데이트부터는 Microsoft Edge 레거시에서 지원 대상 링크를 클릭하면 해당 앱이 시작됩니다. 다른 브라우저(예: Microsoft Edge 크롬, Internet Explorer 등)에서 지원 대상 링크를 클릭하면 검색 환경을 계속 이용할 수 있습니다.

앱은 처리할 웹사이트의 URI를 식별해야 합니다. 이렇게 하려면 Windows.appUriHandler 확장자 등록을 앱의 매니페스트 파일인 Package.appxmanifest에 추가하세요.

그 예로 웹사이트의 주소가 “msn.com”인 경우, 앱의 매니페스트에서 다음 항목을 생성하세요.

<Applications>
  <Application ... >
      ...
      <Extensions>
         <uap3:Extension Category="windows.appUriHandler">
          <uap3:AppUriHandler>
            <uap3:Host Name="msn.com" />
          </uap3:AppUriHandler>
        </uap3:Extension>
      </Extensions>
  </Application>
</Applications>

위 선언에서는 지정된 호스트의 링크를 처리하기 위해 앱을 등록합니다. 웹사이트의 주소(예: m.example.com, www.example.com, example.com)가 여러 개라면 각 주소의 <uap3:AppUriHandler> 내부에 별도의 <uap3:Host Name=... /> 항목을 추가하세요.

앱 및 웹사이트를 JSON 파일에 연결하기

원하는 앱으로만 웹사이트의 콘텐츠를 열 수 있게 하려면 웹 서버 루트 또는 도메인의 잘 알려진 디렉터리에 있는 JSON 파일에 담긴 앱의 패키지 제품군 이름을 입력하세요. 이는 해당 앱이 사이트에서 콘텐츠를 열 수 있도록 웹사이트가 동의한다는 것을 의미합니다. 패키지 제품군 이름은 앱 매니페스트 디자이너의 패키지 섹션에 있습니다.

Important

JSON 파일에는 .json 파일 접미사가 없어야 합니다.

이름이 windows-app-web-link인 JSON 파일(.json 파일 확장자 없음)을 생성하고 앱의 패키지 제품군 이름을 입력하세요. 예시:

[{
  "packageFamilyName" : "Your app's package family name, e.g MyApp_9jmtgj1pbbz6e",
  "paths" : [ "*" ],
  "excludePaths" : [ "/news/*", "/blog/*" ]
 }]

Windows는 웹사이트에 https를 연결하고 웹 서버에서 해당 JSON 파일을 검색합니다.

와일드카드

위 JSON 파일 예제에서는 와일드카드 사용을 보여줍니다. 와일드카드를 사용하면 코드 행이 적은 링크를 다양하게 지원할 수 있습니다. 웹-앱 연결은 JSON 파일에 대해 두 가지 유형의 와일드카드를 지원합니다.

와일드카드 설명
* 모든 하위 문자열을 나타냅니다.
? 단일 문자를 나타냅니다.

예를 들어 위의 예제에서처럼 "excludePaths" : [ "/news/*", "/blog/*" ]를 지정하면 앱은 /news//blog/ 아래의 경로를 제외하고 웹 사이트의 주소(예: msn.com)로 시작하는 모든 경로를 지원합니다. 즉 msn.com/weather.html은 지원되지만 msn.com/news/topnews.html은 지원되지 않습니다.

다중 앱

웹사이트에 연결하려는 앱이 두 개인 경우, windows-app-web-link JSON 파일에 애플리케이션 패키지 제품군 이름 두 가지를 모두 입력하세요. 두 앱 모두 지원할 수 있습니다. 둘 다 설치되어 있다면 기본 링크로 선택할 수 있는 옵션이 사용자에게 표시됩니다. 나중에 기본 링크를 변경하려면 설정 및 웹 사이트용 앱에서 변경할 수 있습니다. 이외에도 개발자는 JSON 파일을 언제든지 변경하고, 빠르면 같은 날부터(단, 업데이트 후 8일 이내에) 변경 내용을 확인할 수 있습니다.

[{
  "packageFamilyName": "Your apps's package family name, e.g MyApp_9jmtgj1pbbz6e",
  "paths": [ "*" ],
  "excludePaths" : [ "/news/*", "/blog/*" ]
 },
 {
  "packageFamilyName": "Your second app's package family name, for example, MyApp2_8jmtgj2pbbz6e",
  "paths": [ "/example/*", "/links/*" ]
 }]

사용자에게 최상의 환경을 제공하려면 제외 경로를 사용해서 온라인 전용 콘텐츠가 JSON 파일의 지원 대상 경로에서 제외되게 하세요.

일치 항목이 있으면 제외 경로를 먼저 검사하고, 지정된 앱 대신 브라우저에서 해당 페이지가 열립니다. 위의 예제에서 ‘/news/*’(슬래시 없는 'news')에는 ‘newslocal/’, ‘newsinternational/’과 같이 ‘news*’ 아래의 모든 경로가 포함되고 그 경로 아래의 모든 페이지가 ‘/news*’에 포함됩니다.

앱의 Visual Studio 솔루션에 있는 App.xaml.cs로 이동한 다음, OnActivated()에서 연결된 콘텐츠에 대한 처리 기능을 추가하세요. 다음 예제에서는 URI 경로에 따라 앱에서 열리는 페이지가 달라집니다.

protected override void OnActivated(IActivatedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        ...
    }

    // Check ActivationKind, Parse URI, and Navigate user to content
    Type deepLinkPageType = typeof(MainPage);
    if (e.Kind == ActivationKind.Protocol)
    {
        var protocolArgs = (ProtocolActivatedEventArgs)e;        
        switch (protocolArgs.Uri.AbsolutePath)
        {
            case "/":
                break;
            case "/index.html":
                break;
            case "/sports.html":
                deepLinkPageType = typeof(SportsPage);
                break;
            case "/technology.html":
                deepLinkPageType = typeof(TechnologyPage);
                break;
            case "/business.html":
                deepLinkPageType = typeof(BusinessPage);
                break;
            case "/science.html":
                deepLinkPageType = typeof(SciencePage);
                break;
        }
    }

    if (rootFrame.Content == null)
    {
        // Default navigation
        rootFrame.Navigate(deepLinkPageType, e);
    }

    // Ensure the current window is active
    Window.Current.Activate();
}

중요 위 예제에 나온 대로 최종 if (rootFrame.Content == null) 논리를 rootFrame.Navigate(deepLinkPageType, e);(으)로 바꿔야 합니다.

테스트: 로컬 유효성 검사 도구

다음에서 사용할 수 있는 앱 호스트 등록 인증자 도구를 실행하면 앱 및 웹사이트의 구성을 테스트할 수 있습니다.

%windir%\system32\AppHostRegistrationVerifier.exe

다음 매개변수도 이 도구를 실행해서 앱 및 웹사이트의 구성을 테스트하세요.

AppHostRegistrationVerifier.exehostname packagefamilyname filepath

  • 호스트 이름: 웹 사이트(예: microsoft.com)
  • PFN(패키지 제품군 이름): 원하는 앱의 PFN
  • 파일 경로: 로컬 유효성 검사용 JSON 파일(예: C:\SomeFolder\windows-app-web-link)

도구에서 아무 것도 반환하지 않는 경우 해당 파일 업로드 시 유효성 검사가 이루어집니다. 오류 코드가 있는 경우 작동하지 않습니다.

다음 레지스트리 키를 사용하여 테스트용으로 로드된 앱에 대한 경로 일치를 로컬 유효성 검사의 일부로 강제 적용할 수 있습니다.

HKCU\Software\Classes\LocalSettings\Software\Microsoft\Windows\CurrentVersion\ AppModel\SystemAppData\YourApp\AppUriHandlers

키 이름: ForceValidation 값: 1

테스트: 웹 유효성 검사

링크를 클릭할 때 앱이 활성화되었는지 확인하려면 애플리케이션을 닫으세요. 그런 다음 웹사이트에서 지원 대상 경로 중 한 개의 주소를 복사하세요. 예를 들어 웹 사이트의 주소가 “msn.com”이고 지원 경로 중 하나가 “path1”이면 http://msn.com/path1을 사용합니다.

앱이 닫혔는지 확인하세요. Windows 키 + R을 눌러 실행 대화 상자를 열고 링크를 해당 창에 붙여 넣으세요. 웹 브라우저 대신 앱이 열립니다.

또한 LaunchUriAsync API를 사용해 다른 앱에서 해당 앱을 열어서 테스트할 수 있습니다. 이 API를 사용하면 휴대폰으로도 테스트할 수 있습니다.

프로토콜 활성화 논리를 따르려면 OnActivated 이벤트 처리기에서 중단점을 설정하세요.

AppUriHandlers 팁:

  • 앱에서 처리할 수 있는 링크만 지정해야 합니다.
  • 지원할 호스트를 모두 나열하세요. www.example.com과 example.com은 서로 다른 호스트입니다.
  • 사용자는 웹사이트를 처리할 때 선호하는 앱을 설정에서 선택할 수 있습니다.
  • JSON 파일은 https 서버에 업로드해야 합니다.
  • 지원하려는 경로를 변경해야 하는 경우, 앱을 다시 게시하지 않고도 JSON 파일을 다시 게시할 수 있습니다. 사용자는 1~8일 후에 변경 내용을 알게 됩니다.
  • AppUriHandlers를 사용하여 사이드로드된 모든 앱에는 설치 시 호스트에 대해 유효성 검사를 거친 링크가 있습니다. 기능을 테스트하기 위해 JSON 파일을 업로드할 필요는 없습니다.
  • 이 기능은 앱이 LaunchUriAsync로 시작된 UWP 앱이거나 ShellExecuteEx로 시작된 Windows 데스크톱 앱일 때마다 작동합니다. URL이 등록된 앱 URI 처리기에 해당한다면 브라우저 대신 앱이 시작됩니다.

참고 항목

웹-앱 예제 프로젝트windows.protocol registrationURI 활성화 처리연결 시작 샘플은 LaunchUriAsync() API 사용 방법을 보여 줍니다.