2014年12月3日 星期三

使用 MSBuild 編譯 Universal Apps 發生 error MSB3325, MSB3321

如果要在編譯工作中加入一些特別的行為,通常會透過 Visual Studio 加入專案建置前或建置後的工作,或是寫成 proj 檔案讓 MSBuild.exe 執行編譯工作再加上一些 Script,在使用 MSBuild 進行 Universal Apps 的 Release 編譯時,因為必須選擇 pfx 憑證,可能在編譯時期會出現以下錯誤訊息

2014年11月29日 星期六

Windows Store App Jenkins Error APPX0105、APPX0102、APPX0107

如果是比較窮的開發者,通常會使用 Jenkins 來做為 CI 的平台,前陣子在 Jenkins 上建立 Windows Store App 的建置工作時噴出三個錯誤訊息,很神奇的是,若使用 Cmd 操作 MSBuild.exe 編譯同一份 sln、proj 檔是正常的,一定要透過 Jenkins 啟動 MSBuild 才會碰到這個問題。

2014年10月21日 星期二

Code Snippet in Android Studio

在使用 Android Studio 撰寫程式時,很常輸入 inn 再加上 tab 來產生 if (obj != null) 的程式碼區段,這種程式碼片段是可以自行建立的,在 Android Studio 的 Preference / IDE Settings / Live Templates 中可以看到全部的 Code Snippets 與加入新的 Snippet。

2014年10月19日 星期日

開發團隊的基礎建設 Code Snippet for C#

在 Visual Studio 中撰寫 C# 時,在編輯視窗打上 prop 加 2 個 tab 可以快速建立產生新 property 的程式碼片段,輸入 for 加 2 個 tab 也可以快速產生 for 迴圈的程式碼片段,這些是 Visual Studio 內建的 Code Snippet 功能,在安裝目錄下可以找到所有的 .snippet 檔案,也可以透過功能列的 Tools / Code Snippets Manager 查看各程式語言有哪些內建的片段,當然也可以自行新增,此篇即是記錄如何為 C# 建立 Code Snippet 以提高撰寫程式碼時的帥氣度。

2014年10月14日 星期二

建立及更新 Live Tile 動態磚資訊

在上一篇筆記 基礎 Secondary Tiles 新增及操作 記錄了如何釘上基本的動態磚來做內容的入口時有提到,使用 NotificationsExtensions 可以比較方便的達到花樣更豐富的動態磚。

2014年10月8日 星期三

基礎 Secondary Tiles 新增及操作

動態磚 ( Live Tile ) 一直是從早期的 Metro Style 到現在 Windows 10 預覽版開放下載後,微軟很重視,且用來審核 App 品質的一項元件,在 App 安裝完成後會在開始畫面釘上應用程式的動態磚,這是應用程式的預設進入點,其他應用程式額外的動態磚,都叫作 Secondary Tile。

2014年9月26日 星期五

整合 Setting 與加入自定 Layout 的設定畫面

在 Windows 8 這個作業系統推出時,整合了搜尋、分享、設定三個入口到 Charms 上面,到了 Windows 8.1 時雖然 Search 的觀念有些調整,但 Setting 方面依然不變,且增加了方便開發者製作自定 Layout 設定頁的方法。

2014年9月22日 星期一

使用 NotificationsExtensions 建立 Toast Notification

現在應用程式的使用流程愈來愈傾向於盡量的少打擾使用者,Toast Notification 就是一種用來通知用戶事件發生又沒什麼干擾性的方法,建立 Toast Notification 的最基本方式是利用 XML 描述 Toast 的 Layout 並利用 ToastNotificationManager 來顯示,而 XML 的內容結構可以參考這裡:Tiles, toast, and badge schemas

2014年9月21日 星期日

利用 AudioEncodingProperties 產生 MediaStreamSource

曾經在 Silverlight for Windows Phone 上使用過 BackgroundAudioPlayer 的開發者大概會知道,這個播放器除了餵一般的 Uri 之外,若要播放串流就得實作該音檔格式的 MediaStreamSource 來供播放器讀取,而這個實作過程相當的辛苦,除了要讀音檔格式的 Spec 之外,背景播放的測試也是很耗時間的,幸好這個過程在撰寫 Store Apps 時不需再經歷一次。

2014年9月19日 星期五

Full View 與 Fill View 的 Layout 切換方法

在 Windows 8.1 上使用 Windows RT 開發的 App 時可以將畫面切為 Full 全螢幕、Fill 3/4 螢幕 與 Snap 320px 寬的尺寸,但在撰寫 Universal Apps 時會發現 Snap 的模式不見了,最窄也僅能讓 App 呈現寬 500px 的尺寸,在 Windows Store App 中移除了 Snap View 這種呈現方式,僅剩下三種,簡易的說明如下。

2014年9月17日 星期三

