XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

Xamarin.Forms 快速入門 電子書
Xamarin.Forms 快速入門 電子書
顯示具有 Xamarin.Android 標籤的文章。 顯示所有文章
顯示具有 Xamarin.Android 標籤的文章。 顯示所有文章

2018/05/29

關於 Xamarin.Android 提交到 Google Play 時候,得到 變更應用程式的目標 API 等級 的警告訊息

了解更多關於 [Xamarin.Android] 的使用方式
了解更多關於 [Xamarin.iOS] 的使用方式
了解更多關於 [Xamarin.Forms] 的使用方式
了解更多關於 [Hello, Android:快速入門] 的使用方式
了解更多關於 [Hello, iOS – 快速入門] 的使用方式
了解更多關於 [Xamarin.Forms 快速入門] 的使用方式

今天收到學員提問的問題,發現到若您沒有做些調整,當您要把 Xamarin.Forms 的 APK 佈署檔案上傳到 Google Play 時候,會得到底下錯誤訊息
警告
你的應用程式目前的目標 API 等級是 17,請將最低目標 API 等級調整為 26,以確保應用程式採用最新的 API,讓安全性與執行效能達到最佳狀態。
自 2018 年 8 月起,新應用程式的指定目標至少必須是 Android 8.0 (API 等級 26)。
自 2018 年 11 月起,應用程式更新的指定目標必須是 Android 8.0 (API 等級 26)。
Your app currently targets API level 17 and must target at least API level 26 to ensure it is built on the latest APIs optimised for security and performance.
From August 2018, new apps must target at least Android 8.0 (API level 26).
From November 2018, app updates must target Android 8.0 (API level 26).
Meet Google Play's target API level requirement
此時,我連上我的 Google Play Console 來查看之前上架的 App 資訊,從下圖中,您將會看到,在 區別性 APK 詳細資料 欄位中,底下的 目標 SDK 版本並沒有定義支援哪個版本。
Android Target SDK Version
由於有這項新的政策推出,我們在進行 Android 發佈檔案 .apk 的時候,請依照底下步驟進行設定,這樣所產生出來的 .apk 檔案提交到 Goolge Play 上的時候,就不會出現這樣的警告訊息了。
  • 請展開 Android 專案內的 Properties 節點,滑鼠雙擊 AndroidManifest.xml
    AndroidManifest.xml
  • 在 AndroidManifest.xml 加入這行
  • 底下是我這裡測試的檔案內容
    在這裡,我的開發環境的最新 Android SDK 有安裝 SDK 8.1,因此,我將會設定我的目標 Framework 為 API Level 27
    您可以依據您當時的開發環境來進行設定,若您的開發環境沒有安裝 Android SDK 8.1 (API Level 27),您可以選擇 Android SDK 8.0 (API Level 26)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="11" android:versionName="1.3.8" package="com.vulcanlab.LOBForm" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="17" />
    <uses-sdk android:targetSdkVersion="27" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:label="企業表單" android:icon="@drawable/icon"></application>
</manifest>
  • 滑鼠雙擊 Android 專案中的 Properties 節點
  • 切換到 應用程式 Application 標籤頁次視窗
  • 確認 使用下列 Android 版本編譯: (目標 Framework) 下拉選單,有選取 使用最新平台 (Android 8.1 (Oreo)) 或者 Android 8.1 (Oreo) Meet Google Play's target API level requirement
  • 現在,您可以進行這個 Android 專案的封存動作,在完成封存與程式碼簽名動作之後,將會得到一個 .apk 檔案,此時,您可以將這個 .apk 檔案上傳到 Google Play 上
  • 如此,您將不會再看到警告訊息,如同下圖所示
Meet Google Play's target API level requirement
當這個 App 上架成功之後,我再度到 Goolge Play Console 中查看這個 APK 詳細資訊,此時, 目標 SDK 版本 就會出現我所指定的 27 版本資訊
Android Target SDK Version

了解更多關於 [Xamarin.Android] 的使用方式
了解更多關於 [Xamarin.iOS] 的使用方式
了解更多關於 [Xamarin.Forms] 的使用方式
了解更多關於 [Hello, Android:快速入門] 的使用方式
了解更多關於 [Hello, iOS – 快速入門] 的使用方式
了解更多關於 [Xamarin.Forms 快速入門] 的使用方式


2018/05/21

如何解決 Your project is not referencing the "MonoAndroid,Version=v8.1" framework 錯誤說明

了解更多關於 [Xamarin.Android] 的使用方式
了解更多關於 [Xamarin.iOS] 的使用方式
了解更多關於 [Xamarin.Forms] 的使用方式
了解更多關於 [Hello, Android:快速入門] 的使用方式
了解更多關於 [Hello, iOS – 快速入門] 的使用方式
了解更多關於 [Xamarin.Forms 快速入門] 的使用方式

最近將 Surface Pro 4 作業系統重新安裝,並且安裝最新的 Visual Studio 2017 15.7.1 版本,並且透過 Prism Template Pack 來產生一個 Xamarin.Forms 的專案,不過,當想要建置 Android 的專案 (此時,我並沒有進行任何 Xamarin.Forms 的相關設計,只是建立好 Xamarin.Forms 專案),卻得到了底下錯誤訊息。
VS2017 15.7.1 MonoAndroid 8.1 Error
Your project is not referencing the "MonoAndroid,Version=v8.1" framework. 
Add a reference to "MonoAndroid,Version=v8.1" in the "frameworks" section of 
your project.json, and then re-run NuGet restore.
我的另外一台電腦中,在很早之前,就已將安裝了 Visual Studo 2017,不過,這幾天才將 Viusal Studio 2017 從 15.6.x 升級到 15.7.1,不過,我可以確定的是,在我還沒有升級到 VS2017 15.7.1 版本,我是可以順利建立起 Xamarin.Forms 的專案,並且可以順利正常建置該專案。 (有個詭異現象,那就是,這台電腦原本在 15.7.1 版本中,所建立的 Xamarin.Forms 專案,是可以正常建置的,直到昨天晚上,我也沒有做任何升級與安裝相關軟體的動作,卻發生了一樣的問題,卻也會得到一樣的錯誤訊息,無法順利建置成功了)

如何修正這個問題

  • 請在 Visual Studio 2017 的 方案總管中,使用滑鼠雙擊 Android 專案中的 Propertis 節點,找到 應用程式 標籤頁次,並在這個標籤頁次中,您會看到了 使用下列 Android 版本編譯: (目標 Framework) 這個下拉選單,此時他預設的選項是 使用最新平台 (Android 8.1 (Oreo)) Android Properties Application
這個時候,我們先來查看這個 Android 專案的 .csproj 檔案內容,我們看到了,他的 TargetFrameworkVersion 項目標示其值為 v7.1 ,而另外一個標籤 AndroidUseLatestPlatformSdk 該項目的值為 true。
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{C6CAF76D-0C7C-4DA4-8DE1-617BF0D573C0}</ProjectGuid>
    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>BlankApp10.Droid</RootNamespace>
    <AssemblyName>BlankApp10.Android</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkVersion>v7.1</TargetFrameworkVersion>
    <AndroidApplication>True</AndroidApplication>
    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <AndroidResgenClass>Resource</AndroidResgenClass>
    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
    <AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
    <AndroidStoreUncompressedFileExtensions />
    <MandroidI18n />
    <JavaMaximumHeapSize />
    <JavaOptions />
    <NuGetPackageImportStamp></NuGetPackageImportStamp>
  </PropertyGroup>
  • 請先選擇 目標 Framework 下拉選單為 Android 8.1 (Oreo),我們也觀察,這個時候,Android .csproj 檔案,變成了如下內容
    注意,我們是將原先的 使用最新平台 (Android 8. Oreo) 選項,變更成為第二個 Android 8.1 (Oreo) 選項
    這個時候,他的 TargetFrameworkVersion 項目標示其值為 8.1 ,而另外一個標籤 AndroidUseLatestPlatformSdk 該項目的值為 false。
    Android Properties Application
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{C6CAF76D-0C7C-4DA4-8DE1-617BF0D573C0}</ProjectGuid>
    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>BlankApp10.Droid</RootNamespace>
    <AssemblyName>BlankApp10.Android</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
    <AndroidApplication>True</AndroidApplication>
    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <AndroidResgenClass>Resource</AndroidResgenClass>
    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
    <AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
    <AndroidStoreUncompressedFileExtensions />
    <MandroidI18n />
    <JavaMaximumHeapSize />
    <JavaOptions />
    <NuGetPackageImportStamp>
    </NuGetPackageImportStamp>
  </PropertyGroup>
  • 最後,請先選擇 目標 Framework 下拉選單為 使用最新平台 (Android 8. Oreo) 選項,我們也觀察,這個時候,Android .csproj 檔案,變成了如下內容
    這個時候,我們再度將目標 Framework 設定選項,修改成為最初產生專案的設定值,即為 使用最新平台
    現在,我們觀察到,專案中的 .csproj 檔案中, TargetFrameworkVersion 項目標示其值為 8.1 ,而另外一個標籤 AndroidUseLatestPlatformSdk 該項目的值為 true。
    Android Properties Application
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{C6CAF76D-0C7C-4DA4-8DE1-617BF0D573C0}</ProjectGuid>
    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>BlankApp10.Droid</RootNamespace>
    <AssemblyName>BlankApp10.Android</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
    <AndroidApplication>True</AndroidApplication>
    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <AndroidResgenClass>Resource</AndroidResgenClass>
    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
    <AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
    <AndroidStoreUncompressedFileExtensions />
    <MandroidI18n />
    <JavaMaximumHeapSize />
    <JavaOptions />
    <NuGetPackageImportStamp>
    </NuGetPackageImportStamp>
  </PropertyGroup>

重新進行建置測試

  • 現在,我們需要重新進行建置動作,為了避免一些雜訊殘留,所以,我們先將這個方案(Solution)進行清除,接著,將 Android 專案與 Xamarin.Forms 專案中的 bin / obj 這兩個目錄,從檔案中刪除掉。
  • 接著,選擇將 Android 專案來建置
  • 稍微等候一段時間,您將會發現到這個 Android 專案,竟然可以順利編譯成功了。
1>------ 已開始建置: 專案: BlankApp10, 組態: Debug Any CPU ------
1>BlankApp10 -> D:\Vulcan\Projects\CannotBuildAndroid\BlankApp10\BlankApp10\BlankApp10\bin\Debug\netstandard2.0\BlankApp10.dll
2>------ 已開始建置: 專案: BlankApp10.Android, 組態: Debug Any CPU ------
2>  BlankApp10.Android -> D:\Vulcan\Projects\CannotBuildAndroid\BlankApp10\BlankApp10\BlankApp10.Android\bin\Debug\BlankApp10.Android.dll
2>  沒有辦法解決 "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 和 "mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" 之間的衝突。任意選擇 "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"。
========== 建置: 2 成功、0 失敗、0 最新、0 略過 ==========
  • 根據從網路上的搜尋與分析,這個問題極有可能是 VS2017 15.7.1 所引發的一個內部 Bug,因此,在尚未取得更新版本的 Visual Studio 2017 前,看樣子,只能夠使用這個方法來進行排除該問題了。

2018/04/27

Xamarin 新手入門 Part 6 我該選擇 Xamarin.Forms 或者 Xamarin 原生方式來開發跨平台應用程式專案呢?



對於已經具備擁有 .NET / C# 開發技能的開發者,可以使用 Xamarin.Forms Toolkit 開發工具,便可以立即開發出可以在 Android / iOS 平台上執行的 App;對於要學習如何使用 Xamarin.Forms & XAML 技能,現在已經推出兩本電子書來幫助大家學這這個開發技術。
這兩本電子書內包含了豐富的逐步開發教學內容與相關觀念、各種練習範例,歡迎各位購買。
Xamarin.Forms 電子書
想要購買 Xamarin.Forms 快速上手 電子書,請點選 這裡

