다음을 통해 공유


ESim.Discover 메서드

정의

오버로드

Discover()

기본 SMDS 주소를 사용하여 eSIM 프로필 검색 작업을 수행합니다.

참고

이 기능은 모바일 네트워크 운영자가 권한 있는 액세스 권한을 부여한 통신사 앱 및 UWP 앱에서만 사용할 수 있습니다.

이 API를 사용하고 앱을 Microsoft Store에 게시하려면 사용자 지정 기능 Microsoft.eSIMManagement_8wekyb3d8bbwe 사용하도록 특별 승인을 요청해야 합니다. 자세한 내용은 사용자 지정 기능을 참조하세요.

Discover(String, String)

제공된 RSP 서버 주소 및 일치하는 ID에 대해 eSIM 프로필 검색 작업을 수행합니다.

참고

이 기능은 모바일 네트워크 운영자가 권한 있는 액세스 권한을 부여한 통신사 앱 및 UWP 앱에서만 사용할 수 있습니다.

이 API를 사용하고 앱을 Microsoft Store에 게시하려면 사용자 지정 기능 Microsoft.eSIMManagement_8wekyb3d8bbwe 사용하도록 특별 승인을 요청해야 합니다. 자세한 내용은 사용자 지정 기능을 참조하세요.

Discover()

기본 SMDS 주소를 사용하여 eSIM 프로필 검색 작업을 수행합니다.

참고

이 기능은 모바일 네트워크 운영자가 권한 있는 액세스 권한을 부여한 통신사 앱 및 UWP 앱에서만 사용할 수 있습니다.

이 API를 사용하고 앱을 Microsoft Store에 게시하려면 사용자 지정 기능 Microsoft.eSIMManagement_8wekyb3d8bbwe 사용하도록 특별 승인을 요청해야 합니다. 자세한 내용은 사용자 지정 기능을 참조하세요.

public:
 virtual ESimDiscoverResult ^ Discover() = Discover;
/// [Windows.Foundation.Metadata.Overload("Discover")]
ESimDiscoverResult Discover();
[Windows.Foundation.Metadata.Overload("Discover")]
public ESimDiscoverResult Discover();
function discover()
Public Function Discover () As ESimDiscoverResult

반환

작업 결과를 나타내는 ESimDiscoverResult 개체입니다.

특성

Windows 요구 사항

디바이스 패밀리
Windows 10, version 1903 (10.0.18362.0에서 도입되었습니다.)
API contract
Windows.Foundation.UniversalApiContract (v8.0에서 도입되었습니다.)
앱 기능
Microsoft.eSIMManagement_8wekyb3d8bbwe

예제

시나리오 1

지정된 SM-DP+ 주소와 일치하는 ID를 사용하여 프로필을 검색합니다. 통신사는 앱에 SMDP 주소(예: smdp.contoso.com 서버의 FQDN) 및 프로필을 찾는 MatchingID abcd1234 를 제공합니다. 클라이언트가 이미 ESimWatcher에서 ESim 개체를 얻었다고 가정합니다.

async void Scenario1_DiscoverWithSmdpAddress(ESim esim, String smdpAddress, String matchingId)
{
    ESimDiscoverResult discoverResult = await esim.DiscoverAsync(
        smdpAddress,
        matchingId);

    if (discoverResult.Result.Status != ESimOperationStatus.Success)
    {
        discoveryStatusBar.Text = GetDiscoveryResultString("Discover failed", discoverResult.Result.Status);
        return;
    }

    if (discoverResult.Kind == ESimDiscoverResultKind.ProfileMetadata )
    {
        ESimProfileMetadata profileMetadata = discoverResult.ProfileMetadata;
        ESimOperationResult result = await profileMetadata.ConfirmInstallAsync();
        if (result.Status != ESimOperationStatus.Success)
        {
            discoveryStatusBar.Text = GetDiscoveryResultString("Couldn't install profile", result.Status);
        }
        else
        {
            discoveryStatusBar.Text = "Success";
        }

    }
    else
    {
        // If an SMDP address is given, the app will expect a profile.
        discoveryStatusBar.Text = "Unexpected result from server";
    }
}

시나리오 2

서버 정보가 없는 프로필을 검색합니다. 통신사는 다운로드할 프로필에 대한 서버 정보를 제공하지 않습니다. 이 경우 앱은 검색 프로세스를 계속 시작할 수 있습니다. 앱은 eSIM에 사용 가능한 모든 프로필을 트래버스합니다. 이로 인해 eSIM에서 검색할 수 있는 프로필이 두 개 이상 있는 경우 통신사에 속하지 않는 프로필이 터치할 수 있습니다. 그러나 통신사의 정보가 없으면 사용할 수 있는 기술입니다.

