ReactNative 踩坑之 iOS 原生元件

溫特兒發表於2019-03-02

iOS 中Undefined symbols for architecture x86_64

在原生 iOS 開發中,這個錯誤資訊,應該或多或少的會碰到過:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_XXX", referenced from:
      __XXX in TestClass.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
複製程式碼

這個錯誤資訊的意思大致是:在TestClass裡面有一些不認識的符號,說白了,就是在TestClass這個類裡面的某些方法或者使用的某些類不能被識別,在這個類裡面一一進行排除,不難找到問題所在。

一般解決辦法:新增相應的靜態庫,或者 framework,今天筆者並非要解決 iOS 原生開發的問題,而是解決 ReactNative 中原生元件的問題,如果是解決原生問題,請移步 here

筆者針對友盟推送的 SDK 做了 RN 元件開發,將原生SDK內嵌在元件內,這樣在RN中使用,就不必再關心友盟的 SDK 了,真正做到 ReactNative 外掛化開發。

敲上幾行命令,整個環境已經搭建好,在沒有匯入 SDK 之前,編譯是 OK 的,匯入 SDK 之後編譯也沒問題,實際表現跟自己預想的差不多,這個元件應該很快就會做好。

想法是美好的,現實是殘酷的。

在我寫好呼叫 SDK 內的方法之後,開始編譯,WTF 什麼鬼,這個錯誤什麼情況,嚇得我趕緊去檢查程式碼,該註釋的註釋,該還原的還原。編譯->沒問題啊!

最後通過比對其他工程,最後找到了解決的辦法。因為筆者的元件中使用了友盟 (第三方) framework 才引起的這個編譯問題,所以最後的解決方法就是:Xcode -> Build Settings -> Other Linker Flags 中新增 -framework "xxx",比如你的是 TestDemo.framework,這裡新增的就是 -framework "TestDemo"

PS:在RN專案內的package.json中引用第三方元件使用 "xxx-component": "../xxx/",這樣寫,會連同元件package.json所在當前目錄下所有檔案一起Copy到RN專案node_moudle/xxx-component目錄,RN在執行會報出一些duplicate xxx這樣的錯誤資訊,這個時候,需要在node_moudle/xxx-component這個目錄下刪除不需要的檔案。

如果恰好你碰到了這個問題,又恰好看到了這篇文章,那恭喜你,找對地方了!如果沒有碰到這些煩人的問題,那你簡直太幸運了!

以上希望對你有所幫助 have fun ?

相關文章