티스토리 뷰

Previous Platforms

Self Raw Notification

kaki104 2012. 2. 6. 12:20
반응형

윈도우 폰에는 Push Notification이란 서비스가 존재 한다. 혹시, 이 부분에 대해서 잘 모른다면, 여러 자료들을 찾아서 보면 쉽게 이해할 수 있을 것이다. 그런데, 대부분의 예제나 사용하는 것들을 보면 윈도우 폰에서 서버로 채널 Uri를 보내고, 서버에서 MPNS 서버로 Push Notification을 신청을 하는 구조로만 설명이 되어 있다. 왜 윈도우 폰에서 다른 윈도우 폰에게 바로 보낼 수 없을까? 라는 의문을 가지고 시작한 작업이고, 결과는 성공이다.
일단, 이 예제는 자기 자신한테 Push Notification을 보내는 예제이다. 하지만, 다른 윈도우 폰의 channel uri만 알고 있으면 다른 윈도우 폰으로 직접 메세지를 보낼 수 있다.

1. MainPage.xaml

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel>
        <TextBlock Text="Input other Uri"/>
        <TextBox x:Name="uri" />
        <TextBlock Text="Send Message"/>
        <TextBox x:Name="tbMessage"/>
        <Button Content="Send Message" Click="Button_Click" />
        <TextBlock Text="Response"/>
        <TextBlock x:Name="tbResponse"/>
        <TextBlock Text="Receive Message"/>
        <TextBlock Name="Receive"/>
    </StackPanel>
</Grid>

2. MainPage.xaml.cs

채널 만드는 부분은 직접 소스를 보기 바란다. 여기서는 Push Notification 작업을 윈도우 폰에서 하는 부분만을 적어 보겠다.

//Self Raw Notification Send
private void SendRawNotification()
{
    uri.Text = channelUri;
    Uri sendUri = new Uri(uri.Text, UriKind.Absolute);

    //Request 생성
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sendUri);
    //POST로 지정
    request.Method = "POST";
    //뒤에 utf-8을 넣어 주어야 한글도 깨지지 않고 넘어감
    request.ContentType = "text/xml;charset=utf-8";
    //Raw Notification
    request.Headers["X-NotificationClass"] = "3";
   
    request.BeginGetRequestStream(new AsyncCallback(channelRequest), request);
}

//보내는 곳과 연결 하고
private void channelRequest(IAsyncResult asyncResult)
{
    Dispatcher.BeginInvoke(() =>
    {
        HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
        //몸통 만들고
        Stream body = request.EndGetRequestStream(asyncResult);
        //전송할 데이터 만들고
        byte[] contents = Encoding.UTF8.GetBytes(tbMessage.Text);
        //전송
        body.Write(contents, 0, contents.Length);
        body.Flush();
        body.Close();

        request.BeginGetResponse(new AsyncCallback(channelResponse), request);
    });
}

private void channelResponse(IAsyncResult asyncResult)
{
    string notificationStatus = "";
    string notificationChannelStatus = "";
    string deviceConnectionStatus = "";

    var request = (HttpWebRequest)asyncResult.AsyncState;
    var response = request.EndGetResponse(asyncResult);
    //전송 결과 뽑아내고
    notificationStatus = response.Headers["X-NotificationStatus"];
    notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
    deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];
    //표시해준다
    Dispatcher.BeginInvoke(() =>
    {
        tbResponse.Text = notificationStatus
                            + " " + notificationChannelStatus
                            + " " + deviceConnectionStatus;
    });
}

3. 결과 화면

4. 이제 윈도우 폰끼리 서로 Push Notification 을 주고 받으면서 놀아보자. ㅎ

RawNotification.zip
다운로드

반응형
댓글