정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 파일 및 URI 연결을 사용하여 앱 자동 실행

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1만

 

Windows Phone 8 의 파일 및 URI 연결을 사용하여 다른 앱이 특정 파일 형식이나 URI 스키마를 시작할 때 앱을 자동으로 시작할 수 있습니다. 실행 시, 파일(파일에 대한 참조) 또는 URI를 앱으로 보내는 데 딥 링크 URI가 사용됩니다. 또한 API를 시작하는 연결을 사용하여 같은 방법으로 다른 앱을 시작할 수도 있습니다. 이 항목에서는 파일 및 URI 연결과, 앱에서 이러한 연결을 사용하는 방법에 대해 설명합니다.

팁팁:

Windows Phone 8 에서는 Windows 8 처럼 LaunchFileAsync를 사용하여 파일을 시작하고, LaunchUriAsync를 사용하여 URI를 시작합니다. 하지만 Windows Phone XAML 앱이 파일이나 URI를 받는 방식은 다릅니다. 또한 Windows Phone 에는 "기본" 스토어 앱이 없습니다. 특정 파일이나 URI 연결을 처리할 수 있는 스토어 앱이 여러 개 설치되어 있다면 사용자는 메뉴에서 받는 앱을 선택하게 됩니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

파일 연결을 사용하면 사용자가 특정 파일을 열고자 할 때 앱이 자동으로 시작할 수 있습니다. 이 파일의 소스는 다음 항목을 포함하되, 여기에 제한되지는 않고 다양할 수 있습니다.

  • 이메일 첨부 파일

  • Internet Explorer를 통한 웹 사이트

  • NFC(근거리 통신) 태그

  • 스토어 의 다른 앱

또한 파일 연결은 앱이 외부 저장소 API를 사용하여 SD 카드에서 읽을 수 있는 파일 형식을 결정하는 데도 사용됩니다. 이러한 API에 대한 자세한 내용은 Windows Phone 8의 데이터를 참조하세요.

파일 연결을 위한 등록

특정 파일 형식을 처리하려면 앱 매니페스트 파일에서 파일 연결을 등록하세요. 앱이 처리할 수 있는 모든 파일 연결을 지정할 수 있습니다. 하지만 기본 제공 앱에서 예약한 파일 연결은 무시됩니다. 자세한 내용은 Windows Phone 8의 예약된 파일 및 URI 연결을 참조하세요.

참고참고:

경우에 따라 Internet Explorer에서 파일 연결을 재정의합니다. 즉, 기본 제공 미디어 플레이어를 시작하여 모든 음악 및 동영상 파일 형식을 처리합니다. 특히 audio/ 또는 video/ 콘텐츠 형식이 있는 모든 파일을 처리합니다. 예를 들어 앱은 이메일 첨부 파일에서 시작될 때 예약되지 않은 음악 및 동영상 파일을 처리할 수 있습니다. 그러나 동일한 파일이 Internet Explorer에서 시작되면 기본 제공 미디어 플레이어에서 파일을 처리합니다.

기본 제공 앱에 표시되는 사용자 지정 파일 형식이 “통합된” 모습으로 표시되게 하기 위해 파일 옆에 표시할 로고(이미지 파일)를 제공하는 옵션이 있습니다. 예를 들어 파일(사용자 지정 형식의)이 이메일 메시지에 첨부되는 경우 첨부 파일이 다운로드된 후 작은 로고가 첨부 파일 옆에 표시됩니다.

파일 형식 로고는 흰색 배경 위에 나타나므로 앱을 테스트할 때 로고가 휴대폰에 나타나는 방식을 검토해야 합니다. 또한 둘 이상의 앱에서 동일한 파일 형식을 등록하면 로고가 표시되지 않습니다. 이런 경우 일반 로고가 사용됩니다. 다음 표에는 각 파일 연결을 위해 제공할 수 있는 세 가지 이미지 크기가 나와 있습니다.

로고 크기

용도

크기

소형

이메일 첨부 파일

33x33픽셀

중간

Office 허브 목록 뷰