想要購買 XAML in Xamarin.Forms 基礎篇 電子書,請點選 這裡


經過一系列的初步認識 Xamarin 原生方式開發與 Xamarin.Forms 方式開發的方式,大部分第一次接觸 Xamarin Toolkit 工具集的人,都會開始存在著許多問題,我究竟要使用原生方式來進行專案開發,還是要採用 Xamarin.Forms 的方式來進行開發呢?在這篇文章中,將會提供這些相關疑問的解釋說明。

問題:我該選擇原生方式開發還是 Xamarin.Forms 的專案開發

這個需要視您的行動專案應用程式需求而定,當我們選擇了 Xamarin.Forms 形式來進行跨平台專案開發的時候,我們僅需要設計一套 UI 標記宣告與一個商業邏輯的C# 程式代碼,如此,我們就可以同時在 Xamarin.iOS & Xamarin.Android 專案中使用剛剛設計出來的 UI與商業邏輯,根據我這裡實際幫客戶進行專案開發的經驗,一個約採用了50個以上頁面的 Xamarin.Forms 專案,具備了 RESTful Web API 呼叫、推播等機制,共用程式碼的部分可以達到 96% 以上,上下的 4% 僅需要分別在 Xamarin.iOS & Xamarin.Android 原生專案內進行設計,這樣可以大幅提升同時開發兩個平台的應用程式開發效率,而且,最重的是,當應用程式的頁面或者商業邏輯發生了問題,我們也僅需要再 Xamarin.Forms 專案內進行修正,這樣,兩個平台的應用程式經過重新建置之後,就都修復掉了這些問題。
若我們採用原生方式進行開發跨平台應用程式專案, Xamarin.iOS & Xamarin.Android , 此時,關於採用 C# 設計出來的商業邏輯部分,可以分別共用於 Xamarin.iOS & Xamarin.Android 原生專案內,不過,關於 UI 的部分,我們就需要分別在 Xamarin.iOS 原生專案中,使用 Xcode 的 Storyboard 的方式進行設計,這部分可以參考 iOS 使用者介面;而在 Xamarin.Android 原生專案中,需要使用 Android UI XML 的指定語法來定義,這部分可以參考 Android 使用者介面。換言之,您需要分別在這兩個 iOS & Android 原生平台下,精通這兩個平台的 SDK 說明文件,了解如何設計個平台的專屬 UI 頁面。不過,在 Xamarin.Forms 下,您僅需要使用標記宣告的 XAML 語法,來定義出該應用程式頁面所需呈現的 UI/UX 內容,無須了解每個平台專屬 UI 設計知識。
不過,這不代表 Xamarin.Forms 可以適合開發出各種跨平台應用的程式,若您的程式需要存取大量或者深入的原聲平台 API、需要使用到每個平台的專屬原生行為、您的應用程式對於客製化 UI 的需求比起要更多的程式碼分享需求更為迫切,則,您是不適合選擇 Xamarin.Forms 技術來進行跨平台專案開發;例如,您想要開發出虛擬實際 VR / 擴增實境 AR 應用的程式、多媒體影音的應用、需要使用地圖介面,但是要提供更加多的視覺設計,類似寶可夢抓寶那樣的情境、手機遊戲等等,這些情境都不適合選擇採用 Xamarin.Forms 的開發技術。
不過,對於想要在企業內部導入 Xamarin 開發技術,並且開發出相關企業內部想要使用的應用程式、手機購物應用程式等等,這些情境是絕對適合採用 Xamarin.Forms 的技術來進行開發,尤其是企業內部使用的行動應用程式,選擇採用 Xamarin.Forms 是您唯一的選擇,而且是最好的選擇。
最後,在進行專案開發之前,請務必進行分析您的應用程式類型,是否真的適合使用 Xamarin.Forms 方式來進行開發,否則,當您頭髮已經剪好了而且頭洗了一半,這個時候您才想要說,我是要我的頭髮燙成捲髮模式,此時,我的良心建議是,使用 Xamarin 猿聲專案模式進行開發吧,最起碼,您的商業邏輯部分,您不需要重新再寫一次,您僅需要針對每個平台的所有頁面 UI,使用原生 SDK 的說明,重新設計一次即可。

