XAML in Xamarin.Forms 基礎篇 電子書

XAML in Xamarin.Forms 基礎篇 電子書
XAML in Xamarin.Forms 基礎篇 電子書

Xamarin.Forms 快速入門 電子書

Xamarin.Forms 快速入門 電子書
Xamarin.Forms 快速入門 電子書

2014/07/22

如何產生較長有效期限的應用程式開發簽名憑證 app package signing certificate

當我們開發好 WinRT / Windows 8.1 市集App後,想要進行側載佈署,這個時候,您會發現到您需要將產生好的側載套件檔案中的 xxx.cer 安裝到您的電腦授權憑證內。


不過,當您檢視這個憑證,您會發現到這個憑證有效期限內只有一年,也就是您當時建立好這個側載安裝套件之後的一年內,都是有效的;然而,若該App超過一年後,並且沒有重新進行側載佈署到使用者電腦上,會因為該程式數位簽名憑證已經到期,導致您的App無法使用。


我使用一個簡單的方式來解決此一問題,那就是把這個程式數位簽名有效期限給他延長一點時間,比如說,10年,那麼,在這十年內,只要這個開發程式簽名憑證沒有過期,那麼,已經側載的App是可以繼續使用的。

首先,開啟命令提示字元視窗,說輸入底下指令

MakeCert /n "CN=Contoso Software, O=Contoso Corporation, C=US" /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 07/01/2020 /sv MyCert.pvk MyCert.cer

Pvk2Pfx /pvk MyCert.pvk /pi p@ssw@rd /spc MyCert.cer /pfx MyCert.pfx /po p@ssw@rd

這個時候,在您命令提示字元當時所在的目錄下,會產生出 [MyCert.pfx]檔案,請將這個檔案複製到您Windows Store App的專案根目錄下。

接著,雙擊 [Package.appxmanifest] 檔案,切換到 [封裝] 頁次,點選 [選擇憑證] 按鈕,此時會跳出 [選擇憑證] 的對話視窗,接著點選 [設定憑證(T)...]的下拉選單,我們需要選擇 [從檔案選取...] 項目,這個時候,請在您專案根目錄下選擇 [MyCert.pfx] 檔案。


這樣就完成了將您的程式數位簽名( Code Sign )憑證的有效期限增加超過一年以上的目的。



2014/07/14

進行Windows 8.1 App 側載的時候,該App的憑證是安裝到哪裡了呢?

當我們進行 Windows 8.1 App 側載的時候,系統會要求我們要安裝 App的信任憑證到您的系統中。

下圖為我們要側載的 Windows 8.1 App Package 套件檔案,您可以看到檔案 [未來信Win81通用.Windows_1.0.0.0_AnyCPU_Debug.cer] 就是這個App的憑證。


其實,該憑證被 PowerShell 程式 ( Add-AppDevPackage.ps1 )自動安裝到 本機電腦中的 [受信任的人] 的區域內了,如下圖所示。





進行側載時候,遇到的開發者授權 developer license 之問題

若您需要把您開發的App,側載到其他電腦上,通常您都會遇到這樣的情況,那就是要求您建立一個 developer license ,在這裡,有幾個不錯的 PowerShell 工具可以使用。

在這裡,請按下 [Win Key] + [S] 這兩個組合按鍵,接著,在搜尋小視窗中,輸入 powerShell ,此時,您會看到Windows 8 幫您自動搜尋出與 powerShell 相關的任何事物,此時,請在 [Windows PowerShell] 這個項目上,請您使用滑鼠右擊該項目,選擇使用 [以系統管理員身分執行] 模式,啟動 PowerShell,如下圖所示。



請在開啟的 [系統管理員: Windows PowerShell] 視窗中,輸入底下指令:

Get-WindowsDeveloperLicense

此時,您會看到這台電腦上所擁有的開發者授權是否還有效,以及還剩下多少天就需要重新再度更新。

若您想要更新您電腦上的開發者憑證,請輸入底下指令:
Show-WindowsDeveloperLicenseRegistration

此時,您的電腦上會出現下圖畫面,詢問您是否要 更新您的 Windows 8.1 開發人員授權,點選右下角的 [我同意] 按鈕,即可更新到最新的開發人員授權有效時間。


