windows phoneアプリとネットサービスとの連携
DESCRIPTION
第1回まどべんよっかいち(2011/12/10)での発表スライドです。TRANSCRIPT
Windows Phoneアプリとネットサービスとの連携
Windows Phone勉強会@四日市第1回
2011/12/10
青木宣明 @kumar0001
Agenda
Windows Phoneはネットワークとの連携に主
眼が置かれています。電話機単体でできることもありますが、ネットワークサービスと連携することでできることが広がります
今回は、Windows Phoneアプリの外部連携の例として、Windows Liveにアクセスするライブラリである”Live Connect”を紹介します
目次
1. Windows Phoneと外部との連携
2. WPアプリと外部との連携
3. Live ConnectによるWindows Liveとの連携
1. Live IDによる認証・認可
2. Hotmail(カレンダー・アドレス帳)へのアクセス
3. SkyDriveへのアクセス
WINDOWS PHONEと外部との連携
Windows Phoneの外部連携
広い意味での連携=Windows Phoneが外部とやりとりするためのインターフェース
・GPS
・カメラ
通信(3G/Wi-fi)
センサー・加速度・近接・照度・地磁気・ジャイロスコープ・モーション
ハブ=クラウドとの連携
Windows Phoneは標準機能としてクラウドと連携する”ハブ”を提供している。
ハブ 機能
Music + Video 電話機の音楽・ビデオの再生。PCとの同期も。本来はコンテンツの購入もできる
People オンラインのアドレス帳、SNSのアカウント情報を一元的に管理。SNSの更新情報の表示、および投稿
Marketplace アプリケーションの入手
Games XBox Liveと連携
Pictures 写真を一元管理。電話機だけなく、PCとの同期、SNS・SkyDriveにある写真も表示
Office SharePoint、SkyDriveにあるOfficeファイルの表示・編集
クラウドと同期される情報(1)
アドレス帳の情報、カレンダーのイベント情報も同期される
クラウドと同期される情報(2)
OfficeハブはSkyDriveに保存されたファイルと同期する
WP7アプリと外部との連携
WPアプリの外部連携
Windows Phoneアプリから、これらの外部インターフェースを利用できる• カメラによる撮影、バーコード読み取り
• GPSによる位置検出 (A-GPS)
• Wi-Fi/携帯電話による位置検出(Default)
• GPS衛星による位置検出(High)
• センサーへのアクセス
• ハブのデータ利用
• 通信によるクラウドとの連携• HTTP通信などでWindows Live, Facebookなどのサービスにアクセス
Pictureハブの“共有…”
Pictureハブにある画像ファイルを、アプリから利用できる機能
Pictureハブの“共有…”
ただし電話機ローカルの画像だけ
ネットワーク上の画像ファイルは扱えない
オンラインの画像ファイルを扱うためには、アプリが頑張るしかない
Peopleハブのアドレス帳
アプリからアドレス帳の情報を取得できる
ContactsクラスのSearchAsyncメソッドで検索する
検索結果をLINQでソート&リスト要素作成
Peopleハブのアドレス帳
SearchAsyncの検索結果• Microsoft.Phone.UserData.Contactクラス
Name Description
Accounts データ元
Addresses 住所
Birthdays 誕生日
Children 子供
Companies 会社
CompleteName フルネーム
DisplayName 表示名
Name Description
EmailAddresses 電子メールアドレス
IsPinnedToStart スタート画面にピン留めされているか
Notes メモ
PhoneNumbers 電話番号
SignificantOthers ?
Websites Webサイト
カレンダーのイベント情報
カレンダーのイベント情報も取得可能
AppointmentsクラスのSearchAsyncメソッドで検索する
検索結果をLINQでソート&リスト要素作成
カレンダーのイベント情報
SearchAsyncの検索結果• Microsoft.Phone.UserData.Appointmentクラス
Name Description
Account データ元
Attendees 参加者
Details 詳細
EndTime 終了日時
IsAllDayEvent 終日のイベントかを示すフラグ
IsPrivate プライベートなイベントかを示すフラグ
Location 場所
Organizer 主催者
StartTime 開始日時
Status 予定の公開方法(予定あり,外出中とか)
Subject 件名
アドレス帳・カレンダーの利用の問題点アドレス帳のコンタクト情報、カレンダーのイベント情報はどちらも読み取り専用
アプリからデータを登録・更新・削除することができない
データの登録・更新・削除をするためには、アプリが別の方法で頑張るしかない
SkyDriveへのアクセス
Windows Phoneの機能として、SkyDrive上のファイルにアクセスできる
アプリからSkyDriveにアクセスするAPIは、公式には提供されてこなかった
Live Connect によるWindows Liveとの連携
Windows Live
Microsoftによる各種クラウドサービスのブランド
• Live ID: シングルサインオン(認証)
• Profile: ユーザ情報
• Hotmail: カレンダー、アドレス帳
• SkyDrive: 写真、ドキュメントなどのオンラインストレージ
• Live Mesh: PC間の同期サービス
…
Live Connectとは
Windows LiveのAPI
• 以前は”Windows Live Messenger Connect”と呼ばれていた
• http://msdn.microsoft.com/en-us/library/ff749458.aspx
• (参考) http://gihyo.jp/dev/serial/01/wl-sdk/0042
• 2011年9月13日に//build/において”Live
Connect”と名称変更• (参考) http://gihyo.jp/dev/serial/01/wl-sdk/0044
Live SDK Developer Previewが提供されている• https://connect.microsoft.com/site1226
• (参考) 同梱のHelp(CHM)ファイル。APIの詳細な説明がある
• 公開アプリでも利用可能(⇒同梱のライセンス文書)
Live ConnectのAPIの種類
APIは以下の3種類が提供されている1. JavaScript API
• Webアプリ, Metro style apps(Win8)
2. Managed API
• .NETアプリ(WP7, Metro style apps)
3. REST API
• 上記以外の環境
Desktopアプリ(WPFなど)とモバイルアプリ(非WP7)は正式にはサポートしていないが、RESTAPIによるアクセスが可能• 同梱のヘルプファイルにサンプル有り
Live Connectの提供機能サービス 機能
ID /
Profiles
認証、ユーザ情報のアクセス
Hotmail カレンダー情報の作成、読み取り、更新、削除イベントの作成、読み取り、更新、削除アドレス帳情報の取得、作成
SkyDrive ファイル(写真、ドキュメント)のアップロード、取得、更新、削除ファイルのコピー、移動フォルダの作成、削除、更新公開URLの取得(読み取りのみ、読み書き両方)
Messenge
r
XMPPによるメッセンジャーの利用ステータス(在席、ビジーなど)の設定
利用の流れ
事前準備1. アプリケーションをWindows Liveに登録してClient
IDを取得する
アプリでのLive Connectの利用1. 認可
• OAuth 2.0を用いてユーザからデータアクセスの認可を得る
• 認可の結果としてアクセストークンを入手する
2. データアクセス• REST APIによりデータにアクセスする
• 必要に応じて、戻り値のJSONを解析して、データを利用する
アプリの登録(1/4)
Step1) https://manage.dev.live.com/にアクセスして、”Create Application”をクリック
アプリの登録(2/4)
Step2) アプリ名と言語を設定して”I accept”をクリック
アプリの登録(3/4)
Step3) 表示されたClient IDを記録しておく
アプリの登録(4/4)
Step4) “Application Settings Page”→”API
Settings”とクリック。” Mobile client app”をYesにしてSave
LIVE IDによる認証・認可
Live IDによる認証・認可
認可の流れ
• 認可(auhorize)のURLを呼び出す
Client ID
許可してほしい機能(Scope)
• Live Connectのサインインページを経て、ユーザに権限の許可を求める画面が表示される
• ユーザが許可するとアクセストークンが発行される
それ以降のAPI利用時にアクセストークンを指定する
Scope (1/2)
アプリがLive Connectの機能を使う前にユーザから得る許可のこと
• 参照) SDK同梱のヘルプファイルの”Live Connect Reference”→”Scopes and permissions”
Scope 許可される操作
wl.basic 基本プロファイル、アドレス帳のユーザリストの取得
wl.birthday 誕生日情報の取得
wl.calendars カレンダーとイベント情報の取得
wl.calendars_update カレンダー/イベントの取得と更新
wl.emails 個人・preferred・ビジネスのメールアドレスの取得
wl.photos 写真・動画・アルバムの取得
Scopeの代表例
Scope (2/2)Scope 許可される操作
wl.phone_numbers 個人・仕事・モバイルの電話番号の取得
wl.postal_addresse
s
郵便番号の取得
wl.share ユーザの状態のメッセージ(オンライン・退席中など)の更新
wl.skydrive SkyDriveのドキュメント・写真の取得
wl.skydrive_update SkyDriveのドキュメント・写真の取得と更新
これらの他にもアクセスする情報に応じて細かく分かれた権限が定義されている。
Sign-inボタン
Live Connectが提供するコントロールで、RESTでのアクセスなしで簡単にLive Connectへのサインインができる
※アクセス先に応じたロゴに変更可能※SignInの文字も変更可能
Sign-Inボタンの使い方(1/5)
プロジェクト
A) アセンブリの参照を追加
• Microsoft.Live
• Microsoft.Live.Controls
Sign-Inボタンの使い方(2/5)
XAML
A) 名前空間の宣言を追加
xmlns:live="clr-
namespace:Microsoft.Live.Controls;assembly=Microsoft.Live.Controls"
Sign-Inボタンの使い方(3/5)
XAMLA) SignInButtonを追加する
• ClientIdに取得したクライアントIDを記述• Scopes属性に必要なScopeをカンマ区切りで記述• RedirectUriは”https://oauth.live.com/desktop”と記述• SessionChangedイベントハンドラを定義
ここでは、ViewModelのコマンド
で受け取るためEventToCommandを使っている
Sign-Inボタンの使い方(4/5)
ViewModel
A) SessionChangedイベントを受けるハンドラを定義
ここでは、ViewModelのコマンドとして定義
保存したLiveConnectClientオブジェクトを使ってアクセスする
Sign-Inボタンの使い方(5/5)
ViewModel
A) LiveConnectClientを使ってアクセスする
Rxを使ってGetCompletedイベントを処理する
RESTのURI /meで自分のコンタクト情報を取得
Sign-Inボタンの問題
簡単に使えるSign-Inボタンですが…
Sign-Inボタンを使ったWP7アプリが審査落ち
• ロゴを隠すことで審査に通過したとのこと
SDKリファレンスには…
SDKのリファレンスによると”none”を指定できるとあるが、実際には利用不可
対策
Sign-Inボタンの問題への対策案
A) Sign-ボタンのロゴを隠すように細工する
B) REST APIでの認可を行う
C) ボタンのロゴについて、ユーザ向け(アプリのAbout
画面など) 、テスター向け(申請時の指示欄)に説明を記述する
• この方法で審査に通るかは未検証。落ちるかも…
Sign-Inボタンを使わない方法
REST APIによる認可
• REST APIを使って自前で認可を処理する
• ボタン以外のUIからの認可の実行もできる
• 参考)
【WP for ITPro】Windows Phone アプリからWindows
Live で認証するサンプルhttp://blogs.technet.com/b/junichia/archive/2011/11/08/3463795.aspx
REST APIでの認可(1/4)
XAML
• WebBrowserコントロールを配置
• Navigatedイベントをハンドルする
REST APIでの認可(2/4)
ViewModel
• Authボタンのコマンドで認可用URLに遷移
REST APIでの認可(3/4)
View (コードビハインド)
• ViewModelメッセージハンドラを登録しておく• ViewModelからViewへの操作用
• WebBrowserコントロールへのNavigateの指示を行う
REST APIでの認可(4/4)
ViewModel
• WebBrowserコントロールのNavigatedイベントをハンドルする
遷移先URLを利用して、認可完了を判定
URLのパラメータからアクセストークンを取得する※以降のアクセスで利用
HOTMAIL(カレンダー)へのアクセス
カレンダーイベントへのアクセス
Scope
Scope 選択基準
wl.calendars カレンダーとイベントの読み込みだけの場合
wl.calendars_update カレンダーとイベントの読み込み、および追加・更新・削除の場合
wl.contacts_calendars カレンダーとイベントの読み込みだけの場合他のユーザから共有されているものも対象となる
wl.events_create カレンダーを作成する場合
カレンダーイベントへのアクセス
URL
GET
• /CALENDAR_ID/events ⇒ カレンダーのイベント情報
• /me/events ⇒ユーザのイベント情報
• /USER_ID/events ⇒指定したユーザのイベント情報
• /EVENT_ID ⇒ イベントそのものの情報
• POST
• /me/events ⇒ イベントの作成
• DELETE
• /EVENT_ID ⇒ イベントの削除
Eventオブジェクト
Live Connect
Preliminary Document
より抜粋Live Connect reference
の”REST API”章
Eventオブジェクト
(参考) Live Connect referenceの”REST API”章
{
"data": [
{
"id": "event.234a66f5917828a7.00e3268d4510499d8194f948a28d84ec.a120b08283eb4572bf09210989f81c59",
"name": "Christmas Eve",
"description": "",
"calendar_id": "calendar.234a66f5917828a7.00e3268d4510499d8194f948a28d84ec",
"from": {
"name": null,
"id": null
},
"start_time": "2011-12-24T00:00:00-0800",
"end_time": "2011-12-25T00:00:00-0800",
"location": null,
"is_all_day_event": true,
"is_recurrent": true,
"recurrence": "Occurs every year on day 24 of December.",
"reminder_time": null,
"availability": "free",
"visibility": "public",
"created_time": "2010-04-23T18:45:03+0000",
"updated_time": "2010-04-23T18:45:03+0000"
}, {
"id": "event.234a66f5917828a7.00e3268d4510499d8194f948a28d84ec.b4ac08dcb61b46a987120f883e247c84",
"name": "Christmas Day",
サンプル
ユーザのイベント一覧の取得
結果がDictionary<string,object>のため扱いにくい
JSONの生の結果データをRawResult
で取得できるので、方法があれば自前でパースも?
サンプル
イベントの作成Dictionary<string,object>
にデータを設定する
PostAsyncでデータをPOST
SKYDRIVEへのアクセス
SkyDriveへのアクセス
Scope
Scope 選択基準
wl.skydrive SkyDriveのドキュメント・写真の読み込みだけの場合
wl.skydrive_update SkyDriveのドキュメント・写真の読み込み、および追加・更新・削除の場合
wl.contacts_skydrive SkyDriveのドキュメント・写真の読み込み他のユーザから共有されているものも対象となる
Fileオブジェクト
Live Connect
Preliminary Document
より抜粋Live Connect reference
の”REST API”章
Folderオブジェクト
Live Connect
Preliminary Document
より抜粋Live Connect reference
の”REST API”章
Folderオブジェクト
(参考) Live Connect referenceの”REST API”章
{
"data": [
{
"id": "folder.56a63380c6d55c7e.56A63380C6D55C7E!213",
"from": {
"name": "Nobuaki Aoki",
"id": "56a63380c6d55c7e"
},
"name": "backup",
"description": null,
"parent_id": "folder.56a63380c6d55c7e",
"upload_location": "https://beta.apis.live.net/v5.0/folder.56a63380c6d55c7e.56A63380C6D55C7E!213/files/",
"count": 1,
"link": "https://skydrive-
df.live.com/redir.aspx?cid\u003d56a63380c6d55c7e\u0026page\u003dview\u0026resid\u003d56A63380C6D55C7E!2
13\u0026parid\u003d56A63380C6D55C7E!112",
"type": "folder",
"shared_with": {
"access": "Just me"
},
"created_time": "2010-09-25T14:14:13+0000",
"updated_time": "2010-09-25T14:15:39+0000"
}, {
"id": "folder.56a63380c6d55c7e.56A63380C6D55C7E!113",
"from": {
サンプル
フォルダ一覧の取得
サンプル
ファイルのアップロード
時間の都合でサンプルの実装が間に合いませんでした…。ブログで紹介できればと思います。
まとめ
クラウドとの連携に主眼を置いたWindows Phone
ですが、そのWPアプリがクラウドと連携する上で十分な機能が提供されていません。
Windows Liveとの連携については、2011年9月に”Live Connect”がリリースされて容易に連携できるようになりました。
その他のクラウドとの連携については、改めて紹介できればと思います。
ご静聴ありがとうございました