如何取得 Globalization 資訊與設定應用程式語系

大部份的狀況,我們會根據用戶作業系統的語系去選擇使用哪一套 Resource 供用戶瀏覽應用程式,像這篇文章提到的方式:共用 Resources 製作多語系應用程式

但也有不少情況,我們提供用戶自行選擇應用程式的語系,舉例來說,我裝了英文版的 Windows 和英文版的 Visual Studio 再加上許多軟體,但像 Office 這種有很多不熟悉名詞的軟體我一定得用中文版才行,這篇記錄如何列出應用程式支援的語系讓用戶在開啟時自行選擇。

2014年9月16日 星期二

Universal Apps 如何共用 Resources 製作多語系應用程式

選擇 Universal Apps 最迷人的地方就在於整合兩個 ( 未來是三個 ) 平台的資源,這裡記錄如何利用 Shared Project 達到 Windows 及 Windows Phone 專案共享 Localization 資源的方法。

2014年9月13日 星期六

Store Apps 的 MediaElement 注意事項

利用 MediaElement 播放音樂是在 Windows 所有框架中最簡單的方式,為了讓音樂可以不受到畫面切換而中斷,常常會將 MediaElement 放在 Application class 中或一些類似 Singleton 的物件中使用。

2014年9月11日 星期四

取得 WebView 畫面

在 Windows Runtime SDK 中有一個非常酷,名稱是 WebViewBrush 的畫刷,功能就如名稱一樣是將 WebView 中的內容 Render 到某處。

2014年9月9日 星期二

依解晰度選擇 Resource 與排版經驗

市面上愈來愈多筆記型電腦的螢幕採用高於 96 DPI 的規格,這代表著用戶雖然都是在 13 吋的機種下,卻顯示著長寬數量不同的 Pixel,這時如果兩種 DPI 下使用同樣的圖片來顯示,會導致在高 DPI 螢幕的環境下該圖被拉大至 140% 或 180% 甚至更高而產生模糊現像。

2014年8月31日 星期日

Store Apps 自訂 URI 與 File Association

Windows Phone 8.1 在前幾天終於推出開發者預覽版,雖然 8.0 的裝置全部都可以升級,但 8.1 與 8.0 仍然是差異不小且不相容的兩個框架,在建立 Windows Phone 8.1 專案時除了原先的 Siliverlight 之外,還可以選擇 Store Apps ( XAML App ) 專案,這個 SDK 就如它的名稱一樣,是與 Windows 8.1 的 Store Apps 最接近的,也因為架構不同,某些 API 的使用也和撰寫 Windows Phone 8.0 時有差異,這裡記錄 Store Apps 在 Windows Phone 及 Windows 上如何實現自訂 Protocol 及指定開啟特定的 File Type。

2014年8月30日 星期六

取得媒體庫的清單

在 Store Apps SDK 中有一個名為 KnownFolders 的 Class 可以取得許多系統的目錄,包括媒體庫及設備清單,官方文件:KnownFolders

2014年8月26日 星期二

Store Apps 操作應用程式檔案

回顧 Windows Client 的檔案系統從自由度極高的檔案總管到應用程式獨立空間的 Isolated Storage,如今 Store Apps 整合了 Windows 與 Windows Phone 的檔案系統 API 為 Windows.Storage。

Windows.Storage 除了原有的 Local 檔案操作之外,還加了讀寫 Roming、Temporary 檔案的支援,另外還有 Uri 的概念讓開發者以同樣的邏輯操作檔案資源和專案內的資源。

2014年8月24日 星期日

Store Apps 操作應用程式內設定值

在傳統 Windows 應用程式開發時,我們使用 Registry 儲存 Key Value 形式的資料,對於作業系統的資訊,我們也直接讀取 Registry 中的值,但在 Store Apps 的框架下,不論是 Windows 還是 Windows Phone 的應用程式,儲存資料方面我們需要用到 ApplicationData 類別在應用程式的私有空間中存取資訊,且我們無法進行 Registry 操作,僅能透過 SDK 所提供的 API 調查詢系統資訊。

2014年8月23日 星期六

Get Application Information

在 Windows 8 時要利用 WinRT 的 API 拿到應用程式名稱是一件麻煩的事情,目前在 8.1 提供的 SDK 中撰寫 Windows Store Apps 加入了比較直覺的取用方法,但很可惜的在 Windows Phone Store Apps 中並不支援,這裡記錄如何在 Store Apps 中取得應用程式的資訊。

2014年8月16日 星期六

Store App 加入 App Bar

轉換到 Store Apps 的 Windows Phone 8.1 專案,雖然和 Windows 8.1 同樣使用 Windows Runtime SDK,但之前提過,這代表著兩者大部份的 API 相同,並非全部,而 App Bar 剛好就是一個有差異的例子。Phone 8.1 使用 App Bar 的撰寫方式和 Win 8.1 是相似的,但行為概念和舊的 ApplicationBar 是相似的,在這裡一併介紹 Windows 上的 App Bar 與 Phone 上面的 App Bar。

