發表文章

How to deploy flutter web app with Firebase hosting

圖片
Build and release a web app -Add web support to an existing app flutter create . ----- Build your app in release mode, using the default (auto) option: 使用 build 命令 Generate a release build: 運行下面command in android Terminal flutter build web (一般測試模式) 要改用 flutter build web --release 通過 release 模式 ( flutter run --release ) 或者 flutter build web 創建一個發行build。輸出文件在 build/web 目錄下,包括需要提供的 assets 資源data。 (This can be run with the release flag or built using flutter build web . This outputs files at build/web , including the assets, which need to be served together.) --- 手動更改  build/web下:  version.json ,manifest.json 內有關app name描述. --- Deploying to the web -安裝 Firebase CLI, 確定以下畫面有出現. 使用powershell. ---- Firebase init (注意以下答案) ? What do you want to use as your public directory? . ? Configure as a single-page app (rewrite all urls to /index.html)?  No ? Set up automatic builds and deploys with GitHub? No ? File ./index.html already exists. Overwrite? No i  Skipping write of ./index.

Dart: Spread operator (…)

圖片
最近在寫flutter app程式時,發現一個dart奇特的語法: children: [                   ...[                     "Toys",                     "Appliances",                     "Tools",                     "Food",                   ] .map((e) {                     return _CardButton(                       label: e,                       onPressed: () => onCategorySelected(e),                     );                   }).toList()                 ],   這...特殊運算子是 "展開運算子" Spread operator ,  from  Dart 2.3 var a = [ 0 , 1 , 2 , 3 , 4 ]; var b = [ 6 , 7 , 8 , 9 ]; var c = [...a, 5 ,...b]; print (c); // prints: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 就是他會自動擴展之後的陣列資料. 可以輕鬆地將兩個 List 結合在一起. 有點像 concat  function : nums = []. concat (digitBuckets); nums = []. addAll (digitBucketsd); 很複雜,不容易理解. . 在flutter很常看到別人這樣用: For Flutter, we can use this inside column List<String> values = [ 'one', 'two', 'three' ]; Column( childre

android app bundle: install aab to device

緣由:2021年開始,app開發者上傳app到google play store被規定一定要使用 Android App Bundle (aab)格式才可更新app,但 aab 格式檔案不能像過去使用apk檔案一樣,直接用adb install 指令就可安裝到裝置上來測試,這導致新格式aab檔案在我們作測試時非常不方便,如果我們想手動安裝 aab 檔案,就需要有額外工具~那就是 bundletool,他可方便我們在local端來安裝aab. --------- 步驟1: (先確認有這工具)   download bundletool ,可直接找最新版本. https://github.com/google/bundletool/releases i.e:  https://github.com/google/bundletool/releases/download/1.8.0/bundletool-all-1.8.0.jar 下載下來的檔案檔名為 bundletool-all-1.8.0.jar, 記得要把他更名為bundletool.jar ,這樣下次就只要輸入bundletool.jar,然後再把它放在通用路徑下或是c:\下,這樣下次不用輸入路徑. 如果發生找不到檔案的狀況,記得加上bundletool所在路徑. ------ 步驟2. 先轉換aab成apks格式: ( convent aab to apks) java -jar bundletool.jar build-apks --bundle=app.aab --output=out.apks (上面指令會產生一個用debug key簽屬的apks.有些測試只需debug key即可) ps: 如果你要建立用"上傳app store keystore簽署金鑰"的apks, (這是用在需要使用地圖或是login功能會認簽署金鑰的功能的時候) 指令會比較長,建議寫成一個cmd script,下次直接執行即可,可免去每次都輸入. $ bundletool build-apks --bundle=<bundle_name>.aab --output=<bundle_name>.apks --ks=<your_keystorename>.jks/.keysto

admob policy violation: 廣告政策違規處理方法

圖片
  AdMob violation: "Site Behavior: Navigation" Policy Violation 最近app又遇到了政策違規, 因為google app store有上百萬個app,所以他們現在可能用機器學習方式去偵測錯誤或違規.所以近期開發者收到的違規數量大增. "但有時admob會誤判!!!" 首先你要先研讀完政策說明 .確定自己沒有明顯違規後, 在實在不知道哪裡有問題的狀況下, 再透過此申訴方法: Step 1.透過admob support請求真人協助. 請按照你能溝通的語言,英語系選擇英文,中文選擇中文, admob會分派各語言的審核人員來處理. 在這步驟選擇你覺得你app沒有問題的截圖. 或是寫個文件說明檔doc附上,要寫能說服對方的充分理由. 你知道admob每天要處理很多案件(有很多人會騙人). 他們審核人員很聰明的,會查明真相.所以要謹慎寫,不可說謊. 當你發現你自己理虧,內容或app是拿別人的內容.沒有原創性. 或是真的就是騙點擊,或是不同機器會有不同結果(例如a機器可跑,但b機器卻是白畫面),或是廣告與內容重疊,或是突然跳出全螢幕廣告,或是一整個頁面都是廣告或是超過1個數量,或是廣告太頻繁騷擾使用者,....這些很明顯的違規. 當然就不能透過admob的營利.這是規則上有寫的. 若你自己理虧,申訴是沒有用的.這一切要自己先作判斷喔. 當你按下傳送後,沒多久google admob會寄一封支援服務受理證明給你. 會有案號.接下來就是真人審核了. 如果你的理由充分,可以說服admob審核人員. 就可以按照他們的指示送出review. 幾天後,他們的回復如下:  他們還會明確告訴你,app那裡違規.若是誤判也會誠實告訴你. 還會附上詳細截圖給你. 這樣做法可是非常花費人力物力的. 所以google admob當然不會每個違規都這樣處理. 大部分違規都是政策說明上有寫的明顯違規.不需要真人一個個回覆. 如果一萬個違規,每個都要人工回覆,即便只有1%的人工回覆~100個違規都是龐大人力負擔. 所以呼籲大家只有在自己真的不確定那裡違規之下,才做這人工支援服務. 在人工的真人回覆後,我終於知道app哪裡有錯後,馬上就修正app. 之後審核真的一切都變超快速.(像我這次是誤判.) 如果不知道