69x69픽셀

대형

브라우저 다운로드

176x176픽셀

팁팁:

모범 사례로서, 로고는 앱 패키지의 Assets 폴더에 저장하는 것이 좋습니다.

파일 연결을 등록하려면 XML(텍스트) 편집기를 사용하여 WMAppManifest.xml을 편집해야 합니다. 솔루션 탐색기에서 WMAppManifest.xml 파일을 마우스 오른쪽 버튼으로 클릭한 다음 연결 프로그램을 클릭합니다. 연결 프로그램 창에서 XML(텍스트) 편집기를 선택하고 확인을 클릭합니다.

앱 매니페스트 파일의 Extensions 요소에는 FileTypeAssociation 요소로 파일 연결이 지정되어 있습니다. Extensions 요소는 Tokens 요소 바로 다음에 나와야 합니다. 다음 예제에서는 “.sdkTest1” 및 “.sdkTest2””, 이 두 개의 서로 다른 파일 확장명을 처리할 수 있는 “Windows Phone SDK 테스트 파일 형식”이라는 허구의 파일 형식에 대한 파일 연결을 보여 줍니다.

<Extensions>
   <FileTypeAssociation Name="Windows Phone SDK test file type" TaskID="_default" NavUriFragment="fileToken=%s">
       <Logos>
           <Logo Size="small" IsRelative="true">Assets/sdk-small-33x33.png</Logo>
           <Logo Size="medium" IsRelative="true">Assets/sdk-medium-69x69.png</Logo>
           <Logo Size="large" IsRelative="true">Assets/sdk-large-176x176.png</Logo>
       </Logos>
       <SupportedFileTypes>
         <FileType ContentType="application/sdk">.sdkTest1</FileType>
         <FileType ContentType="application/sdk">.sdkTest2</FileType>

       </SupportedFileTypes>
   </FileTypeAssociation>
</Extensions>

다음 표에서는 이 요소들을 각각 설명합니다.

요소

부모 요소

설명

Extensions

App

Tokens 요소 다음에 나와야 합니다.

FileTypeAssociation

Extensions

파일 연결을 설명합니다. 최대 20개의 파일 연결을 등록할 수 있지만 각 파일 연결은 한 번씩만 나열됩니다. Name 특성은 필수지만 이름은 자신이 원하는 대로 선택할 수 있습니다. 표시된 것처럼 TaskIDNavUriFragment 요소를 지정하세요.

Logos

FileTypeAssociation

파일 연결에 사용하는 모든 로고를 나열합니다. 이것은 지정된 로고가 없을 경우 선택 사항입니다.

Logo

Logos

선택 요소입니다. 파일 옆에 나타나는 이미지 파일을 나열합니다. 크기를 제공할 경우 모든 크기(소형, 중형, 대형)를 제공해야 합니다. IsRelative 특성이 있어야 하며 true와 같아야 합니다.

SupportedFileTypes

FileTypeAssociation

파일 형식과 관련된 모든 파일 확장명을 나열합니다.

FileType

SupportedFileTypes

마침표(‘.’)를 포함하여 파일 형식과 관련된 파일 확장명을 나열합니다. 각 파일 연결과 최대 20개의 파일 확장명을 연결할 수 있지만 각 확장명은 한 번씩만 나열됩니다. 앱이 SD 카드에서 파일을 읽는 경우 ContentType 특성도 지정하여 파일의 형식을 설명해야 합니다.

파일 시작 수신

특정 파일 형식을 처리하기 위해 앱이 시작되면 사용자에게 앱을 표시하기 위해 딥 링크 URI가 사용됩니다. URI 내에서 FileTypeAssociation 문자열은 URI의 소스가 파일 연결이고 fileToken 매개 변수에 파일 토큰이 들어 있음을 나타냅니다. 예를 들어 다음 코드는 파일 연결의 딥 링크 URI를 보여 줍니다.


/FileTypeAssociation?fileToken=89819279-4fe0-4531-9f57-d633f0949a19