2014年8月7日 星期四

Store Apps Navigation

在撰寫 Windows Phone 7、8 應用程式時,很習慣使用 NavigationService 來做頁面導覽的工作,而比較 Siliverlight、XAML App 時,會發現基本的導覽觀念差不多,只是寫法不同,在 Universal Apps 的框架下,Windows Phone 的導覽 API 是和 Windows RT 寫法是一致的,比起 Siliverlight 框架,新的 Store Apps 框架上最重要的是多了一個 Frame 的概念。

如果對這些名詞感到混亂,可以先參考:Windows Phone 及 Windows Store 的 API 演進

2014年8月4日 星期一

Chromecast 開發經驗

Google 的 Chromecast 於 2014 年 6 月在日本開賣了,由於我們的產品在日本是開放下載與付費的,所以比國內的其他公司較早接觸到這項新產品,此文章簡單的介紹 Google Cast 的使用、功能實作流程與開發上的常見錯誤。

開發文件:Google Cast
官方網站:Chromecast
設定軟體:Android AppiOS App

2014年7月31日 星期四

NavigationCacheMode

NavigationCacheMode 是在撰寫 Store Apps 的過程非常重要的一個 Property,它位於 Page class 之中,對於學習 Universal Apps 時,在 Win 8.1 與 Phone 8.1 的概念是一模一樣的,但是該如何使用卻是從建立一個新的 Page 時,就可以從預設值發現兩個平台對於 NavigationCacheMode 的差異。

2014年7月29日 星期二

Universal Apps 的 Solution 結構

第一次建立 Universal App 的人大概會將 Shared Project 當成是一般的 Library 專案來使用,在一般的情況下使用的確沒有相異之處,開始感覺第一個特殊的功能大概是 Resource 可以直接放在 Shared 專案中,達到 Windows 及 Windows Phone 專案共用字串表、圖檔等效果,比起 Silverligt for Windows Phone 搭配一般的 Library Project 方便許多。

2014年7月27日 星期日

Windows Phone 及 Windows Store 的 API 演進

日前 Windows Phone 已發佈 8.1 的 Developer Preview 版本,在 MSDN 上面可以看到一些關於 Phone 8.1 的新文章,另一方面在四月份的 Microsoft Bulid 2014 也發佈了新的 Windows 8.1 SDK,簡單的說最重點的一句話就是,目前 Phone 7 與 Phone 8 的 SDK 已確定將被新的 Windows Runtime SDK 所取代,也因為 Phone 從 7、8 到 8.1 可以說每一版的 SDK 都有不算小的變化,導致於網路上有許多名詞令用戶或開發者感到混亂,所以我想在這裡記錄一下就我從 Phone 7 就開始接觸到現在所了解的演進過程。

2014年6月28日 星期六

10 個最常見的 C# 錯誤

前陣子看到這篇文章 10 Most Common C# Mistakes,裡頭有些是我面試時必問的題目,有些甚至在聚會場合,和寫了 2、3 年 C# 又自認蠻猛的人聊天後,才知道並非有經驗的人都了解這些基礎細節,其實知道這些語言常見錯誤不需要有很多年的經驗,即便完全沒有專案經驗,只要有好好的讀過一本好的語言書就夠了,知名的語言書一定都會提到。很可惜的是,現在不論是面試 Android 或 Windows Phone 的工程師,都很難遇到真的有好好讀完一本 Java 或 C#、C++ 書籍的人,大多數人都是從看前人寫的程式碼來學習一個程式語言,在這裡簡單的記錄幾項文中提到的基本易犯錯誤。

2014年6月18日 星期三

如何取得 WebView 內 Javascript function 的 return 值

最近公司的案子有一個需求,某些由編輯撰寫的文章要在 App 內以 WebView 的方式呈現,而分享文章使用 App 內的 Native Button 來操作,因為分享的連結和 App 內 WebView 中顯示的不一定相同,所以不能直接拿文章的 URL 來做分享,相關情境和撰寫 Web 的部門開過會後,決定在 Web 內加一個 Javascript 的 function 回傳文章的分享連結。

2014年5月17日 星期六

DependencyProperty

撰寫 Presentation Foundation 相關的框架時,免不了要自行製作一些 UserControl,而在製作 UserControl 時如果想要讓後續使用此控制項的開發者可以依循 MVVM 的方式操作時,替 UserControl 加入 DependencyProperty 就是一件很重要的工作。

2014年5月10日 星期六

Windows 不同版本的元件差異