想要撤銷電腦上的開發人員授權,請輸入底下指令:
Unregister-WindowsDeveloperLicense

當輸入完指令,並且按下 [Enter] 按鈕後,您會在畫面上看到

您即將把開發人員授權從這部電腦移除。
此電腦上的開發人員授權將在 2014/8/2 下午 06:17:17
到期。若將開發人員授權從這部電腦移除,某些應用程式將停止運作。確定要移除此授權?
[Y] 是(Y)  [N] 否(N)  [S] 暫停(S)  [?] 說明 (預設值為 "Y"):

請直接按下 [Enter] 按鍵,即可已將此電腦上的開發人員授權移除,此時,我們再度電腦上擁有的開發人員授權,請輸入底下指令,並且按下 [Enter]

Get-WindowsDeveloperLicense

這個時候,PowerShell 視窗會顯示底下訊息,告知您,這此電腦上沒有開發人員授權

PS C:\Vulcan> Get-WindowsDeveloperLicense
Get-WindowsDeveloperLicense : 此電腦上沒有開發人員授權。
位於 線路:1 字元:1
+ Get-WindowsDeveloperLicense
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WindowsDeveloperLicense],InvalidOperationException
    + FullyQualifiedErrorId : NoRegisteredDeveloperLicense,Microsoft.Windows.DeveloperLicense.Commands.GetWindowsDevel
   operLicenseCommand

2014/07/13

如何手動針對 Windows Store App 側載套件 Sildloading Package,安裝到您的電腦上

當您收到了Windows Store App 側載套件之後,您會看到類似下圖的檔案與目錄,其中 [Add-AppDevPackage.ps1]就是提供您側載的 PowerShell Script,請使用滑鼠右鍵點選該檔案,接著在彈跳功能表中,選擇第二個選項 [用 PowerShell 執行]。


此時,您的 [Windows PowerShell] 命令提示視窗中,會出現底下的文字

找到封裝: C:\Vulcan\未來信\未來信Win81通用\未來信Win81通用.Windows\AppPackages\未來
信Win81通用.Windows_1.0.0.0_AnyCPU_Debug_Test\未來信Win81通用.Windows_1.0.0.0_AnyCPU_Debug.appx
找到憑證: C:\Vulcan\未來信\未來信Win81通用\未來信Win81通用.Windows\AppPackages\未來
信Win81通用.Windows_1.0.0.0_AnyCPU_Debug_Test\未來信Win81通用.Windows_1.0.0.0_AnyCPU_Debug.cer

安裝這個應用程式之前,必須執行下列動作:
        - 取得開發人員授權
        - 安裝簽署憑證
必須有系統管理員認證才能繼續。請接受 UAC 提示,並在系統要求時提供您的系統管理員密碼。
按 Enter 鍵繼續...:

這是因為當您電腦第一次進行 Windows 8.1 Store App 側載的時候,您需要在這台電腦上取得開發人員授權,不過,進行註冊開發人員授權的時候,需要有系統管理員的認證才能夠操作,而且,您也需要擁有 Microsoft Account 帳號。

在我們按下了 [Enter] 按鍵後,接受了 UAC 提示,此時畫面會出現底下對話窗


當您選擇按下了 [我同意] 按鈕,稍後,您會看到 [開發人員授權] 的對話窗,要求您使用您的 Microsoft Account 微軟帳號進行登入驗證;當您輸入完微軟帳號與密碼後,會看到底下小視窗,告知您系統正在取得 Windows 8.1 的開發人員授權


一旦正式取得了開發人員授權,您會看到底下視窗,告知您此次取得的開發人員授權到期日到何時,此時我們按下 [關閉] 按鈕。


接著 [系統管理員: Windows PowerShell] 視窗中,您會看到底下文字

正在取得開發人員授權...
正在安裝憑證...您即將安裝數位憑證

到您電腦的「受信任的人」憑證存放區。這會帶來嚴重的安全性風險,請務必在您信任這個數位憑證的建立者的情
況下才執行這個動作。

使用完這個應用程式之後,您應該手動移除相關的數位憑證。有關執行這個動作的指示,請參閱:
http://go.microsoft.com/fwlink/?LinkId=243053

您確定要繼續嗎?

[Y] 是(Y)  [N] 否(N)  [?] 說明 (預設值為 "N"):

請您輸入大寫的 Y ,並且按下 [Enter] 按鍵。

稍待一段時間,您就會看到這個訊息:

成功:  已成功安裝您的應用程式。
按 Enter 鍵繼續...:

表示您已經成功了側載這個Windows 8.1 Store App了,您可以在 Windows 8.1的桌面查看最新側載安裝好的 App,並且執行他。

總結,若您是第一次在您的電腦上側載 Windows 8.1 Store App,您需要做到底下事情:
安裝這個應用程式之前,必須執行下列動作:

       - 取得開發人員授權
       - 安裝簽署憑證



如何產生 Windows Store App 的側載 Sideloading 的套件 Package

首先,使用 Visual Studio 2013 打開您的Windows Store App專案,從功能表選擇 [專案] > [市集] > 建立應用程式套件,如下圖所示:


請在 [建立應用程式套件] 對話窗中的 您要建置套件以上傳到 Windows 市集嗎?
請選擇 [否] 按鈕,接著點選右下角的 [下一步] 按鈕。

接下來您會看如下圖的對話窗,在 選取要建立的套件和方案組態對應 (左下角),您可以選擇 Neutral,表示該套件可以安裝在任何作業系統下 x86, x64, ARM,接著按下 [建立] 按鈕,則 Visual Studio 會開始幫忙建立這個App 可以用於側載的套件。


當 App 側載套件已經產生完成後,他會告訴您這些套件產生在哪個目錄下,您可以點選這個目錄連結,檔案總管會自動切換到這個目錄下。


當我們用檔案總管打開上圖的路徑後,您會看到如下圖的內容:
其中,下圖紅線框住的目錄,您可以使用任何壓縮工具將其壓縮起來,並且將這個壓縮檔案提供給需要側載的測試人員,他們就可以進行側載了。








如何得知您的電腦上安裝了那些 .Net Framework 版本 CLR

想要知道您的電腦上安裝了那些 .Net Framework CLR 版本,您可以執行 Clrver.exe 這個工具。

想要找到與啟動這個工具,有底下幾種方法:


  • 若您安裝的Visual Studio 2013,請使用命令提示字元或者檔案總管,切換到這個目錄下

    C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools
接著在命令提示字元中輸入指令 ClrVer ,就會看到底下結果了

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools>Clrver

Microsoft (R) .NET CLR Version Tool  Version 4.0.30319.33440
Copyright (c) Microsoft Corporation.  All rights reserved.

Versions installed on the machine:
v2.0.50727
v4.0.30319

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools>



2014/07/09

在 Windows 8.1 中,如何將 BitmapImage 的圖片內容透過 WriteableBitmap 寫入到磁碟檔案上

WriteableBitmap 是個很好用的程式庫,因為我們可以透過 WriteableBitmap 任意繪製與產生您所想要的圖片與內容,不過,要如何將 WriteableBitmap 的圖片內容,轉換成為圖片檔案呢(jpg, jpeg, png)?

在底下的程式碼,我們從 App Package 套件中的 Assets 目錄下,讀入一個圖片檔案,並且將這個圖片檔案設定到 BitmapImage 物件中,這是為了要知道這個圖片的長度與寬度。