시작 시 들어오는 딥 링크 URI를 파일을 처리할 수 있는 앱 페이지에 매핑하세요. 여러 파일 형식을 처리하기 위한 페이지가 여러 개 있으면 URI를 매핑하기 전에 사용자 지정 URI 매퍼 및 GetSharedFileName 메서드를 사용하여 파일 형식을 확인하세요. 예를 들어 다음 코드는 딥 링크 URI의 구문을 분석하고, 파일 형식에 따라 다른 페이지를 매핑하는 URI 매퍼를 보여 줍니다. 앱 시작이 파일 연결로 인한 것이 아닐 경우에는 전체 URI 문자열은 다시 변경되지 않은 상태의 App 개체로 보내집니다.

using System;
using System.IO;
using System.Windows.Navigation;
using Windows.Phone.Storage.SharedAccess;

namespace sdkAutoLaunch
{
    class AssociationUriMapper : UriMapperBase
    {
        private string tempUri;

        public override Uri MapUri(Uri uri)
        {
            tempUri = uri.ToString();

            // File association launch
            if (tempUri.Contains("/FileTypeAssociation"))
            {
                // Get the file ID (after "fileToken=").
                int fileIDIndex = tempUri.IndexOf("fileToken=") + 10;
                string fileID = tempUri.Substring(fileIDIndex);

                // Get the file name.
                string incomingFileName =
                    SharedStorageAccessManager.GetSharedFileName(fileID);

                // Get the file extension.
                string incomingFileType = Path.GetExtension(incomingFileName);

                // Map the .sdkTest1 and .sdkTest2 files to different pages.
                switch (incomingFileType)
                {
                    case ".sdkTest1":
                        return new Uri("/sdkTest1Page.xaml?fileToken=" + fileID, UriKind.Relative);
                    case ".sdkTest2":
                        return new Uri("/sdkTest2Page.xaml?fileToken=" + fileID, UriKind.Relative);
                    default:
                        return new Uri("/MainPage.xaml", UriKind.Relative);
                }
            }
            // Otherwise perform normal launch.
            return uri;
        }
    }
}

앱에서 이 같은 URI 매퍼 클래스를 사용하려면 이 클래스를 App.xaml.cs 파일의 앱 프레임에 할당하세요. InitializePhoneApplication 메서드에서 RootFrame.Navigated가 할당된 직후 RootFrame.UriMapper 속성을 URI 매퍼 클래스와 동일하게 설정하세요. 다음 예제에서는 AssociationUriMapper 클래스가 프레임의 UriMapper 속성에 할당됩니다.

private void InitializePhoneApplication()
{
    if (phoneApplicationInitialized)
        return;

    // Create the frame but don't set it as RootVisual yet; this allows the splash
    // screen to remain active until the application is ready to render.
    RootFrame = new PhoneApplicationFrame();
    RootFrame.Navigated += CompleteInitializePhoneApplication;

    // Assign the URI-mapper class to the application frame.
    RootFrame.UriMapper = new AssociationUriMapper();

    // Handle navigation failures
    RootFrame.NavigationFailed += RootFrame_NavigationFailed;

    // Ensure we don't initialize again
    phoneApplicationInitialized = true;
}

앱이 시작되면 초기화 동안 URI 매퍼를 할당합니다. 임의의 페이지를 시작하기 전에 앱은 URI 매퍼의 MapUri 메서드를 호출하여 시작할 페이지를 결정합니다. URI 매퍼가 반환하는 URI는 앱이 시작하는 페이지입니다.

실행된 페이지는 페이지 NavigationContext 개체의 QueryString 속성을 사용하여 페이지를 실행한 URI의 모든 매개 변수에 액세스할 수 있습니다. 예를 들어 다음 코드는 모든 URI 매개 변수 및 값을 IDictionary 개체에 넣습니다.


// Get a dictionary of URI parameters and values.
IDictionary<string, string> queryStrings = this.NavigationContext.QueryString;

파일 검색