async Task<bool> Scenario2_DiscoverProfile(ESim esim, String rspServerAddress, String matchingId)
{
    ESimDiscoverResult discoverResult = await esim.DiscoverAsync(
        rspServerAddress,
        matchingId);

    if (discoverResult.Result.Status != ESimOperationStatus.Success)
    {
        discoveryStatusBar.Text = GetDiscoveryResultString("Discover failed", discoverResult.Result.Status);
        return false;
    }

    if (discoverResult.Kind == ESimDiscoverResultKind.Events)
    {
        IList<ESimDiscoverEvent> discoveryEvents = discoverResult.Events;
        foreach (ESimDiscoverEvent discoverEvent in discoveryEvents)
        {
            // Recursively visit the server hops in event list.
            foundProfile = await Scenario2_DiscoverProfile(
                esim,
                discoverEvent.RspServerAddress,
                discoverEvent.MatchingId);

            if (foundProfile) break;
        }
    }
    else if (discoverResult.Kind == ESimDiscoverResultKind.ProfileMetadata)
    {
        ESimProfileMetadata profileMetadata = discoverResult.ProfileMetadata;

        // There can be multiple profiles waiting for download. In a general profile
        // discovery, the app may ask the user's consent for each profile (metadata). 
        bool okToInstall = await GetUserConsentForProfileDownload(profileMetadata);

        // OR ...
        // In the use case where the app is expecting a certain profile, the app may 
        // check the Id, ProviderName and ProviderId of the returned profile metadata 
        // to determine whether it is the expected profile.
        //
        // For example:
        // okToInstall = IsExpectedProfile(profileMetadata);

        if (okToInstall)
        {
            ESimOperationResult result = await profileMetadata.ConfirmInstallAsync();
            if (result.Status != ESimOperationStatus.Success)
            {
                discoveryStatusBar.Text = GetDiscoveryResultString("Couldn't install profile", result.Status);
            }

            // Regardless of installation result, the desired profile has been found.
            // Return early to avoid touching other profiles unnecessarily.
            return true;
        }
        else
        {
            ESimOperationResult result = await profileMetadata.PostponeInstallAsync();
            if (result.Status != ESimOperationStatus.Success)
            {
                // App can choose to ignore the result as this is to postpone 
                // installation. Error can be caused by a timeout or bad connection 
                // with the remote server. All these causes will effectively postpone
                // the install.
            }
        }
    }

    return false;
}

async void Scenario2_DiscoverWithDefault(ESim esim)
{
    await Scenario2_DiscoverProfile(esim, null, null);
}

시나리오 3

지정된 서버 주소 하위 접두사를 사용하여 프로필을 검색합니다. 통신사는 많은 프로필 서버를 호스트하지만 보안상의 이유로 프로필 서버 주소를 앱에 제공하는 것을 거부합니다. 앱은 도메인 이름이 로 끝나는 contoso.com서버에 저장된 프로필을 검사 합니다. 일부 논리는 시나리오 2의 논리와 동일합니다. 여기서 예제 코드는 함수 Scenario2_DiscoverProfile()를 호출합니다.

async void Scenario3_DiscoverProfileWithServerInfo(ESim esim, String serverDomainNameSubfix)
{
    ESimDiscoverResult discoverResult = await esim.DiscoverAsync();

    if (discoverResult.Result.Status != ESimOperationStatus.Success)
    {
        discoveryStatusBar.Text = GetDiscoveryResultString("Discover failed", discoverResult.Result.Status);
        return;
    }

    if (discoverResult.Kind == ESimDiscoverResultKind.Events)
    {
        IList<ESimDiscoverEvent> discoverEvents = discoverResult.Events;
        foreach (ESimDiscoverEvent discoverEvent in discoverEvents)
        {
            // Check if this is the expected event.
            if (discoverEvent.RspServerAddress.EndsWith(serverDomainNameSubfix))
            {
                bool foundProfile = await Scenario2_DiscoveryProfile(
                    esim,
                    discoverEvent.RspServerAddress,
                    discoverEvent.MatchingId);

                if (foundProfile) break;
            }
        }
    }
    else 
    {
        // The first discovery is guaranteed to return event list.
        discoveryStatusBar.Text = "Unexpected result from server";
    }

    return;
}

시나리오 4

사용 가능한 검색 결과를 미리 볼 수 있습니다. eSIM 유틸리티 앱은 사용자의 검색 결과 목록을 표시합니다. 사용자는 나중에 관심에 따라 다음 홉을 선택할 수 있습니다. 목록을 가져오기 위해 앱은 매개 변수 없이 검색 API를 호출합니다.

