Posts Tagged With: Xamarin

[Android] 編譯給手機與上傳 Google Play – Xamarin for VS2017


話說,兩年前雖然完成開發 Google Play 的 App ,但因為去年在弄 Apple Store 的 App ,使用 Xamarin for Mac ,所以我已經完全忘了如何上傳 Google Play ,為了自己不知道多久後可能還會再上傳,還是自己留個紀錄。

編譯跟封存的步驟參考前一篇:

[Android] 無法正確封存 App – Xamarin for VS2017

這篇直接繼續封存開始。封存時的畫面如下:

編譯後封存中
編譯後封存中

正常完成封存後,畫面右下角可以選散發。在很舊版的 Android 模擬器,這時可以不選散發,直接將封存完成的 apk 拿到模擬器上測試,但目前的版本是不行的,所以一定要選 [散發]。

封存後選散發
封存後選散發

點選 [散發] 後,若是要直接給手機或模擬器用,選 [臨機操作] ,要是要作為正式版上傳 Google Play ,選 [Google Play] 。事實上選 [臨機操作] 的仍可人工上傳到 Google Play ,此外,點選 [Google Play] 的話,只能發布正式版、測試版,不能進行封測,我記得兩年前我在用的時候,應該沒有 [Google Play] 這選項,應該是後來微軟加入,方便開發者上傳用,但以版本管理而言,我個人偏好 [臨機操作] ,這可確保封存的 apk 檔案時間是自己可以掌握的,手上的備份版本與 Google Play 一致,當然影響不大,只是個人偏好而已。

散發通道
散發通道

A. 臨機操作

選取 [臨機操作] 後,要選一個來簽署身分識別,比如說你是用個人名義開發軟體還是用公司名義,或是集團公司可能有很多分公司,原則上這個檔案應該另外保存,如果有另外保存,例如公司共用的身分識別檔案 .keystore,第一次選 [匯入] ,如果從來沒建立過,第一次選 [+] 建立一個新的。建立時可以選擇有效期限,我是建議選長點時間,因為要更新軟體要用同一個身分識別上傳,建立身分識別後,要上傳 Google 取得對應的憑證,這個在網路上找一下,我兩年前做的,我也忘了步驟了,反正這篇重點不在這。

簽署身分識別
簽署身分識別

選擇 [另存新檔] 後,會讓你輸入密碼,必須記得第一次建立時輸入的密碼,否則無法正確簽署身分識別。這裡另存新檔的好處是你能掌握簽署身分識別後的檔案,不像直接上傳 Google Play 的,完全不知道暫存在哪。

輸入身分識別密碼
輸入身分識別密碼

回到 Visual Studio 2017 ,可以看到正在產生簽署身分識別後的 apk 檔案。

散發身分識別寫入中
散發身分識別寫入中

完成後,就可以傳輸到手機安裝,像一般沒有開 Google Play 帳號的 App ,就是把完成後的檔案放在網站上供人下載安裝。由於 Google Play 會對 App 進行檢查,一般來說,還是放上 Google Play 比較令人信賴,至於電視盒那種涉及侵權的軟體,就只能放上網頁供人下載了。

B. 上傳 Google Play

上傳 Google Play 可以把上面完成簽署身分識別的 apk 手動上傳到 Google Play ,也可以讓 Visual Studio 自動上傳,在上面散發通道選擇 [Google Play] 按鈕。

一樣,上傳 Google Play 也要簽署身分識別,不過可以從圖上分辨出是要為了臨機操作還是給 Google Play 使用。

散發到GooglePlay
散發到GooglePlay

密碼輸入的部分就跳過了,這邊由於不選擇存檔位置,所以簽署身分識別後的檔案 VS2017 不會自動幫你保存,如果又碰上 VS2017 的佛性發揮,一切隨緣時,上傳 Google Play 的 App 可能會變得不能安裝執行。

第一次上傳 Google Play 時,要輸入代理帳號:

註冊Google帳號
註冊Google帳號

由於我以前都是人工手動上傳,所以要建立一個新的。選擇步驟 1 的超連結,可在 Google 開發網站註冊一個 OAuth 認證帳號。

建立 Google API OAuth 帳密
建立 Google API OAuth 帳密

在資安的觀念上,不要在非官方的登入口輸入你原始的帳號密碼,即使是 VS2017 ,也不能輸入原始帳密,所以建立一個專用的帳密來登入,這樣也有好處,要是原始帳密進行密碼定期變更,VS2017 的自動登入不用變更,當發現帳密疑似外洩時,把這組帳密從 Google 刪除即可。

可以直接從網頁上複製帳密貼到 VS2017 的對話框,考慮到可能得重灌電腦或是 Visual Studio ,最好還是下載 JSON 保存,未來找帳密比較方便,當然也可以到網頁上查詢。

輸入 Google API OAuth 帳密
輸入 Google API OAuth 帳密

如果已經在 VS2017 註冊過 Google Play 帳戶,上面建立帳號的步驟就可以跳過,當然,如果說開發的軟體有分個人跟公司的話,就點選 [+] 再輸入個人帳號資料即可,有分的話,名稱一定要分出來才好辨識,沒有的話就直接點帳號與 [繼續] 進行下一步。

選取 Google API 帳號
選取 Google API 帳號

由於我要發布正式版,所以選擇生產環境。

GooglePlay 上傳選擇
GooglePlay 上傳選擇

我的目標 API 設為 Android 4.4 (19),在臨機操作不受影響,仍然可以安裝,但是 Google Play 則不接受,被踢掉,錯誤訊息為:

上傳 ‘com.[公司].[軟體]’ 時發生錯誤: Your app currently targets API level 19 and must target at least API level 26. [403]

VS2017 API 版本過低
VS2017 API 版本過低

我懷疑是不是 VS2017 限制,改用手動上傳,確認為是 Google Play 限制,必須改版。Google Play 錯誤訊息則為中文:

上傳失敗
你的應用程式目前的目標 API 等級是 19,但最低目標 API 等級必須為 26,才能確保應用程式採用最新的 API,讓安全性與執行效能達到最佳狀態。請將最低目標 API 等級調整為 26。

Google Play API 版本過低
Google Play API 版本過低

只好將最低目標調整為 Android 8.0(26) ,先做臨機操作,經過測試,Android 4.4 / 7.0 / 8.0 都還能安裝,就重新編譯上傳。

VS2017 上傳 Google Play 中
VS2017 上傳 Google Play 中

上傳完成後,登入 Google Play Console 檢查上傳狀態,可以看到上傳完成就自動發佈,從 Console 到商店更新大概還要 15 分鐘左右,要看商店是否已更新要稍微耐心等候。畫面上一個尚未發佈的版本,是我先前測試 API 19 的版本,再擷圖時尚未刪除,後來已經刪除了。

網頁檢查上傳結果
網頁檢查上傳結果

在 Google Play 商店會顯示目前版本的修改內容,所以最好人工進行編輯,避免使用者對於改版原因產生困惑。

編輯版本修改資訊
編輯版本修改資訊

好了,自己把步驟都記錄下來,希望下次要用的時候,操作方式不變… 不然又要到處上網找如何做了。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Android] 全螢幕畫面 – Xamarin for VS2017


兩年前開發 Android App 時,習慣使用 Windows 視窗開發的慣例,加上了標題列,考慮視窗盡量大的前提下,有略為縮小標題列,但是我沒想到我有一些 SVG 的展示畫面,是以 FullHD (1920×1080) 來設計,有了標題列與 Android 內建的系統狀態列後,我的展示畫面就會自動縮小,如下,左右有黑邊,上面為我的標題列。

系統狀態列與標題列

在寫 iOS 版本的 App 時,就直接使用全螢幕,就不再加上標題列。配合這次改版,把標題列取消,並且也覆蓋系統狀態列,也就是時間那列沒有了。

在專案屬性中,[Android 資訊清單] > [應用程式佈景主題] 輸入:

@android:style/Theme.NoTitleBar.Fullscreen

全螢幕屬性

另外原先標題列的內容會出現在主畫面做為 App 的名稱,也趁此機會跟 iOS 版本的 App 名稱統一。

變更標題列與軟體顯示名稱

測試了一下,不管直拿、橫拿都能正常全螢幕了。

其實有標題列跟系統狀態列在直拿時還好,影響不大,但是橫拿時,就會佔很大比例的高度,還是移除的好。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Android] 無法正確封存 App – Xamarin for VS2017


老闆要求修改軟體圖示 (icon) ,去年年底到今年一直無法正確封存 App ,主要是因為一開始一直用 Android Emulator 測不過。

[Android] Android SDK Tools 25.2.5 無法移除 – Xamarin for VS2017