딥 링크 URI의 파일 토큰을 가져온 후 Windows.Phone.Storage.SharedAccess 네임스페이스에서 SharedStorageAccessManager 정적 클래스를 사용하여 파일에 액세스합니다. SharedStorageAccessManager에서는 다음 메서드를 제공합니다.

메서드

반환 형식

설명

GetSharedFileName

System.String

파일 확장명을 포함한 파일 이름을 반환합니다.

CopySharedFileAsync

Windows.Storage.StorageFile

파일을 지정된 위치로 복사하고 복사본을 반환합니다.

파일 시작

앞에서 언급한 것처럼 앱은 파일을 시작할 수도 있으므로 다른 앱이 이 파일을 열 수 있습니다. 이렇게 하려면 Windows.System 네임스페이스의 Launcher 개체에서 LaunchFileAsync 메서드를 사용하세요. 예를 들어 다음 코드는 로컬 저장소에서 허구의 Contoso 버그 쿼리를 시작합니다.


private async void LaunchFileButton_Click(object sender, RoutedEventArgs rea)
{

    // Access isolated storage.
    StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;

    // Access the bug query file.
    StorageFile bqfile = await local.GetFileAsync("file1.bqy");

    // Launch the bug query file.
    Windows.System.Launcher.LaunchFileAsync(bqfile);

}

URI 연결을 사용하면 앱이 다른 앱에 의한 특수 URI 시작 시 자동으로 시작됩니다. 해당 URI를 특별하게 만드는 것은 앱이 등록한 URI 스키마 이름으로 시작한다는 것입니다. URI 스키마 이름은 콜론(‘:’) 바로 앞에 오는 URI의 일부입니다. URI 스키마에는 URI 스키마 이름과, 콜론 다음에 오는 모든 URI가 포함됩니다. 예를 들어 다음 URI 스키마에서 contoso는 URI 스키마 이름입니다.

contoso:ShowProducts?CategoryID=aea6ae1f-9894-404e-8bca-ec47ec5b9c6c

콜론 다음의 나머지 URI 부분은 URI 연결을 사용하는 방법에 상관없이 공개됩니다. 앱이 시작되면 앱은 URI를 조사할 기회를 가지게 되고 URI 내에 있는 내용을 기반으로 다르게 동작합니다. 이 예제에서 받는 앱은 특정 카테고리 내에 모든 제품을 표시하도록 지정되었습니다.

팁팁:

고유한 앱 시작에만 관심이 있는 경우 Windows.Phone.Management.Deployment 네임스페이스의 API를 사용합니다. 이 API를 사용하여 게시한 다른 앱을 확인한 다음 설치된 경우 시작할 수 있습니다. 자세한 내용은 Windows Phone 8의 시작, 다시 시작 및 멀티태스킹을 참조하세요.

URI 연결을 위한 등록

URI 연결을 처리하려면 앱 매니페스트 파일 WMAppManifest.xml에서 해당 URI 스키마 이름을 지정하세요. URI 스키마 이름은 문자와 숫자의 조합일 수 있지만 기본 제공 앱이 예약한 URI 스키마 이름은 무시됩니다. 자세한 내용은 Windows Phone 8의 예약된 파일 및 URI 연결을 참조하세요.

URI 연결을 등록하려면 XML(텍스트) 편집기를 사용하여 WMAppManifest.xml을 편집해야 합니다. 솔루션 탐색기에서 WMAppManifest.xml 파일을 마우스 오른쪽 버튼으로 클릭한 다음 연결 프로그램을 클릭합니다. 연결 프로그램 창에서 XML(텍스트) 편집기를 선택하고 확인을 클릭합니다.

앱 매니페스트 파일의 Extensions 요소에는 Protocol 요소로 URI 연결이 지정되어 있습니다. Extensions 요소는 Tokens 요소 바로 다음에 나와야 합니다. 각 앱에서는 최대 10개의 URI 연결을 등록할 수 있습니다. 다음 예제에서는 contoso URI 스키마 이름을 처리하는 허구의 앱에 대한 URI 연결을 보여 줍니다.


<Extensions>
  <Protocol Name="contoso" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" />