問題:我在 Xamarin.Forms 上進行開發,一定要使用 XAML 嗎?

關於這部分的問題,個人強烈建議要使用 XAML 來進行每個頁面的 UI 設計,並且選擇採用 MVVM 設計模式來進行關注點分離的開發;不過,任何的 XAML 的標記或者宣告,都可以使用 C# 程式語言來進行開發,您當然也可以不需要使用到任何 XAML 技術,自行使用 C# 程式語言來進行開發出 Xamarin.Forms 的跨平台應用程式。
對於 MVVM vs Code Behind 開發方式選擇,個人偏向強烈建議使用 MVVM 方式來進行開發,並且選擇一個好的 MVVM Framework 框架,幫助我們簡化 MVVM 的使用;我都是採用 Prism 這個開發框架,來進行 Xamarin.Forms 的專案設計。當然,青菜蘿蔔各有所好,市面上還有許多相當優異的 MVVM Framework 框架您可以選擇的。
關於更多關於一些 Xamarin.Forms 開發上的疑問,可以參考 Xamarin / Xamarin.Forms 行動跨平台 Mobile Cross-Platform 開發學習指引問答集 FAQ

Xamarin.Forms 的教育訓練課程

在下圖中,我列出了當您在進行 Xamarin.Forms 專案開發的過程中,您需要了解與會遇到的設計情境與需求,您可以挑選則您可能需要、預期的項目,開始進行了解與研究,不過,當您真的實際開始進行 Xamarin.Forms 專案開發的時候,將會遇到這張圖上所遇到的許多項目。
Xamarin.Forms
若您想要選擇使用 Xamarin.Forms 的方式來進行跨平台行動專案的開發,這裡提供幾個關於 Xamarin.Forms 的學習資源與教育訓練課程
  • 開始使用 Xamarin.Forms (微軟官方文件)
    這裡是微軟官方的各種關於 Xamarin.Forms 的說明文件,這裡有著您在使用 Xamarin 工具集進行開發的時候,所需要具備的知識與技能、進階開發技巧、各種說明範例應用,都有著相當豐富的內容。各位可以參考 開始使用 Xamarin.Forms
  • Xamarin.Forms 跨平台行動應用程式開發實戰
    本次課程包含超過4個小時的先修錄影課程、 一堂 1 小時的線上課程 與 五天共 35 小時的實體課程,將會帶領大家快速上手 Xamarin.Forms 開發工具,您將會認識 Xamarin 開發環境,了解使用 Xamarin.Forms 開發工具所會遇到問題與解決方法,學會 XAML 與 MVVM 開發和設計模式,實際動手做出可以跨平台執行的應用程式,並且學會整個 Xamarin.Forms 開發過程。 Xamarin.Forms 跨平台行動應用程式開發實戰
  • Xamarin.Forms 跨平台行動開發一日實戰營(派工 App)
    本次課程包含 1.5 小時的線上課程與1 天實體課程,將會提供已寫好的派工與回報的後台 Web API(包含原始碼),並藉此帶領大家從無到有,開發出跨平台(Android / iOS)行動應用 App。參考網址 Xamarin.Forms 跨平台行動開發一日實戰營(派工 App)
  • Xamarin.Forms 跨平台行動開發一日實戰營(表單 App)
    在整個課程中,將會使用已開發好的 Web API,進行 Xamarin.Forms 跨平台行動應用程式的開發。實作出一個工作日誌回報的表單 App,可以新增、查詢、更新、刪除 (CRUD) 工作記錄、申請請假的表單功能、主管「審核請假」頁面以進行部屬請假紀錄的核准,另外,也會說明如何取得顯示公司緊急連絡方式清單,並且直接進行撥打電話功能。參考網址 Xamarin.Forms 跨平台行動開發一日實戰營(表單 App)
    +

進階研讀