如何使用 Azure Mobile Services- Windows Phone 為例
Pou2013.11.30
http://www.windowsazure.com/en-us/develop/mobile/?fb=zh-tw
大綱
• Mobile Service 概述• 功能說明與練習
• Data• Push Notification• User Auth• Server Script• Custom API• …
Mobile Service 概述以下簡寫為 WAMS 或 Mobile Service
Concept
Functions
Mobile Service 在做什麼
• 為 Windows 、 Android 及 iOS 應用程式• 建立可擴充的安全後端
• 在雲端儲存資料• 輕鬆驗證使用者• 傳送推播通知• 取用偏好的服務• 監視、警示及自動擴充 ( 預覽 )
Mobile Service 的好處
• 減少開撰寫維護雲端程式• 專心在 App 端開發• RESTful API 支持多個平台使用
• Windows Store/Phone 、 Android 、 iOS 、 HTML
• 提供 App 開發的基礎建設• 彈性擴充• 資料儲存、身份驗證、推播通知• 官方提供了主流平台的 SDK
Mobile Service 重點功能
• DATA• User Authorization• Push Notification• Server Script• Scale 、 Logging 、 Diagnastics
DATA
• 提供存取 Windows Azure 的儲存體• SQL 資料庫• Blob 儲存體• 資料表儲存體• 協力廠商資料服務,如 Mongo DB 等
• Mobile Service 和 Service Bus Transfer• 提供了連接到內部部署資料庫的選項• 敏感性資料未儲存在雲端亦可供行動裝置存取
USER AUTH
• 提供第三方驗證服務• Facebook 、 Twitter 、 Microsoft 、 Google• 得到被賦予的應用程式識別碼和機密
• 免除自行開發、設定和測試驗證系統的需求
• 只需撰寫幾行程式碼就可以驗證您的使用
PUSH NOTIFICATION
• 支援 Windows Store / Windows Phone• 更支持
• iOS• 僅需上傳特定的開發人員憑證
• Android• 登入 GCM 識別碼
• 輸入簡單指令即可完成• push.apns.send (iOS 平台 )• push.gcm.send (Android 平台 )
SCRIPTS
• 撰寫簡單的伺服器端程式碼• 能以自訂邏輯強化資料作業
• 自定排程、資料彙整、圖像處理• 公開 API 支持整合其他服務
• 推播通知、簡訊或電子郵件• 連接至其他 Windows Azure 服務• Azure 市集提供的附加元件• 任何協力廠商服務
監視、警示及自動擴充
• 健全狀況計量儀表板• 監視應用程式的健全狀況與可用性
• 設定警示規則• 可用性偏低時您便會接獲通知
• 自動擴充規則• 依照當前的需求自動擴充或縮編
• 以盡量降低成本• 高可用性服務等級協定的安心保障
定價與限制 – 隨用隨付
定價與限制 – 6 個月或 12 個月
實作說明
實作說明
• Get Start• 操作 Data (Server & Client)• 操作 Push Notification• 操作 User Authorization• 熟悉 Server Scripts
Get Start
• 登入Azure入口網址• Windows Live ID
• 建立 Mobile Service• 建立一個 Data Table• 下載 SDK 或自動產生的專案• 利用 App 操作 Mobile Service 更新資料
http://www.windowsazure.com/en-us/develop/mobile/tutorials/get-started-with-data-dotnet/?fb=zh-tw
登入 Azure 入口網站
建立 Mobile Service – 1/5
建立 Mobile Service – 2/5
輸入想要的名字
選擇東亞
建立 Mobile Service – 3/5
設定登入的帳密
建立 Mobile Service – 4/5
輸入想要的定序
http://www.dotblogs.com.tw/jimmyyu/archive/2009/08/30/10320.aspx
建立 Mobile Service – 5/5
Mobile Service
建立資料表 – 1/3
建立資料表
建立資料表 – 2/3
設定可以存取該資料表的權限
輸入資料名字: TodoItem
建立資料表 – 3/3
加入程式碼 – 1/2
• 直接使用範例程式下載
加入程式碼 – 2/2
• 加入既有專案
更換自行建立的 Mobile Service
執行結果
todoTable.InsertAsync(todoItem)
await todoTable.UpdateAsync(item)
items = await todoTable .Where(todoItem => todoItem.Complete == false) .ToCollectionAsync();
重點提醒
• 程式端必要元素• Microsoft.WindowsAzure.MobileServices• MobileServiceClient
• 請求與交易Mobile Service 的處理器• 設定 Mobile Service位置• 授權 Key
• IMobileServiceTable• 物件化操作 Mobile Service 資料表資料
• MobileServiceCollection<TTable, TCol>• 作用於 databinding to list
Handle Data By Server Script
Validate and modify data • Server Script增加字串長度限制• 更新 Client 端來支持驗證• Server script增加 timestamp 完成新增• 利用 timestamp 更新 Client 端呈現的資料
增加字串長度限制 – 1/2
增加字串長度限制 – 2/2
修改 Client 端程式碼
• MobileServiceInvalidOperationException• Sever Script 增加的驗證條件• 既有的 Client 執行會遇到 Exception
增加 timestamp 完成新增
更新 Client 端 timestamp呈現 – 1/3
更新 Client 端 timestamp呈現 – 2/3
更新 Client 端 timestamp呈現 – 3/3
執行結果
處理MobileServiceInvalidOperationException
呈現新欄位 CreatedAt
Refine Mobile Services queries with paging
Paging
• Client 指定擷取的資料數• Client 指定資料區間
Client 指定擷取的資料數
• 定義取得前 3筆資料• 在 RESTful API 的 QueryString 為 $top=3
Client 指定資料區間
• 指定跳過前 3筆,往後捉 3筆
重點提醒
• Server Scripts• CRUD過程裡程序化自訂邏輯加強功能
• 動態 Schemas• Mobile Service 預設開啟• Server Script 與 Client 端均可動態調整
• 建議二邊一致• Client
• 熟悉 IMobileServiceTable物件的操作
Push Notification
Push Notification
• Windows Store• Windows Push Notification Services (WNS)
• Windows Phone• Microsoft Push Notification Service (MPNS)
• Google Cloud Messaging (GCM)• Android
• Apple Push Notifications (APNs)• iOS
Windows Push Notification• Concept
channel
channel
Microsoft Push Notification Service• MPNS
•每天的推播數超過 500 個訊息• 需註冊MPNS
channel
channel
Google Cloud Messaging• Need google account to Enable GCM• App get GCM channel• App Server send message to GCM by the
channel
Apple Push Notifications• Provider keep device token of the app
• Send message to APNs by the device token
Push Notification - Mobile Service• Concept
ProviderSend message
Forward to target devices
WNSMPNS GCM
APNs
Get Start for Push Notification• Server Script 接收新增用戶時一併發送推
送• 以 Windows Phone 為例•同時發送給多個設備
• 增加新 table• Client 端增加新的類別• Client 取得 channel 加入新 table• Server Script
• 在新 table 加入新 channel 時加上檢查• 新增項目時,加上發送推送
Server Script 新增並推送 – 1/3
Server Script 新增並推送 – 2/3• For Windows Phone Tile update
Server Script 新增並推送 – 3/3• For GCM message
Windows Phone 取得 / 註冊Channel -1/3
Windows Phone 取得 / 註冊Channel -2/3
Windows Phone 取得 / 註冊Channel -3/3
Mobile Service 推送其他平台 – 1/2• Windows Store
• http://www.windowsazure.com/en-us/develop/mobile/tutorials/get-started-with-push-dotnet/?fb=zh-tw
• Android• http://www.windowsazure.com/en-us/develop/
mobile/tutorials/get-started-with-push-android/?fb=zh-tw
• message,from,collection-key
• iOS• http://www.windowsazure.com/en-us/develop/
mobile/tutorials/push-notifications-to-users-wp8/?fb=zh-tw
Mobile Service 推送其他平台 – 2/2
同時推送給多個設備 – 1/5
• 建立新的 Table : Channel
同時推送給多個設備 – 2/5
• Client增加對應 Channel 的類別
• Id• 建立新 Table 後自動產生的識別欄位
同時推送給多個設備 – 3/5
• Client 取得 Chanel ,寫回 Channel 資料表
同時推送給多個設備 – 4/5
• Server Script增加 Channel 新增時的檢查
•執行 insertChannelIfNotFound•參數有值代表重覆;無值直接新增
同時推送給多個設備 – 5/5
todoitem 新增項目,並呼叫發推送
取得 Channel 資料表中所有的 Channel ,逐一
發送訊息
重點提醒
• Sever Script•針對發送平台具有不同指令•註冊 Channel 需做重覆檢查
• Android / iOS獨立需具備的要素• 憑證、 Google Console API
• MPNs 推送類型有 Tile 、 Toast
User AUTHhow to authenticate users in Windows Azure Mobile Services from your app
User Auth 原理 – 1/3
• 整合各種驗證用戶機制• Microsoft Account• Facebook login• Twitter login• Google login
• 減少需獨立開發帳號管理• 減少個資外洩•無需負擔帳號成本
User Auth 原理 – 2/3
Microsoft Account
Facebook login
Twitter login
Google logic
Client Application
Request authorization
auth
auth
auth
auth
tokenReturn token
Transaction by the token
User Auth 原理 – 3/3
https://www.ibm.com/developerworks/community/blogs/48a78681-82cc-434f-9c78-3e9117bfd466/resource/BLOGS_UPLOADED_IMAGES/Oauth_Basic_Flow.JPG?lang=en
Get started with authentication • Facebook login• Google logic• Microsoft Account
• http://www.windowsazure.com/en-us/develop/mobile/tutorials/get-started-with-users-wp8/?fb=zh-tw
• http://www.windowsazure.com/en-us/develop/mobile/how-to-guides/register-for-microsoft-authentication/?fb=zh-tw
• Twitter login• http://www.windowsazure.com/en-us/develop/mobile/how-to-guides/regi
ster-for-twitter-authentication/?fb=zh-tw
事前準備
取得註冊驗證的 URL
Facebook login – 1/5
•進入 Facebook developers•註冊為開發者帳號• 建立新的應用程式
• 輸入該應用程式的唯一名稱• 取得應用程式重要資料
• App ID (勿外流 )• App Secret (勿外流 )
•註冊要採用 Facebook login 的 URL
http://www.windowsazure.com/en-us/develop/mobile/how-to-guides/register-for-facebook-authentication/?fb=zh-tw
Facebook login – 2/5
Facebook login – 3/5
Facebook login – 4/5
貼上 Mobile Service所產生的 URL
記下 APP ID 與 APP Secret
需回填至 Mobile Service
Facebook login – 5/5
填入 APP ID 與 APP Secret
設定操作資料表需要驗證
設定 todoitem 資料權限
僅限驗證的使用者
修改 Client 端程式碼 – 1/2
• 直接執行會收到 Exception• status code of 401 (Unauthorized)
•增加需進行身份驗證•獨立變數保存用戶登入狀態• MobileServiceUser
•因需要用戶輸入,建議放在第一個畫面
修改 Client 端程式碼 – 2/2
宣告MobileServiceUser保存登入狀態
指定驗證類型為Facebook
啟動驗證
Google login – 1/4
• 登入 Google apis • 選擇 APIs & auth
• 選擇 Registered apps• 輸入建立 Name
• 設定為 Web application• 輸入 Mobile Service所產生的網址
• 取得建立的• Client ID 、 Client Secret
Google login – 2/4
Google login – 3/4
Google login – 3/4
貼上 Mobile Service所產生的 URL
記下 APP ID 與 APP Secret
需回填至 Mobile Service
Google login – 4/4
執行結果
重點提醒
• 依驗證身份提供者類型•將Mobile Service 的 URL 加以註冊• 取得提供者 API Key
•將提供者提供的 Key 加入 Mobile Service•調整資料表需有通過驗證才可以存取• Client增加呼叫驗證的方式
• 需保存用戶資訊
Server Script
http://www.windowsazure.com/en-us/develop/mobile/how-to-guides/work-with-server-scripts/?fb=zh-tw
Server Script – 1/3
• 支援自訂邏輯,儲存於 Server•類似 JavaScript語法• 功能
• CRUD 、 Schedule Jobs 、 HTTP methods define in a custom API
• 基於 REST APIs 為底• Script不保存執行狀態•每一次請求均是新的開始,狀態均被初始化• 如需保存,請另寫入 tables
http://msdn.microsoft.com/en-us/library/windowsazure/jj554226.aspx ( 完整指令教學 )
Server Script – 2/3
Scriptapns object request object gcm object response object push object service object mpns object statusCodes object mssql object table object update function user object delete function wns object insert function query object read function console object
Server Script – 3/3
• Table operations• Custom API• Job Scheduler• Using Command line tool (教學)• Working with tables• Debugging and troubleshooting
Table Operations
Table operations – 1/4
• 專註冊於處理 tables 上的 CRUD• 其方法名稱需對應 CRUD運作的一種
• insert• update• delete• read
• 一個 table 僅能註冊一個 operations script•經由每次 REST request 時,被執行一次
Table operations 範例
• 自定義邏輯•重要參數類型
Table operations – 2/4
•固定三個參數• first
• insert/update• item object ,屬 JSON物件,代表一個 Row ,透過 Name來操作,例如: item.Owner
• delete• the ID of the record to delete
• read• query object ,代表一個 row set
• second• user object
• third• request object
• 控制 request 的執行與 response 至 client 的內容
Table operations – 3/4
•重點• Insert: function insert (item, user, request) { … }• Update: function update (item, user, request) { … }• Delete: function del (id, user, request) { … }• Read: function read (query, user, request) { … }
Table operations – 4/4
• Register for table operations• Override the default response• Override the execute success• Override default error handling• Add custom parameters• Work with table users
Register for table operations – 1/2• Azure Management Portal
• 定義Mobile Service每個 tables 的 opertaions• Source Control
• 建立 <table>.<opertaion>.js•放置 .\server\table 的子目錄•執行時,自動取得該 js進行
• Common line tool
Register for table operations – 2/2• Table operation script重點二個 function
• execute function• request已被 operation 完成• 回傳一個標準的 response
• respond function• 自訂 response
For more examples, see Read and write data, Modify the request and Validate data.
Override the default response•實作自訂邏輯,修改成功回傳內容
• 例如:檢查值、確認符合條件等
For more examples, see Modify the response.
Override execute success• 預設 table operation呼叫 execute()
• 自動回傳 response• Override
• 可傳入二個參數,定義 success 或 error
Override default error handling•實作自訂邏輯,修改失敗回傳內容
• 例如:儲存失敗、指令錯誤等• 預設
• server script 產生 log• 產生 error result 至 response
• 自訂
Access custom parameters – 1/2•請求 Mobile Service 可夾帶其他參數
• 利用 URI 的 Query String : URI?key=value• 例如
• 傳遞的參數• duplicateText = false
• Custom parameters•轉換成 JSON物件後,放置 request object 的「 parameters」屬性
Access custom parameters – 2/2
利用 Request object的 parameters屬性
對 table進行 where查詢,成功指定給定義好的
function
Work with users
• Mobile Service 提供身份驗證功能• 當驗證用戶執行 table operations 時
• user object• 出現於 operations 的參數之中
• user object.userid• userid屬性可用於儲存與擷取用戶個別設定資訊
Custom API
Custom API – 1/2
• 在 Mobile Service 建立自訂 endpoint•藉由 standard HTTP methods
• GET 、 POST 、 PUT 、 PATCH 、 DELETE•每一個 API 可自訂於單一個 script file• Mobile service runtime收到 Client請求
•轉發給 Custom API• API中搭配 express.js library加以操作
https://<service_name>.azure-mobile.net/api/<api_name>
Custom API – 2/2
• Define a custom API• Implement HTTP methods• Send and receive data as XML• Work with user and headers in a custom API• Define multiple routers in a custom API
Define a custom API – 1/2
可依照不同的 HTTP Method 開放操作權限
Define a custom API – 2/2
•每一個 HTTP Method均會有 request / response
• {} 操作的回應項目,來自 express.js library• 回傳格式為 JSON
Implement HTTP methods• Standard HTTP Method
• The custom API endpoint cannot be called using an HTTP method that has not been implemented in the server script
• a 405 (Method Not Allowed) error response is returned
• Separate permission levels can be assigned to each support HTTP method.
exports.get = function(request, response) { ... }; exports.post = function(request, response) { ... }; exports.patch = function(request, response) { ... }; exports.put = function(request, response) { ... }; exports.delete = function(request, response) { ... };
Send and receive data as XML• Mobile Service 使用 JSON呈現資料給
Client• 想用 XML 的結構傳遞
•相關範例• Define a custom API that supports periodic notifi
cations
Work with users and headers in a custom API – 1/3• User object
• Custom API藉由 request object 取得• request.user.userId
• HTTP Headers•夾帶描述 request 、 response 的說明
• Host 、 user-agent 、 content-type… 等• 定義交易的類型• Key/value 資料型態
Work with users and headers in a custom API – 2/3
• 取得 user 的 table•藉由指定 user.userid來搜尋對應的資料
Work with users and headers in a custom API – 3/3
• 取得 request中 header• my-custom-header
•相關 request / response object 操作• http://expressjs.com/api.html#res.status
Define multiple routes in a custom API – 1/2• Mobile Service 支援 Custom API
• 定義multiple path / routes• 例如
• 定義一個 HTTP GET 方法: calculator• 可再定義二個 sub function
• add• subtract
https://<service>.azure-mobile.net/api/calculator/addhttps://<service>.azure-mobile.net/api/calculator/sub
Define multiple routes in a custom API – 2/2• 利用 exports.register 定義 multiple path
•藉由 api object註冊 get,post,put,patch,delete依照 HTTP Method 可加
以區分設定固定二個參數
First : route 名稱Second : function
Call a custom API from the client• 範例練習
• http://www.windowsazure.com/en-us/develop/mobile/tutorials/call-custom-api-wp8/?fb=zh-tw
Job Scheduler
Job Scheduler
• 定義週期或 on-demand 的 server script 任務
•常用於定期的任務• 例如
• 清除表格資料、批量處理•藉由 Schedule jobs 操作•註冊 schedule job 其 main function
• 為 schedule job name•非 HTTP Method•無法傳入參數,由 job 自行處理
• 可自訂子 function 加以處理
Define scheduled job scripts – 1/2
週期與 on-demand
Define scheduled job scripts – 2/2
與 job name相同的main function 為程式進
入點
Schedule recurring jobs in Mobile Services• 範例練習
• Schedule recurring jobs in Mobile Services• http
://www.windowsazure.com/en-us/develop/mobile/tutorials/schedule-backend-tasks/?fb=zh-tw
• 結合 Twitter進行取得更新資料
Source control, share code, …
Source control, share code, … - 1/3• Mobile Service 使用 Node.js• 自訂的 script ,直接被加入 Node.js 的
module•藉由 source control
• 自訂 module• 新增其他 Node.js 至 Service中
Source control, share code, … - 2/3• global require function
http://www.windowsazure.com/en-us/develop/mobile/how-to-guides/work-with-server-scripts/?fb=zh-tw#scheduler-scripts
Source control, share code, … -3/3• How to: load Node.js modules• Share code by using source control
• Leverage shared code and Node.js modules in your server scripts.
• Use helper functions• Work with app settings
Use helper functions – 1/2
• helper function• 需宣告在 main function之後• 需要的參數均要先全部定義好• 寫在同一個 script裡,屬於區域方法
Use helper functions – 2/2• 定義一次性與分享於其他 server script• 需定義於 export object
• .services\shared\ :分享於不同 server script
Work with app settings – 1/3• Mobile Service 支持安全性儲存設置值
•類別 app settings• 支持 server script runtime 時可使用
• App settings• name/value pairs• 儲存時均會加密
Work with app settings – 2/3• Custom API
•藉由 service object 擷取 app settings
Work with app settings – 3/3• 使用 configuration module
Working with tables
Working with tables – 1/2•大部分情境中的 Server Script 會操作 tables
• 例如• Mobile Service不具有狀態,如需保存則需 tables• 搭配權限控制 request 存取的能力
•二大方式連接 tables• table object
• 簡易式操作資料表資訊• mssql object
• 類似用 T-SQL 指令方式• 提供更彈性與複雜的指令
Working with tables – 2/2• Access tables from scripts• Perform Bulk Insert• Map JSON types to database types• Using Transact-SQL to access tables
Access tables from scripts – 1/3• table object
• getTable function 取得指定資料表物件• 指令於不同的模組用法不同
• table operations / schedule jobs
• custom api
• 在 shared function不可使用 table object• 要用參數傳入
Access tables from scripts – 2/3• 取得 table object 可以操作多次
Access tables from scripts – 3/3• 更新成功後,執行 help function•藉由物件新增其他資料表內容
Perform Bulk Insert – 1/2•情境
• 如果需要大量新增資料• Client 直接用 for 或 while來請求 insert
• 將受到 SQL connection limit 的錯誤回傳• 導向 Client無法完成請求
• 或收到 HTTP 500 Internal Server Error
•解法•採用 batch 的方式
• 例如: 100筆資料分 10筆一次來傳送
Perform Bulk Insert – 2/2
定義 Batch參數
定義迴圈方法
第一次啟動
Error Handler
定義成功處理下一筆
Map JSON types to database types – 1/2• Data類型在 Client 與 Mobile Service是不同的
• 資料轉換• Client 操作的類型為被序列化的 JSON• JSON 被 Server script 使用前先被轉換
JavaScript• Node.js (JSON.parse) • Date格式轉換另外符合 ISO8601 的 JSON 字串
• JavaScript data types再轉換成 SQL database types ,儲存於 table object
Map JSON types to database types – 2/2• JavaScirpt objects 與 T-SQL type類型對應表JavaScript property T-SQL typeNumber Float(53)Boolean BitDate DateTimeOffset(3)String Nvarchar(max)Buffer Not supportedObject Not supportedArray Not supportedStream Not supported
Using Transact-SQL to access tables – 1/2• table object不支援比較複雜的 table運作
• 例如: JOIN 、複雜查詢、呼叫 Store Procedure• mssql object
• query• 執行查詢,經由特定 T-SQL 字串,成功回傳一個
options object• queryRaw :
• 與 query相似,回傳結果為原始資料• open :
• 用於取得 Mobile Service database 的連線• 可用於該連線進行資料庫操作,例如: transaction
Using Transact-SQL to access tables – 2/2• Run a static query• Run a dynamic query• Join relational tables• Run a query that return raw results• Get access to a database connection
Run a static query
•執行一個固定沒有傳入參數的查詢•回傳為 JSON格式
Run a dynamic parameterized query
•執行時夾帶參數,搭配 User Auth進行
Join relational tables – 1/2• 使用 mssql object進行 tables 的 join•舉例二個 table
• ToDoItem
• priority外部參考 Priority table 的 number• Priority
{ text: 'Take out the trash', complete: false, priority: 1}
{ number: 1, description: 'Critical'}
Join relational tables – 2/2• JOIN二個資料表
•結果{ text: 'Take out the trash', complete: false, description: 'Critical'}
Run a query that returns raw results – 1/2• queryRaw
•回傳查詢的結果為原始的資料• 結果資料表結構• 每一個 Row / Column 的結構
Run a query that returns raw results – 2/2
回傳資料表結構
Row/Column資料對應
Get access to a database connection• 使用 open 方法取得 database connection• 使用情境
•執行 transaction 時• connection object: close, queryRaw, query, beginTransaction, commit, and rollback.
Debugging and trouble shopping• Write output to the mobile service logs
•追 bug最主要的方法• 預設 server script 發生錯誤會產生 logs• 自定義邏輯利用 console object 寫入 log
• %j :代表 JSON物件• 提醒
• logs請小心使用以免超載
管理 Mobile Service
儀表板
Mobile Service 重點提醒
• 提供整合 Push Notification介面•結合多種 User AUTH 機制減少開發• 支持 Client 與 Server 端便利資料操作• Server Scripts 加強複雜的邏輯情境• Custom API 擴充自訂功能• Job Schedule 、 Source Control•複雜的資料表操作•管理功能
Q & A
Thank you for listening.
References – 1/2
• Work with server scripts in Mobile Services• Schedule recurring jobs in Mobile Services• Send email from Mobile Services with
SendGrid• Upload images to Windows Azure Storage by
using Mobile Services
References – 2/2
• 透過 Windows Azure Mobile Services 開發各平台 Apps
• Windows Azure Mobile Services - The Perfect Partner
• SolidQ Windows Azure Mobile Services & Windows 8
• Introducing Azure Mobile Services – Script and Custom API
• Introducing Windows Azure Mobile Services – Authentication
• Introducing Windows Azure Mobile Services
• http://www.windowsazure.com/en-us/develop/mobile/?fb=zh-tw
• Client library for .NET
• Client library for Javascript
• REST API reference