</Extensions>

Protocol 요소는 다음 특성들로 이루어져 있습니다.

특성

설명

이름

사용자 지정 URI 스키마의 접두사입니다. 숫자, 소문자, 마침표('.') 또는 하이픈('-')을 포함하는 2자에서 39자 사이의 문자열입니다. URI에서 콜론(':')이나 그 다음에 나오는 그 밖의 문자는 포함하지 않습니다.

NavUriFragment

항상 encodedLaunchUri=%s이어야 합니다.

TaskID

항상 _default이어야 합니다.

URI 수신

URI 연결을 처리하기 위해 앱이 자동으로 시작되면 딥 링크 URI를 사용하여 사용자에게 앱을 표시합니다. URI 내에서 Protocol 문자열은 URI의 소스가 URI 연결임을 나타냅니다. encodedLaunchuri라는 URI 매개 변수는 원래의 앱에서 보낸 전체 URI 스키마의 URI 인코딩 버전과 같습니다. 예를 들어 다음 코드는 이 허구의 앱이 contoso URI 연결의 결과로서 시작되면 인식하게 되는 실행 URI를 보여 줍니다.


/Protocol?encodedLaunchUri=contoso%3AShowProducts%3FCategoryID%3Daea6ae1f-9894-404e-8bca-ec47ec5b9c6c

중요중요:

실행 앱의 URI 스키마에 있는 모든 예약된 문자는 자동으로 백분율 인코딩됩니다. 예를 들어 한 앱이 URI “contoso:NewProducts”를 시작하면 다른 앱이 딥 링크 URI “/Protocol?encodedLaunchUri=contoso%3ANewProducts”를 받게 됩니다.

시작 시 들어오는 딥 링크 URI를 URI 연결을 처리할 수 있는 앱 페이지에 매핑하세요. 다음 예제에서는 ShowProducts.xaml 페이지를 사용하여 Contoso “제품 표시” 요청을 매핑하는 사용자 지정 URI 매퍼를 보여 줍니다. contoso URI 스키마 이름이 사용되지 않으면 전체 URI는 MainPage.xaml 페이지로 보내집니다.

using System;
using System.Windows.Navigation;

namespace sdkAutoLaunch
{
    class AssociationUriMapper : UriMapperBase
    {
        private string tempUri;

        public override Uri MapUri(Uri uri)
        {
            tempUri = System.Net.HttpUtility.UrlDecode(uri.ToString());

            // URI association launch for contoso.
            if (tempUri.Contains("contoso:ShowProducts?CategoryID="))
            {
                // Get the category ID (after "CategoryID=").
                int categoryIdIndex = tempUri.IndexOf("CategoryID=") + 11;
                string categoryId = tempUri.Substring(categoryIdIndex);

                // Map the show products request to ShowProducts.xaml
                return new Uri("/ShowProducts.xaml?CategoryID=" + categoryId, UriKind.Relative);
            }

            // Otherwise perform normal launch.
            return uri;
            }
        }
}

앱에서 이것과 같은 URI 매퍼 클래스를 사용하려면 이 클래스를 App.xaml.cs 파일의 앱 프레임에 할당하세요. InitializePhoneApplication 메서드에서 RootFrame.Navigated가 할당된 직후 RootFrame.UriMapper 속성을 URI 매퍼 클래스와 동일하게 할당하세요. 다음 예제에서는 AssociationUriMapper 클래스가 프레임의 UriMapper 속성에 할당됩니다.

private void InitializePhoneApplication()
{
    if (phoneApplicationInitialized)
        return;

    // Create the frame but don't set it as RootVisual yet; this allows the splash
    // screen to remain active until the application is ready to render.
    RootFrame = new PhoneApplicationFrame();
    RootFrame.Navigated += CompleteInitializePhoneApplication;

    // Assign the URI-mapper class to the application frame.
    RootFrame.UriMapper = new AssociationUriMapper();

    // Handle navigation failures
    RootFrame.NavigationFailed += RootFrame_NavigationFailed;

    // Ensure we don't initialize again
    phoneApplicationInitialized = true;
}