先前用 WPF 做了一個 POC 的專案,當時是在 Windows 8 的平台上面開發,某日因為要 Demo 的關係向同事借了一台 Winodws 7 的 notebook 來跑跑看,應用程式一打開發現某些元件重疊了,型狀也有些差異。

2014年5月4日 星期日

跨 Process 的 Mutex 使用

撰寫多執行序的軟體時,Mutex 是一個很常使用來保護資料同步性的工具,根據 AbandonedMutexException 的 MSDN 說明,若 Mutex 在某個 Thread 中被 Lock 而卻在另一個 Thread 被 Release 即會發生這種例外,這個錯誤在 Windows Phone 上如果撰寫跨 Process 的流程時其實很容易被製造出來。

2014年4月28日 星期一

Common Errors in Google In-App Billing

前一陣子接觸了 Google Play 的 IAB 串接,測試途中發生幾次小卡關,由於同時間和 iOS 團隊皆在同個產品中實作應用程式內付費功能,從這個經驗中也順便看到了兩個平台的差異,寫篇文章來記錄一下 IAB 的概念及常見錯誤處理方式。

2014年4月6日 星期日

Google Analytics for Android

Google Analytics 是一套用戶行為追縱與分析的工具,透過 GA SDK 可以方便的在應用程式原始碼各處以簡單的指令記下用戶的行為,並透過 SDK 將行為記錄傳回 GA 的伺服器,以便透過 GA 方便的管理介面做分析,產品企劃人員可以借由這些統計結果判斷哪些功能很常被使用,需要加強效果及將入口移至明顯處,哪些功能較不常用,可以將入口移到較不顯眼的地方。市面上類似的工具不少,例如 Flurry 就是其中一個類似的工具,但 Flurrry 的即時性並不如 GA 來得高,我們公司的 App 在由 Flurry 轉換到 Google Analytics 時版本是 V3,而在我記錄這篇文章時,已經推出 V4 版本了,除了 SDK 需更換之外,使用方法的差異也不算小。

2014年3月25日 星期二

Android Wear Developer Preview

前幾日 Google 釋出 Android Wear Developer Preview,包括模擬器及一個 preview SDK,此處簡單的記錄下模擬器的安裝方式及 Preview Project 中所看到的功能。

2014年3月24日 星期一

Anonymous Types 用於重構的範例

今日與一位前輩從同時開發 Android 與 Windows Phone 的經驗上,撰寫 Java、C# 兩種語言的優缺點,最後聊到 Anonymous Types 的用處,該前輩指出他在撰寫 LINQ 時大量的使用了這種 C# 語言的技巧,這對沒有習慣使用 LINQ 的我而言真的算是上了一課,Anonymous Types 常被稱為匿名類別,與匿名函式一樣,顧名思義就是未實際定義名字的類別。

2014年3月15日 星期六

Grid, StackPanel, Canvas, WrapPanel 等容器應用

前一陣子在看部門新人寫的 XAML Code 發現一些奇特的寫法,不外乎沒意義的階層關係,裡外矛盾的對齊關係,用不合適的容器以至於簡單的排版卻寫了複雜的 XAML Code。

2014年2月24日 星期一

ApplicationBarMenuItem 強制轉小寫

最近被公司的 PM 問為何 ApplicationBar 中的字全都是小寫,與字串表中他們所提供的字串不同,於是特地去翻了字串表與程式碼確認字串無誤及沒有參考錯字串。

2014年2月8日 星期六

Obfuscator for Windows Phone

公司最近開始計劃將幾個專案在往後較大的變版時利用 WPF 重新開發,加上目前有一些 Windows Phone App 已經在線上,所以試用了一些除了 .Net Framework 所開發的 dll 與 exe 之外,還可以混淆 Windows Phone (副檔名為 xap) 的方案。

2014年1月24日 星期五

IValueConverter 與 DataBinding 的結合應用

對於在定義 GUI 應用程式中的資料結構時,時常會為了 UI 上的某些特殊效果,刻意在類別中建立一些用來顯示的 UIElement 例如 SolidColorBrush 等,這些為了顯示而加入的 Property 不僅降低程式碼的可讀性,也會造成資料結構因為要描述視覺效果而不夠乾淨,在 Presentation Foundation 相關框架中有一些方法可以用來解決這種問題,IValueConverter 就是一個很方便又直覺的方法。

2014年1月5日 星期日

DataTemplateSelector

在操作 ItemsControl 的子類別相關元件時,如果是使用 Binding 的方式,有一些方法可以用來控制每個 Item 的外表,如果只是單純型狀排版相同,但單偶數底色不同,用 Converter 其實比較單純,但比較複雜的狀況例如一個 ListBox 中有數種不同外型的 Item 時,使用 DataTemplateSelector 就是比較適合的方式,這裡簡單的示範在 WPF 框架下如何利用 DataTemplateSelector 來讓單偶數的底色不同之外,連樣式也有差異。