接著,我們產生一個 WriteableBitmap 物件,在建構式中,我們傳入的 WriteableBitmap 所需要的寬度與高度,接著,將剛剛讀入的圖片檔案,使用 SetSourceAsync 設定到 WriteableBitmap 物件上,接著,我們就可以透過 SaveToFile 這個方法,把這個 WriteableBitmap 寫入到圖片檔案內。

            StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Images/Pages/PageBackground.jpg"));
            IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);
            BitmapImage bitmapImage = new BitmapImage();
            await bitmapImage.SetSourceAsync(stream);
            stream.Seek(0);

            var wb1 = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
            await wb1.SetSourceAsync(stream);
            StorageFile sf1 = await ApplicationData.Current.LocalFolder.CreateFileAsync("your.png");
            await SaveToFile(wb1, sf1, BitmapEncoder.PngEncoderId);



        public async Task SaveToFile(WriteableBitmap writeableBitmap, IStorageFile outputFile, Guid encoderId)
        {
            try
            {
                Stream stream = writeableBitmap.PixelBuffer.AsStream();
                byte[] pixels = new byte[(uint)stream.Length];
                await stream.ReadAsync(pixels, 0, pixels.Length);

                using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    var encoder = await BitmapEncoder.CreateAsync(encoderId, writeStream);
                    encoder.SetPixelData(
                        BitmapPixelFormat.Bgra8,
                        BitmapAlphaMode.Premultiplied,
                        (uint)writeableBitmap.PixelWidth,
                        (uint)writeableBitmap.PixelHeight,
                        96,
                        96,
                        pixels);
                    await encoder.FlushAsync();

                    using (var outputStream = writeStream.GetOutputStreamAt(0))
                    {
                        await outputStream.FlushAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                string s = ex.ToString();
            }
        }




2014/07/02

安裝 WinRT App 發生問題之除錯方法

經常有些時候,我們在安裝(不論透過市集或者使用 Sideloading 側載方式)App,有些時候會發生錯誤或者異常,我們可以透過 [事件檢視器] 來查看這些Windows Store App 再進行佈署、安裝、註冊的時候,發生了甚麼問題。

請使用滑鼠右擊螢幕左下方的視窗圖示,此時會彈出下圖對話窗,請選擇 [事件檢視器]


 我們需要觀察 事件檢視器 中的這三個節點上的資料
Application And Services Logs > Microsoft > Windows > AppXDeployment
Application And Services Logs > Microsoft > Windows > AppXDeployment-Server
Application And Services Logs > Microsoft > Windows > AppXPackagingOM


 在下圖中,我們展示了查看某個錯誤訊息,這是屬於 AppXDeployment-Server
我們看到這個訊息顯示了:
錯誤 0x80073CF9: AppX 部署操作失敗。此失敗的特定錯誤文字是: 另一個使用者已安裝此應用程式的未封裝版本。目前的使用者無法使用已封裝的版本來取代此版本。衝突的套件是 CLACOMUSICCORPORATION.MusicPlayAlong,它是由 CN=327F2EE7-B787-4EC2-8B56-6B65F0CBB4FB 發行。

記錄檔名稱:         Microsoft-Windows-AppXDeploymentServer/Operational
來源:            Microsoft-Windows-AppXDeployment-Server
日期:            2014/6/21 下午 08:19:46
事件識別碼:         404
工作類別:          (3)
層級:            錯誤
關鍵字:           AppXDeploymentServer 關鍵字
使用者:           SYSTEM
電腦:            VulcanHome81
描述:
錯誤 0x80073CF9: AppX 部署操作失敗。此失敗的特定錯誤文字是: 另一個使用者已安裝此應用程式的未封裝版本。目前的使用者無法使用已封裝的版本來取代此版本。衝突的套件是 CORPORATION.MPA,它是由 CN=32E7-B787-4EC2-8B56-6B65F4FB 發行。


事件 Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-Windows-AppXDeployment-Server" Guid="{3F471139-ACB7-4A01-B7A7-FF5DA4BA2D43}" />
    <EventID>404</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>3</Task>
    <Opcode>0</Opcode>
    <Keywords>0x4000000000000001</Keywords>
    <TimeCreated SystemTime="2014-06-21T12:19:46.781919400Z" />
    <EventRecordID>63324</EventRecordID>
    <Correlation ActivityID="{2363FD72-8D4A-0001-02FE-63234A8DCF01}" />
    <Execution ProcessID="4572" ThreadID="4944" />
    <Channel>Microsoft-Windows-AppXDeploymentServer/Operational</Channel>
    <Computer>VulcanHome81</Computer>
    <Security UserID="S-1-5-18" />
  </System>
  <EventData>
    <Data Name="SummaryError">另一個使用者已安裝此應用程式的未封裝版本。目前的使用者無法使用已封裝的版本來取代此版本。衝突的套件是 CORPORATION.MPA,它是由 CN=32E7-B787-4EC2-8B56-6B65F4FB 發行。</Data>
    <Data Name="ErrorCode">0x80073cf9</Data>
  </EventData>
</Event>











SuspensionManager & NavigationHelper 之 App Lifecycle生命週期會使用到的相關事件與呼叫順序

想要充分發揮 WinRT & Windows Phone Universal App 效能,您一定要知道應用程式生命週期的相關知識,這裡,做個總結。當從App開始啟動後、到切換到不同的頁面、進入到 Suspend 模式下、重新回到App執行模式下等相關事件的執行順序。

當App在不同執行模式下運作,或者切換頁面的時候,您需要明確的掌握到那些事件會被執行,而且這些事件被呼叫的順序,如此,您方能夠有效的控制App的整體狀態與運作行為。

當App第一次啟動的時候,相關的事件呼叫順序
  • App.OnLaunched 事件(也就是 PreviousExecutionState 為 Nothing)
  • 第一個頁面.OnNavigatedTo 事件
  • 第一個頁面.LoadState 事件

當App進入到 Suspended 模式下,相關事件的呼叫順序
  • App.OnSuspending 事件
  • 第一個頁面.OnNavigatedFrom 事件
  • 第一個頁面.SaveState 事件

使用者把App從 Suspended 模式下,切換為正在顯示的相關事件呼叫順序
  • App.OnResuming 事件

使用者或者作業系統把 App 終止(例如使用者使用工作管理員強制關閉該App),相關事件呼叫順序
  • App.OnSuspending 事件
  • 第一個頁面.OnNavigatedFrom 事件
  • 第一個頁面.SaveState 事件


使用者從第一個頁面切換到第二個頁面的相關事件呼叫順序
  • 第一個頁面.OnNavigatingFrom事件
  • 第一個頁面.SaveState 事件
  • 第一個頁面.OnNavigatedFrom 事件
  • 第二個頁面.LoadState 事件
  • 第二個頁面.OnNavigatedTo 事件

使用者從第二個頁面回到第一個頁面的相關事件呼叫
  • 第二個頁面.OnNavigatingFrom事件
  • 第二個頁面.SaveState 事件
  • 第二個頁面.OnNavigatedFrom 事件
  • 第一個頁面.LoadState 事件
  • 第一個頁面.OnNavigatedTo 事件

使用者再次切換到第二個頁面的相關事件呼叫
  • 第一個頁面.OnNavigatedFrom 事件
  • 第一個頁面.OnNavigatingFrom事件
  • 第一個頁面.SaveState 事件
  • 第一個頁面.OnNavigatedFrom事件
  • 第二個頁面.LoadState 事件
  • 第二個頁面.OnNavigatedTo 事件

App進入到 Suspended 模式下的相關事件呼叫(例如:切換到桌面環境中,或者其他App)
  • App.OnSuspending 事件
  • 第二個頁面.SaveState 事件
  • 第二個頁面.OnNavigatedFrom 事件

App從 Suspended模式下,回到正常運作模式下的相關事件呼叫
  • App.OnResuming


App進入到 Suspended 模式下並且被作業系統強制終止
  • App.OnSuspending 事件
  • 第二個頁面.SaveState 事件
  • 第二個頁面.OnNavigatedFrom 事件

Microsoft DirectX Graphics Infrastructure (DXGI) 角色

DXGI 是一組用來設定和管理低階圖形與圖形卡資源的 API。如果沒有它,您就無法將遊戲的圖形繪製到視窗中!

您可以用這種方式思考 DXGI:為了直接存取 GPU 並管理其資源,必須有一個對應用程式描述它的方式。您所需最重要的 GPU 資訊就是繪製像素的位置,這樣它才能夠將這些像素傳送到螢幕上。這通常稱為「背景緩衝區」—GPU 記憶體中的一個位置,您可以在該處繪製像素,然後「翻轉」或「交換」,並在收到重新整理訊號時傳送到螢幕上。DXGI 可讓您取得該位置以及使用該緩衝區 (稱為「交換鏈結」,因為這是可交換的緩衝區鏈結,允許多個緩衝處理策略) 的方法。

若要這麼做,您需要有可寫入交換鏈結的存取權,以及將顯示交換鏈結之目前背景緩衝區的視窗控制代碼。您還需要將兩者連接,以確保作業系統會在您要求以背景緩衝區的內容重新整理視窗時,執行該動作。