앱이 시작되면 초기화 동안 URI 매퍼를 할당합니다. 임의의 페이지를 시작하기 전에 앱은 URI 매퍼의 MapUri 메서드를 호출하여 시작할 페이지를 결정합니다. URI 매퍼가 반환하는 URI는 앱이 시작하는 페이지입니다.

실행된 페이지는 페이지 NavigationContext 개체의 QueryString 속성을 사용하여 페이지를 실행한 URI의 모든 매개 변수에 액세스할 수 있습니다. 예를 들어 다음 코드는 모든 URI 매개 변수 및 값을 IDictionary 개체에 넣습니다.


// Get a dictionary of URI parameters and values.
IDictionary<string, string> queryStrings = this.NavigationContext.QueryString;

URI 시작

앱은 API를 시작하는 연결을 사용하여 사용자 지정 URI를 시작함으로써 다른 앱을 자동으로 시작할 수 있습니다. 이렇게 하려면 Windows.System 네임스페이스의 Launcher 개체에서 Launcher.LaunchUriAsync(Uri) 메서드를 사용하세요. 예를 들어 다음 코드는 허구의 Contoso 앱을 시작하여 새 제품을 표시합니다.


private async void LaunchContosoNewProductsButton_Click(object sender, RoutedEventArgs rea)
{
    // Launch URI.
    Windows.System.Launcher.LaunchUriAsync(new System.Uri("contoso:NewProducts"));
}

URI가 URI 연결이 있는 받는 앱으로 전달되면 시작된 URI의 모든 예약된 문자가 자동으로 백분율 인코딩됩니다. 예를 들어 한 앱이 URI “contoso:NewProducts”를 시작하면 다른 앱이 딥 링크 URI “/Protocol?encodedLaunchUri=contoso%3ANewProducts”를 받게 됩니다.

근거리 컴퓨터 연결을 사용한 URI 실행

Windows Phone 8 에서는 NFC(Near Field Communication)를 사용하는 근거리 컴퓨터 연결 통신을 지원합니다. 근접 센서 API를 사용하여 다른 휴대폰에서 다른 앱을 실행할 수 있습니다. 다른 휴대폰이 Windows Phone 8 단말기이고 NFC를 지원하는 경우 다른 휴대폰은 로컬로 실행한 URI와 같은 방법으로 URI 연결을 처리하게 됩니다. 앱에서의 근거리 컴퓨터 연결 사용에 대한 자세한 내용은 Windows Phone 8의 근접성을 참조하세요.

ProximityDevice device = ProximityDevice.GetDefault();

// Make sure NFC is supported
if (device != null)
{
    long Id = device.PublishUriMessage(new System.Uri("contoso:NewProducts"));
    Debug.WriteLine("Published Message. ID is {0}", Id);

    // Store the unique message Id so that it 
    // can be used to stop publishing this message
}

사용자가 앱에서 파일 또는 URI를 시작하면 다음으로 일어나는 일은 휴대폰에 설치된 앱에 따라 다릅니다. 휴대폰에 해당 특정 파일 또는 URI 연결을 처리할 수 있는 앱이 없는 경우 사용자는 처리하는 앱을 얻을 수 있는 옵션을 가지게 됩니다.

특정 파일 또는 URI 연결을 등록한 휴대폰에 오직 하나의 앱만 있으면 이 앱은 사용자가 열기를 원할 때 자동으로 시작됩니다. 사용자에게 파일 또는 URI 연결을 등록한 휴대폰에 두 개 이상의 앱이 있으면 이 앱은 사용자가 어느 앱을 사용하기를 원하는지 묻게 됩니다.

팁팁:

파일 또는 URI 연결과 관련한 유용한 작업을 수행할 수 있는 것이 아니라면 파일 또는 URI 연결을 등록하지 마세요. 앱으로 인해 앱 메뉴가 자주 표시되는 경우 사용자는 항상 선택해야 하는 상황을 피할 수 있도록 완전히 제거할 수 있습니다.

표시: