1. 程式人生 > >unavailable function 'system': not available on iOS xcode 升級後 cocos專案報錯

unavailable function 'system': not available on iOS xcode 升級後 cocos專案報錯

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能夠修復這個問題。