Task<IList<ESimDiscoverEvent>> void Scenario4_ReviewDiscoveryResults(ESim esim)
{
    ESimDiscoverResult discoverResult = await esim.DiscoverAsync();

    if (discoverResult.Result.Status != ESimOperationStatus.Success)
    {
        discoveryStatusBar.Text = GetDiscoveryResultString("Discover failed", discoverResult.Result.Status);

        return new List<ESimDiscoverResult>();
    }

    if (discoverResult.Kind == ESimDiscoverResultKind.Events)
    {
        return discoverResult.Events;
    }
    else
    {
        // The first discovery is guaranteed to return event list.
        discoveryStatusBar.Text = "Unexpected result from server";
    }

    return new List<ESimDiscoverResult>();
}

시나리오 5

동기화된 API 호출. 유틸리티 앱이 eSIM에 사용할 수 있는 검색 결과가 있는지 확인하려고 합니다. HasAvailableEventsToDiscover()라는 함수를 만듭니다. 앱의 스레드 풀에서 실행되도록 보장되며 결과를 동기적으로 반환하려고 합니다.

bool Scenario5_HasAvailableEventsToDiscover(ESim esim)
{
    ESimDiscoverResult discoverResult = esim.Discover();

    if (discoverResult.Result.Status != ESimOperationStatus.Success)
    {
        discoveryStatusBar.Text = GetDiscoveryResultString("Discover failed", discoverResult.Result.Status);
        return false;
    }

    // The discover result will always return the default SMDP+ address as
    // the first result so that it can be considered by the caller as one
    // possible profile source. Any more events in the list mean that the
    // discovery server has discovery events available.
    if (discoverResult.Kind == ESimDiscoverResultKind.Events
        && discoverResult.Count > 1)
    {
        return true;
    }

    return false;
}

설명

프로필 검색 작업에는 원격 서버에 연결해야 합니다. 해당 서버는 eSIM에서 주소가 미리 설정된 검색 서버 또는 MO(통신사)에서 제공하는 서버 주소일 수 있습니다. 서버는 다음 서버 홉의 정보를 포함하는 이벤트 목록을 반환하거나 프로필 메타데이터를 다운로드할 수 있습니다. 애플리케이션이 프로필 메타데이터를 가져오면 고유한 비즈니스 논리에 따라 프로필을 설치하거나 거부할 수 있습니다. 프로필 검색은 직렬입니다. 즉, 애플리케이션이 현재 프로필에 대한 설치 결정을 내릴 때까지 다른 프로필을 검색할 수 없습니다.

각 홉에 대해 애플리케이션이 홉을 방문하여 서버에서 반환되는 데이터 형식을 알아야 합니다. 그러나 프로필 메타데이터에는 다운로드 시간 제한이 있을 수 있습니다. 따라서 애플리케이션에 관심 있는 프로필이 있어야 하는 위치에 대한 힌트가 있는 경우 다른 프로필 메타데이터를 불필요하게 다운로드하지 않아야 합니다.

적용 대상

Discover(String, String)

제공된 RSP 서버 주소 및 일치하는 ID에 대해 eSIM 프로필 검색 작업을 수행합니다.

참고

이 기능은 모바일 네트워크 운영자가 권한 있는 액세스 권한을 부여한 통신사 앱 및 UWP 앱에서만 사용할 수 있습니다.

이 API를 사용하고 앱을 Microsoft Store에 게시하려면 사용자 지정 기능 Microsoft.eSIMManagement_8wekyb3d8bbwe 사용하도록 특별 승인을 요청해야 합니다. 자세한 내용은 사용자 지정 기능을 참조하세요.

public:
 virtual ESimDiscoverResult ^ Discover(Platform::String ^ serverAddress, Platform::String ^ matchingId) = Discover;
/// [Windows.Foundation.Metadata.Overload("DiscoverWithServerAddressAndMatchingId")]
ESimDiscoverResult Discover(winrt::hstring const& serverAddress, winrt::hstring const& matchingId);
[Windows.Foundation.Metadata.Overload("DiscoverWithServerAddressAndMatchingId")]
public ESimDiscoverResult Discover(string serverAddress, string matchingId);
function discover(serverAddress, matchingId)
Public Function Discover (serverAddress As String, matchingId As String) As ESimDiscoverResult

매개 변수

serverAddress
String

Platform::String

winrt::hstring

RSP 서버 주소를 포함하는 문자열입니다. 가 비어 있으면 serverAddress API는 기본 SMDS 주소를 사용합니다.

matchingId
String

Platform::String

winrt::hstring

일치하는 ID를 포함하는 문자열입니다.

반환

작업 결과를 나타내는 ESimDiscoverResult 개체입니다.

특성

Windows 요구 사항

디바이스 패밀리
Windows 10, version 1903 (10.0.18362.0에서 도입되었습니다.)
API contract
Windows.Foundation.UniversalApiContract (v8.0에서 도입되었습니다.)
앱 기능
Microsoft.eSIMManagement_8wekyb3d8bbwe

예제

코드 예제는 검색 을 참조하세요.

설명

자세한 내용은 검색 을 참조하세요.

적용 대상