原先在 2017 開發 Android App 時,還用 Visual Studio Emulator For Android 開發,由於主要是使用 HTML5 網頁,只需要一個 WebView 框架,所以完成後,App 就擺一邊了。

去年年底要更新 App 時,才發現 Visual Studio 2017 自動更新後, Visual Studio Emulator For Android 已經不能用了,新的開發要直接使用
Android Emulator ,今天受不了了,找出很舊的實體機 Android 4.4 測後,錯誤訊息不同了:

剖析套件時發生問題

有了錯誤訊息是個好的開始,上網查了,有篇文章說到,有時 VS2017 會不正常,從方案總管那邊,滑鼠右鍵,封存後試試。

封存編譯好的專案

居然這樣後,再下載就能在實體手機跑了,先前到底是死在哪阿?

網頁上說正常後,選單也可以正常跑了,我先前都是從選單跑,先跑重建方案,再跑封存。

選單封存功能

卡了三個月,到底在卡啥?VS2017 修復不知道多少次,我還搞到把 VS2017 全部乾淨移除後重灌,結果居然是莫名其妙的怪狀況。

不過即使實體手機能跑,Android Emulator 還是不能跑,要你何用啊…

Android 4.4 最慘,連執行安裝都不行
Android 7.1 顯示不相容
Android 8.0 顯示未安裝

我真是搞不懂這模擬器是要幹嘛用的,實機能裝,虛擬機都不能裝。

[2019/03/15 新增]

同事發現我把在螢幕上的軟體名稱打錯了,所以我今天重新打開 VS2017,編譯、封存,拿實體機來測試,居然又不能正常封存:

無 Icon

檢查專案屬性,居然 Icon 的設定跑掉了,我就今天打開 VS2017 改個名字而已啊~

改完 Icon 設定,還是不正常:

未安裝應用程式

回想昨天是先在 Android 4.4 上測試成功,先把專案目標 API 設定為 v19 ,再改回 v26,開啟 Android SDK Manager,重新以系統管理員開啟 VS2017 ,到方案總管,重新建置方案後,再重新建置專案、封存專案,又正確可以安裝到行動裝置了。趕快上傳 Google Play 。

Xamarin for VS2017 該不會是佛性編譯器吧?一切看緣分阿~

Categories: 封裝部署, 工作點滴, 技術分享 | 標籤: | 1 則迴響

[Android] Android SDK Tools 25.2.5 無法移除 – Xamarin for VS2017


我 2017 開發的 Android 要小改重新上線,這中間經過 VS2017 多次升級,甚至因為 Win10 1803 導致我重新安裝 VS2017 。

App 可以正常編譯成 .apk ,並經過封存、散發的步驟製成有簽署的 .apk ,但是不論如何,拿到虛擬機或實機跑 App 安裝完成後,都會顯示:

App not installed

一直解決不了,上網搜尋有提到 Android SDK 要整個更新到新版。

但 Android SDK Tools 這部分就是更新不上去,最後是跑完整 uninstall 後,到 Android 官方網站下載新版的 Android SDK Tools

下載完後,解壓縮至:

C:\Program Files (x86)\Android\android-sdk\tools

再從 VS2017 內呼叫 Android SDK 管理員,即可發現 Android SDK Tools 已經升級到最新版,我下載時的版本是 26.1.1 。

不過手動安裝會清除已安裝清單內容,所以所有 SDK 跟 Image 等都需要重新下載安裝,目前我的電腦正在跑,希望這部分搞定後,我的 Android 程式就可以跑了~

結果還是一樣阿~~~

App not installed
Categories: 工作點滴, 技術分享 | 標籤: | 1 則迴響

[iOS] WebView 加上回前頁的手勢


在 Android 因為本身就有回前頁的功能按鈕,因此在以 HTML5 網頁為核心的行動裝置軟體本身並不需要做特別設計。

在 iOS 如 iPhone/iPad 只有下方的 Home 鍵,因此需要考慮一個方式,不管網頁如何跑,都能有回前頁的方案。

一般來說,在 iOS 大多數的軟體不是使用導覽工具列處理,就是利用從右往左滑的翻頁手勢,代表回到上一場景。

因此只要利用這個方向使用從右往左滑的翻頁手勢,代表網頁回前頁的功能。


