分類
React Native

[React Native] 無法安裝App 因為無法驗證其完整性

Situation

使用企業內部 Ad Hoc 方式打包 ipa 後,iPhone 13 – iOS 15.5 安裝 ipa 時發生以下錯誤訊息

無法安裝App,因為無法驗證其完整性

已經確認在 Apple Develop 的 Devices 已加入裝置的UDID,但還是無法安裝 App

Action

首先可以透過 ipa_analyzer 檢查.ipa 檔允許安裝的裝置清單,如果裝置不在安裝清單中,基本上就可以確認問題了。

A.安裝 ipa_analyzer

開啟終端機輸入 gem install ipa_analyzer

B.使用 ipa_analyzer 檢查 .ipa

在終端機輸入 ipa_analyzer -i /path/xxx.ipa -p --info-plist --prov

輸出內容應該有個 “ProvisionedDevices” 區塊,檢查該區塊中是否有裝置UDID,沒有的話代表.ipa檔無法提供給裝置安裝。

C.解決方式尚待釐清(還不確定)

1.在 Xcode -> Preference -> Download Manual Profiles (可能要多按幾次)

2.在 ~/Library/MobileDevice/Provisioning Profiles/ 就會出現剛剛下載的Profile,可以預覽Profile其中的內容,應該會有最新加入的Devices

3.滑鼠右鍵雙擊剛剛下載的Profile,讓Xcode去套用它

4.使用 Xcode 重新 build 專案

5.這次產生的.ipa 應該就可以安裝到新裝置上了

Result

錯誤訊息不再出現,新打包的 .ipa 檔可以安裝在新裝置。

分類
git 使用紀錄

[git] Personal Access Token

Situation

對 github remote 進行操作時,出現以下錯誤訊息

remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.

簡單的說就是 github密碼驗證在 2021 年 8 月 13 日移除。請改用Personal Acces Token。接下來說明如何產生PAT(Personal Access Token)和如何使用PAT
(也可參考官網)

Action

如何產生PAT

  • 首先登入你的github帳號頁面->點擊右方個人圖示 -> 點擊下方的Settings
  • 在Settings頁面的左欄位的最下方應該有個 Developer settings,點擊它!
  • 在Developer Settings頁面的左欄位應該有個 Personal access tokens,點擊它!
  • 這裡就是Personal Access Token頁面,可以在這裡進行PAT的相關操作
    (點擊 Generate new token)
  • 在Note填入相關資訊 / 在Expiration選擇有效期限 / 在Select scopes 勾選 scopes
  • 最後勾選最下方的 Generate token
  • 自動回到Personal access Token頁面,有個綠底打勾的字串,請把它複製保存好(離開這個頁面後就不再出現了)

如何使用PAT

基本上PAT就是用來取代操作 github remote時密碼的作用。輸入密碼的位置改輸入PAT的內容即可!

Result

git remote 的操作可以成功進行,不再出現Situation的錯誤訊息

分類
React Native

[React Native] xcrun: error: unable to find utility “instruments”, not a developer tool or in PATH

Situation

使用 React Native 0.55.4 搭配 Xcode 13 執行 npx react-native run-ios 出現以下錯誤訊息,

xcrun: error: sh -c '/xxx/Xcode/Xcode_13.app/Contents/Developer/usr/bin/xcodebuild -sdk /xxx/Xcode/Xcode_13.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -find instruments 2> /dev/null' failed with exit code 17664: (null) (errno=Invalid argument)

xcrun: error: unable to find utility "instruments", not a developer tool or in PATH

重點在於 xcrun: error: unable to find utility “instruments”, not a developer tool or in PATH

Action

出現以上錯誤的原因在於Xcode 13的 xcrun 已經沒有 instruments 參數,可以使用 xcrun simctl list 來取代。

接著說明如何修改以及修改哪個檔案。

首先當你輸入 npx react-native run-ios 指令後,node 會執行ReactNative專案目錄/node_modules/react-native/local-cli/runIOS/runIOS.js。(這也是我們要修改的檔案)

打開 ReactNative專案目錄/node_modules/react-native/local-cli/runIOS/runIOS.js,移動到下方區塊

