티스토리 뷰

반응형

윈도우 폰의 푸시 노티피케이션(Push Notifications)은 3가지가 존재하는데, 각각은 서로 장단점을 가지고 있으며, 필요에 따라서 다르게 사용해야 한다.  그 중 타일 노티피케이션(Tile Notifications)은 엡의 메인 타일에 글씨를 출력할 수 있는 것으로 MSDN의 자료들과 몇가지 테스트 해본 내용을 가지고 살펴 보도록 하자.

1. 일단 프로그램을 윈도 폰 에물레이터에 설치를 하고, 프로그램 목록에 가서 마우스로 쿡~찍고 있으면 pin to start라는 메뉴가 나타난다. 그 메뉴를 선택한다.


2. 그러면 시작화면에 프로그램의 Application Tile이 고정되어 있는 것을 확인 할 수 있다.


3. KakiSample 타일을 클릭해서 프로그램으로 들어 온 후에 하단에 + 버튼을 누른다. 그러면 Application Tile의 내용이 변경되어 있는 것을 확인할 수 있다. 이렇게 메인 타일의 내용을 변경 할 수 있으며, 응용하면 세컨드리 타일의 내용도 업데이트가 가능한다.


4. 어플리케이션타일이 변경된 모습


5. 첨부되어있는 ASP.Net 프로젝트를 실행 시킨다. 시작 페이지는 SendTile.aspx 이 화면은 윈도폰에게 타일 노티피케이션 메시지를 작성해서 전달할 페이지이다


6. 엡에서 사용되는 채널 주소를 복사해야한다. vs2010의 Output텝에 들어가서 스크롤 바를 위로 살짝 올리면 아래와 같이 주소를 찾을 수 있다. 그 주소를 복사한다.


7. 복사한 수로를 웹페이지의 Enter URI에 붙여 넣고 나머지 내용도 대충 넣구 맨아래 있는 Send Tile Notification 버튼을 클릭한다. 그러면 잠시 후에  Response에 잘 도착했는지에 대한 결과를 받을 수 있다.


8. 다시 에물레이터로 가서 전송 받은 내용을 확인해 보자


9. 더 자세한 사항은 아래 링크들을 참고 한다.

Push Notifications Overview for Windows Phone
http://msdn.microsoft.com/en-us/library/ff402558(v=VS.92).aspx

A Really Long Post About the Windows Phone 7 Push Notification System
http://www.thisisfanzoo.com/Blog/JeffF/archive/2010/08/02/a-really-long-post-about-the-windows-phone-7-push.aspx

10. MainPage.xaml.cs

using System;
using System.Linq;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Microsoft.Phone.Notification;
using System.Collections.ObjectModel;
using System.Collections.Generic;

namespace WPSample1
{
    public partial class MainPage : PhoneApplicationPage
    {
        //생성자
        public MainPage()
        {
            //푸쉬 채널생성
            HttpNotificationChannel pushChannel;
            //푸쉬 채널이름 설정
            string channelName = "TileSampleChannel";

            InitializeComponent();

            //채널이름 찾아보기
            pushChannel = HttpNotificationChannel.Find(channelName);
            if (pushChannel == null)
            {
                //생성된 채널이 없으면 생성
                pushChannel = new HttpNotificationChannel(channelName);
                //채널정보 업데이트시 이벤트 연결
                pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(pushChannel_ChannelUriUpdated);
                //채널 오류 발생 이벤트 연결
                pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(pushChannel_ErrorOccurred);
                //채널 열기
                pushChannel.Open();
            }
            else
            {  
                //채널 업데이트 이벤트 연결
                pushChannel.ChannelUriUpdated +=new EventHandler<NotificationChannelUriEventArgs>(pushChannel_ChannelUriUpdated);
                //채널 오류 발생 이벤트 연결
                pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(pushChannel_ErrorOccurred);
                //채널 Uri정보 조회
                System.Diagnostics.Debug.WriteLine("[ChannelUri] " + pushChannel.ChannelUri.ToString());
            }

            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("MainPage_Loaded");
        }

        void pushChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
        {
            //발생된 에러 메시지 조회
            Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show(String.Format("푸쉬 노티피케이션 {0} 에러 발생.  {1} ({2}) {3}",
                                    e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData)
                                    );
            });
        }

        void pushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
        {
            Dispatcher.BeginInvoke(() =>
            {
                //sender를 푸시체널로 형변환하고
                HttpNotificationChannel pushChannel = sender as HttpNotificationChannel;
                //푸시체널을 어플리케이션타일과 바인딩
                pushChannel.BindToShellTile();

                //변경된 채널 Uri정보 디버그 창에 출력
                System.Diagnostics.Debug.WriteLine("[ChannelUri] " + e.ChannelUri.ToString());
            });
        }

        //하단 툴박스 클릭 이벤트 처리
        private void ApplicationBarIconButton_Click(object sender, System.EventArgs e)
        {
            ApplicationBarIconButton btn = sender as ApplicationBarIconButton;
            if (btn != null)
            {
                //ApplicationTile 가져오기
                var shellTile = ShellTile.ActiveTiles.FirstOrDefault();

                //SecondaryTile 가져오기
                //var shellTile = ShellTile.ActiveTiles
                //    .FirstOrDefault(p => p.NavigationUri.ToString().Contains("MainPage.xaml"));

                //버튼 텍스트를 가지구 어떤 버튼인지 확인
                switch (btn.Text)
                {
                    case "Pin":
                        //SecondaryTile 새로 만들때 사용했던 부분
                        if (shellTile == null)
                        {
                            var tileData = new StandardTileData
                            {
                                Title = "Sample1",
                                Count = 1,
                                BackgroundImage = new Uri("/icons/appbar.sleep.png", UriKind.Relative),
                                BackTitle = "Back Sample1",
                                BackContent = "Back Content",
                                BackBackgroundImage = new Uri("/icons/appbar.sleep.dark.png", UriKind.Relative)
                            };
                            ShellTile.Create(new Uri("/MainPage.xaml", UriKind.Relative), tileData);

                            MessageBox.Show("Pin 작업을 완료했습니다.");
                        }
                        else
                        {
                            //ApplicationTile 업데이트 데이터 생성
                            var tileUpdate = new StandardTileData
                            {
                                Title = "AppTile",
                                Count = 1,
                                BackgroundImage = new Uri("/icons/appbar.sleep.png", UriKind.Relative),
                                BackTitle = "Back AppTile",
                                BackContent = "Back Content",
                                BackBackgroundImage = new Uri("/icons/appbar.sleep.dark.png", UriKind.Relative)
                            };
                            shellTile.Update(tileUpdate);

                            MessageBox.Show("ApplicationTile의 내용을 업데이트 했습니다~");
                        }
                        break;
                    case "Unpin":
                        //지금은 ApplicationTile을 가지고 놀고 있기 때문에 삭제 못함
                        //Unpin버튼이라면 타일이 존재하는 경우에 타일 제거
                        //if (shellTile != null)
                        //{
                        //    shellTile.Delete();
                        //    MessageBox.Show("UnPin 작업을 완료했습니다.");
                        //}
                        break;
                }
            }
        }
    }
}

10. 이런저런 테스트를 해봤는데..Tile Notification은 메인 타일로 바로 업데이트가 되기 때문에 중간에 어떤 노티피케이션이 날라왔는지 확인을 할 수 없는 듯하다..아마도, 메인 타일에 뭔가가 떠있으면 그 타일을 누를거구 누르면 MainPage_Loaded이벤트가 발생하니 그 이벤트에서 먼가 처리하는 것을 넣어 주면 될것 같다. 하지만..그래도 뭔가 날라왔는데..뭐가 날라온것인지 모른다는 건 좀 찝찝하다..그래서 추가적으로 토스트 노티피케이션과 Raw 노티피케이션도 알아보도록 하겠다.

 

wpsample1_3회차.zip
다운로드

반응형

'Previous Platforms' 카테고리의 다른 글

BusInfo for Windows8 Metro UI  (0) 2012.01.19
Seoul Bus Info Search App Dev 8  (0) 2012.01.08
Tile create  (0) 2012.01.07
Basic sample  (0) 2012.01.07
Twitter Client Lecture(강좌 목록) by Silverlight 5  (0) 2012.01.05
댓글