unavailable function 'system': not available on iOS xcode 升級後 cocos專案報錯
阿新 • • 發佈:2019-01-26
cocos2dx專案或者cocos creator開發的專案中,當匯出iOS專案之後,正常來說是沒有問題的,但是,當Xcode升級到9.0時,執行Xcode專案會報錯,也就是標題的那個從錯誤,這就有點頭疼了,因為報錯部分是在CCFileUtils.cpp檔案中,這個是cocos生成的檔案,我們一般不會修改這個檔案,但是如果真的出了問題,實在是有點頭疼。在網上找了一下解決方案,終於在官方的論壇裡面找到了,這裡把解決方案搬過來,便於大家溝通和交了。
這裡是官方論壇的連結地址Call to unavailable function ‘system’: not available on iOS官方已經幫忙給出瞭解決辦法,這裡,將官方的辦法重新講解一遍。
對應的是一個GitHub的連結,開啟後,是對CCFileUtils.cpp檔案的相關修改。這裡簡單說一下報錯原因。原因是system命令不可用了,網上查了別的解決辦法,有人說把system(command.c_str()); 改為popen(command.c_str(), “r”);但是我試了一下發現後面的命令也是不可用的,可能我操作有問題吧。。。下面繼續說官方的辦法。官方讓我們對CCFileUtils.cpp檔案進行修改,注意,這裡不能直接把GitHub上面的這個檔案的替換自己專案的該檔案,因為2個專案的這個檔案其實是不一樣的,不同的地方,不僅僅是GitHub上面的變化。
首先找到對應的部分,搜尋
#include <dirent.h>
#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
#include <ftw.h>
#endif
- 1
- 2
- 3
然後在新新增的程式碼下面有下面兩個方法:
bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const
- 1
和
bool FileUtils::createDirectory(const std::string& path)
- 1
在這兩個方法的下面,新增如下程式碼:
namespace
{
#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf)
{
int rv = remove(fpath);
if (rv)
perror(fpath);
return rv;
}
#endif
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
然後緊挨著的下面,有一個方法,叫做:
bool FileUtils::removeDirectory(const std::string& path)
- 1
在方法的開始部分,新增下面內容:
#if !defined(CC_TARGET_OS_TVOS)
#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
if (nftw(path.c_str(), unlink_cb, 64, FTW_DEPTH | FTW_PHYS) == -1)
return false;
else
return true;
#else
- 1
- 2
- 3
- 4
- 5
- 6
- 7
方法結尾處新增下面內容:
#endif // (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
#endif // !defined(CC_TARGET_OS_TVOS)
- 1
- 2
至此,就解決了該問題,對於該問題,我的理解是這裡呼叫了系統底層的刪除目錄的命令,也就是system裡面的方法,但是高版本的系統中,應該是遮蔽掉了這個系統命令,不允許呼叫了,所以,才會出現上面的問題。期待後面版本的cocos引擎或者creator能夠修復這個問題。