Android error: Unsupported class file major version 60/61

圖片
最近如果大家有build android app,常會遇到此問題: android studio / app build issue: 所有舊專案都很會出現這問題,我也是一直遇到.大家可能會被這氣瘋了吧. Apk 無法產生出來.還不知道原因在那??? Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: General error during semantic analysis: Unsupported class file major version 60 java.lang.IllegalArgumentException: Unsupported class file major version 60 at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:196) at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:177) at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:163) at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:284 Solution: 因為最近有很多android新的軟體版本更新,所以很多相關軟體也都更新, 嘗試升級Gradle的版本解決 更新方法: 打開File -> Project Structure -> Project,在窗口中的左邊,可以修改Gradle為7.2以上版本 modify gradle-wrapper.properties to: distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip ----- 2021.9.台灣在疫情下,百業蕭條,大家都被限制在家裡防疫 但不知為何台灣股市還可以上17276點,現實情況明明就整個台灣人民都過得很苦, 不僅如此,因為

寫APP真的是好工作嗎? Firebase host與我對Kotlin的感想

圖片
最近在找工作,經過1個多月後,還是沒找到,有點不順利,收到很多無聲卡, 難過了好幾天,然後我感覺.... 1.寫APP真的是好工作嗎? 台灣好像不缺app軟體工程師....(現今在網路上或補習班,能找到大量手機 App 或網頁之類的前端開發課程。但一套應用系統,需要前端與後端整合才完整。很多資深工程師(well-trained)像我,不得不必須要跟新人競爭,但通常公司不太會分辨何謂新手與老手?) 2. 感覺上,IOS工程師似乎比ANDROID 工程師更稀少與缺乏,更好找工作. 3. Covid-19疫情風暴下,能不能去面試都是一個大問題. Delta 變種病毒來勢洶洶,如果去台北面試時中途被感染,可能又會害到面試官跟自己.... 4.竟然還有公司開app工程師4萬多的薪水,好多雇主都不懂行情啊~一位app工程師多難培養阿,要賺四萬多薪水我還不如去作一些不需要如此花費腦力的工作.薪水雖低一點但不用像app工程師寫程式寫到累的半死.... ----- about Kotlin  Kotlin Playground:   https://developer.android.com/training/kotlinplayground 現在找工作android都要求Kotlin, 但其實Kotlin造成更多混亂... 混亂1: Java 8現在也支援lambda與很多其他新功能...不會比Kotlin差 混亂2: android 工程師需要會java外,又要多學一套Kotlin,當然有時還要會swift/ios, dart/flutter, 基本的c/c++也都要記得. 腦容量不足.目前在google的android官方文件範例中,已經可以見到這種兩種語言並行時產生的混亂,每個重要功能的解說範例,變成需要有java的example, 也需要有Kotlin的範例,缺少任何一種,都會導致對方的擁護者抗議. 這在Stack Overflow上更是產生極多的類似抗議. 混亂3:  在開源社群中 GitHub source code 多了Kotlin分類, 導致原來java的open source 感覺低人一截,開發者對於要開發新版本時,不知道要用java還是Kotlin.....導致open source原始碼產生分支,不統一. 由Kotlin編寫的open source,對原有的j

Flutter: 設置APP版本與構建版本的注意事項,與第一個自己設計的flutter塔羅牌app上架了

圖片
當一個Flutter APP開發完成,我們要打包發佈到App Store和google play store,這時候我們需要設置APP的版本號。 android:   build.gradle file (inside app folder), 但在flutter中,我們不要直接去更改的這邊設定,因為flutter有定義正確的更改方法. defaultConfig { applicationId "xyz.markapp.mytarot" minSdkVersion 16 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } ------- Version name and build number At development time, you can easily find the version name and build number of a Flutter project by inspecting  pubspec.yaml .  Here is an example:  version:   1.0 .0 +2 in the case : the  version name is  1.0.0   and  the  versionCode  /  build number is  2 . ps:  versionCode  在app上架時,不能重複,所以會1.2.3.4.5...一直加上去. --- 然後,學了半年多flutter, 終於第一個flutter app上架到google play app store. google play app link: My Tarot . ios app store app link: My Tarot Card 上架成功,值得慶祝. ----- ps: ios app icon 規格: 現在ios app icon有新規定,1.png 2.不能有透明背景 不然的話會無法上架. --- 大家不要小看這個簡單的app,畢竟這是完全我自己設計的第一個flut