const devices = parseIOSDevicesList(
   child_process.execFileSync('xcrun', ['instruments', '-s'], {encoding: 'utf8'})

這就是出問題的位置。把 execFilesync方法的第2個參數改為 ['simctl', 'list'] 即可,如下

  child_process.execFileSync('xcrun', ['simctl', 'list'], {encoding: 'utf8'})

Result

錯誤訊息不再出現,通過編譯!!

分類
React Native

[React Native] Cannot initialize a parameter of type ‘NSArray *’ with an lvalue of type ‘NSArray> *__strong’

Situation

使用Xcode 13建置React Native專案的iOS項目出現錯誤訊息,發生在ReactNative專案/node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm,如下

Cannot initialize a parameter of type 'NSArray<Class> *' with an lvalue of type 'NSArray<id<RCTBridgeModule>> *__strong'

Action

解法參考 https://www.jianshu.com/p/7d78792ef9d8

注意以上解法有分版本,我的情況為低版本。解法為修改 RN專案/node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm – line.634 如下

//- (void)_initModules:(NSArray<id<RCTBridgeModule>> *)modules 改為下方
- (void)_initModules:(NSArray<Class> *)modules

Result

錯誤訊息不再出現!

分類
React Native

[React Native] ld: in /xxx/AppCenter(MSChannelUnitConfiguration.o) building for iOS Simulator , but linking in object file built for iOS, File xxx for architecture arm64

Situation

使用Xcode 13建置ReactNative專案的iOS目錄(執行Xcode的Build)後且在建置過程出現以下錯誤訊息

ld: in /ReactNativeProject/ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/AppCenter(MSChannelUnitConfiguration.o), building for iOS Simulator, but linking in object file built for iOS, file '/ReactNativeProject/ios/Pods/AppCenter/AppCenter-SDK-Apple/iOS/AppCenter.framework/AppCenter' for architecture arm64

Action

解法參考 https://stackoverflow.com/questions/63607158/xcode-building-for-ios-simulator-but-linking-in-an-object-file-built-for-ios-f

簡單的說就是到Xcode的Build Settings -> Excluded Architectures -> 加入Debug 和 Release 為 Any iOS Simulator SDK 等於 arm64 的設定,如下

Result

錯誤訊息不再出現

分類
Uncategorized

[Tool] 跨裝置共享滑鼠鍵盤軟體 – Synergy

因為工作的關係,我最少也會使用3台實體裝置(Win + Mac + Ubuntu)。

但在不同實體裝置之間共享鍵鼠其實是相當麻煩的事,我也嘗試過KVM,KVM最大的缺點說是你必須空出一隻手點擊切換按鈕,而且切換按鈕點久了壞掉也等同整組KVM掛掉。

所以大概在5~6年前我就找到Synergy作為共享鍵鼠的工具(那時候還有免費版,現在應該已經沒了)

以下為Synergy的推坑文,先說兩個重要的前置條件,

首先沒有免費版,一般個人版大約800多台幣,專業版1000多台幣。(我是用一般個人版)。官網售價

第二,要共享鍵鼠的裝置必須處於同個區網,也就是說遠端就沒辦法了。

接下來就是基本的使用過程。

Step 1.首先到官網下載並安裝Synergy,安裝完就會提示你輸入License,License可在你的官網帳號資訊取得。(當然,前提是你已經在官網註冊帳號並付費完成)

Step 2.在每台你想共享的裝置重複Step 1.步驟

Step 3.決定並在Synergy上設定“主要分享裝置“及”其他共享裝置“。這個”主要分享裝置“就是實體的鍵鼠安裝的裝置。至於”其他共享裝置“則會共享”主要分享裝置“的鍵鼠。

預設只要讓主要分享裝置和其他共享裝置位於同一個區網並勾選哪個是”主要分享裝置”,哪個是”其他共享裝置“即可。不必調整任何IP設定,設定非常間單!(官網設定連結)

Step 4.開始使用!

預設的使用方式只要把滑鼠移到目前裝置的螢幕以外位置,就會自動進入其他裝置。你也可以自行設定熱鍵方便跳轉不同裝置

分類
React Native Uncategorized

[React Native] React Native version mismatch

Situation

終端機輸入 npx react-native run-ios 後,啟動iOS模擬器出現錯誤訊息 “React Native version mismatch”

Action

關閉所有終端機並重新開啟位於專案根目錄的終端機

Result

在新開啟的終端機輸入 npx react-native run-ios,不再出現該訊息

分類
iOS

[IOS] 需要更新「App名稱」此App的開發者需要更新App才能與此IOS版本搭配使用

Situation


iPhone(iOS 15) 安裝App之後出現以下錯誤訊息

需要更新「App名稱」此App的開發者需要更新App才能與此IOS版本搭配使用

點擊確定之後程式無法執行,只能保留或刪除。詳細原因可以參考這裡

但解法還必須加上這篇 

以下為重點摘要

出現該問題的原因是使用iOS 15, iPadOS 15, tvOS 15, and watchOS 8的裝置在執行安裝檔之後會檢查安裝檔是否有包含DER(Distinguished Encoding Rules)檔案,若沒有包含DER就會出現以上的錯誤訊息。

而Xcode13或以上版本在編譯過程中預設就會加入DER(Distinguished Encoding Rules)檔案,所以不必調整。但Xcode版本若小於13,編譯過程中不會加入這個DER檔,因此我們就必須使用其他方式加入。

目前Survey有以下幾個解法可以選擇

  • 1.將Xcode直升13:

限制是Xcode 13的最低Mac OS 為Big Sur 11.3。如果你的Mac太舊,基本上沒辦法升到Big Sur 11.3。

除非是透過Patch方式強制升級,但Patch之後就個人感覺而言系統極不穩定,很常出現自動關機或藍屏(沒錯! Mac也會藍屏)。之後就再也開不起來。

  • 2.一鍵resign軟體:

該軟體號稱可以幫你一鍵resign解決問題。但問題是你根本不知道該軟體做了什麼事。對於安全性有極大的隱憂。

  • 3.自行手動resign:

也是本篇的重點,基本上你會了解發生什麼事,如何解決。(順利的話 3 行指令可解決!)

Action

如果不想詳細了解問題或解法,可以按照以下步驟來解決。

  • 1.建立測試用資料夾並拷貝.ipa檔

建立一個空的資料夾(test_resign)並把出現錯誤訊息的.ipa檔(old.ipa)複製到test_resign中

  • 2.重新命名old.ipa為old.zip

滑鼠右鍵點擊old.ipa -> 重新命名 -> old.zip

  • 3.解壓縮old.zip

滑鼠右鍵點擊old.zip -> 打開檔案的應用程式 -> 封存工具程式 -> 解壓縮完成後出現Payload目錄

  • 4.查詢可用的codesign identities

開啟終端機先移動到test_resign目錄,再輸入

security find-identity -v -p codesigning


從出現的結果中挑選”Apple Distribution”的identity,只要記住40碼的數字即可

  • 5.使用codesign工具resign app

終端機輸入

codesign -s "第4步驟查到的40碼數字" -f --preserve-metadata --generate-entitlement-der 
./Payload/app名稱.app


應該會出現以下訊息,直接忽略它!

Warning: default usage of –preserve-metadata implies “resource-rules” (deprecated in Mac OS X >= 10.10)!

  • 6.將Payload目錄壓縮為.ipa檔

終端機輸入

zip -ru resignedApp.ipa Payload


(resignedApp可自行定義)

  • 7.完成

最後resignedApp.ipa就是重新簽名的app了

Result

在iPhone安裝重新簽名後的App,錯誤訊息 “需要更新「App名稱」此App的開發者需要更新App才能與此IOS版本搭配使用“ 不再出現,App也可正常執行。

分類
Delphi

Delphi 翻新之旅 – 啟程

公司有一套大約10~15年的物料管理兼APQP兼WIP以及一些阿撒不魯組合的Delphi應用程式。

經手開發者不詳,文件也不詳(感覺一整個就是不祥)。

因為目前唯一Maintainer(老D大)也是要退休的年紀,只好抓幾個勇者當先驅,準備轉WinForm。

小弟當仁不讓(來不及跑)也列隊在勇者中。

不過,想當勇者還得看本事,老D大給的第一個勇者試煉就開始啦!

解任務前當然要先準備武器和防具,所以小弟找了一些Delphi電子書和安裝Delphi7
(推薦 Delphi 7 基础教程.宋一兵 / Delphi 7应用教程.童爱红)

再花1~2天寫個哈囉握來掌握基本語法和特性,就可以開始打怪啦。

哈囉握

初步了解Delphi之後,我只能說Delphi是個嚴謹(繁瑣)的語言。

除了事件驅動和基本型別跟C#差不多以外,剩下的就是一堆特色(限制)。比如說

  • 宣告順序是變數 : 型別 -> first: Integer;
  • 方法分為 function 和 procedure
  • 左右大括號變成 begin 和 end
  • 判斷式要加上 then
  • 區域變數必須寫在方法的開頭
  • 賦值的寫法為 :=

諸如此類等等,但只要有寫過微C#或微Winform,再花一點時間熟悉特性,要上手其實也不太困難。

分類
JavaScript

[JavaScript] window.location.href 不支援 Chrome

Situation:

在 Chrome 使用 window.location.href(“xxx.aspx”) 無法跳轉 xxx.aspx,但在 IE 可以!

Action:

改用 window.location.assign(“xxx.aspx”) 在 Chrome 和 IE 都可使用!

Result:

可成功在 IE 和 Chrome 跳轉