Live ConnectでWindows Liveと繋がる(1)

Posted by 技術ブログ by Strawhat.net on Monday, December 12, 2011

Windows PhoneのMangoから、Windows Liveを始めとしたクラウドと同期した情報の1つであるカレンダーのイベント情報やアドレス帳の連絡先情報にアクセスできるようになりました。例えば、イベント情報の場合、Microsoft.Phone.UserData.Appointmentsクラスを使って以下のようにアクセスします。

#!C#
Appointments app = new Appointments();
Observable.FromEventPattern<AppointmentsSearchEventArgs>(app, "SearchCompleted")
    .ObserveOnDispatcher()
    .Do(p => {
        var query = p.EventArgs.Results
            .OrderBy(key => key.StartTime)
            .Select(data => new AppointmentData
        {
            Subject = data.Subject,
            IsAllDayString = data.IsAllDayEvent.ToString(),
            StartDatetimeString = data.StartTime.ToString("yyyy/MM/dd HH:mm:ss"),
        });
        this.AppointmentList = new ObservableCollection<AppointmentData>(query);
    })
    .Subscribe();

DateTime start = new DateTime(2011, 1, 1);
DateTime end = new DateTime(2011, 12, 31);
app.SearchAsync(start, end, "Search1");

しかし、現時点ではこれらの情報はRead-Onlyで、アプリから追加・更新・削除することができません。

これ以外にも、Picturesハブ・Officeハブが連携するSkyDriveの公式APIがこれまで提供されていなく、 WPアプリがSkyDriveと連携するには3rdパーティによるライブラリを利用するしかありませんでした。 このようにWPアプリからWindows Liveの情報(カレンダーやアドレス帳のデータ元はLiveだけでは ありませんが)にアクセスする手段に制約がありました。

ところが、2011年9月13日に開催された//build/において、 それまで”Windows Live Messenger Connect”と呼ばれていたAPIが “Live Connect"と改称され、Windows LiveにアクセスするAPIが拡充されました。

現時点でLive Connectでアクセス可能なWindows Liveのサービスと機能は以下の通りです。

  • SkyDrive: フォルダやドキュメント・アルバム・写真・ビデオファイルの作成・読み取り・更新・削除
  • Hotmail: カレンダーやそのイベント情報、およびアドレス帳のコンタクト情報の作成・読み取り・更新・削除
  • Messenger: IMの交換、プレゼンス情報の取得・取得
  • Live ID: 認証、ユーザプロファイルへのアクセス

Live ConnectはOAuth 2.0, REST, JSONのWeb標準技術でアクセスできるAPIですが、 Live SDKが提供されていて、そこにはWindows Phoneで利用できるManaged APIが含まれています。

例えば、Hotmailのカレンダーのイベント情報取得・追加は以下のように実現できます。

#!C#
private LiveConnectClient client;
// Sign-In処理は省略...
var observable = Observable.FromEventPattern<LiveOperationCompletedEventArgs>(
    client, "GetCompleted")
    .ObserveOnDispatcher()
    .Do(p =>
    {
        var data = (List<object>)p.EventArgs.Result["data"];
        var query = data.Cast<Dictionary<string, object>>()
            .Select(dict => new AppointmentData
            {
                Subject = dict["name"] as string,
                IsAllDayString = (bool)dict["is_all_day_event"] ? "True" : "False",
                StartDatetimeString = dict["start_time"] as string,
            });
 
        this.AppointmentList = new ObservableCollection<AppointmentData>(query);
    })
    .Subscribe();
client.GetAsync("me/events");

#!C#
private LiveConnectClient client;
// Sign-In処理は省略...
DateTime startDateTime = DateTime.Now;
DateTime endDateTime = DateTime.Now.AddDays(1);
 
var calEvent = new Dictionary<string, object>();
calEvent.Add("name", this.Name);
calEvent.Add("start_time", startDateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"));
calEvent.Add("end_time", endDateTime.ToString("yyyy-MM-ddTHH:mm:sszzz"));
calEvent.Add("description", this.Description);
 
var observable = Observable.FromEventPattern<LiveOperationCompletedEventArgs>(
    client, "PostCompleted")
    .ObserveOnDispatcher()
    .Do(p =>
    {
        if (p.EventArgs.Error == null)
        {
            // 成功時の処理
        }
        else
        {
            // エラー時の処理
        }
    })
    .Subscribe();

このように、“Live Connect"を使うことで、Windows Liveへの アクセスが比較的簡単なコードで実現できます。

次の記事からは、Live Connectを使うための準備作業から、 サービスの利用に必要な認可の方法、そして各サービスへのアクセスについて詳しく見ていきます。