public override void ViewDidLoad()
{

// 略

var swipeBackRecognizer = new UISwipeGestureRecognizer(HandleSwipeGoBack);
swipeBackRecognizer.Direction = UISwipeGestureRecognizerDirection.Right;

WebView.AddGestureRecognizer(swipeBackRecognizer);

}

void HandleSwipeGoBack()
{

WebView.GoBack();

}


假定畫面上已經有一個 WebView 控制項,就可以在載入事件中直接加入 WebView 物件變數的手勢設定。

參考:https://stackoverflow.com/questions/43779824/how-to-swipe-back-in-xamarin-ios

 

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[iOS] WebView 瀏覽 http 的安全性設定 – Visual Studio for Mac


去年做 Android 的 App ,今年老闆要我做 iOS 的 App 。

我的大部分還是靠 HTML5 網頁呈現即時資訊,所以我主要只要把 App 包個 WebView 即可。

一開始我是在 Xamarin.iOS 大分類下看說明學著寫,例如這個 WebView:

https://docs.microsoft.com/zh-tw/xamarin/ios/user-interface/controls/uiwebview

我一開始以為我自己看得很透了,直接開始寫,但是怎樣都卡在連不上我的手機網頁,只好從上面網址抓線上範例來測試,範例網址的確可以正確呈現:

https://xamarin.com/

但是我只換網址為我的手機網頁就不行,畫面全白… 我開始鎖定是 http 跟 https 的差異。一找,果然在說明書找到:

https://docs.microsoft.com/zh-tw/xamarin/xamarin-forms/user-interface/webview

這個網頁是介紹 iOS/Android/Windows Phone 三種行動裝置共用的設計部分,在網頁中可以看到,iOS 特別註解從 iOS 9 以後安全性變更,預設不能瀏覽 http ,要修改安全性設定…

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

 

冏… 為啥 iOS 的特殊設定不是放在 Xamarin.iOS 下,而是放在 Xamarin Forms 下…

但是又碰上個難題,我是直接在 MacBook Pro 下安裝 Visual Studio for Mac ,沒有另外安裝純文字編輯器可以直接輸入安全性規則,比對原始碼內容,在介面上測試輸入如下:

設定網址安全性

設定網址安全性

重新編譯執行,果然可以正常瀏覽 http 網址。

編輯步驟:

  1. 在最下方點選 [新增項目]
  2. 類型選 [字典]
  3. 編輯項目名稱改為 NSAppTransportSecurity
  4. 在屬性 NSAppTransportSecurity 下方點選 [新增項目]
  5. 類型選 [布林值]
  6. 編輯項目名稱改為 NSAllowsArbitraryLoads
  7. 值 改為 是

存檔後會跟上圖一樣。

微軟網站的線上手冊沒考慮直接使用 Visual Studio for Mac 編輯,所以只能自己試啦。

可以看到專案名叫做 HelloWebView … 跟 Hello World 差不多的意思~~~

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Android] WebView 啟動時自動調整大小 – Xamarin for VS2017


我的目標網頁有設定在 html5 的 head 有設定下行:

<meta id="metaViewPort" name="viewport" content="width=480px" />

WebView 預設開啟時,並無法正確的映射到這個尺寸,雖然可以在螢幕上點兩下自動縮放到設定大小,但總是要多一手。

因此透過程式碼設定初始化大小,主要就是這句:

MobileBrowser.SetInitialScale(GetDeviceInitScale());

程式碼片段寫在 MainActivity.cs


private int GetDeviceInitScale()
{

// 預設寬度 480d, 100%: 100d
double val = (double) Resources.DisplayMetrics.WidthPixels / 480d * 100d;
return (int)val;

}

protected override void OnCreate (Bundle bundle)
{

base.OnCreate (bundle);

SetContentView(Resource.Layout.Main);

MobileBrowser = FindViewById<WebView>(Resource.Id.MobileBrowser);

//啟用Javascript Enable
MobileBrowser.Settings.JavaScriptEnabled = true;

//支援縮放 ViewPort
MobileBrowser.Settings.LoadWithOverviewMode = true;
MobileBrowser.Settings.UseWideViewPort = true;

// 計算螢幕比例
MobileBrowser.SetInitialScale(GetDeviceInitScale());

MobileBrowser.SetWebViewClient(new CustomWebViewClient());

//載入網址
MobileBrowser.LoadUrl(“http://www.company.com/");

}


這樣開啟 WebView 就會自動縮放到網頁大小了。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

在WordPress.com寫網誌.

%d 位部落客按了讚: