Call to unavailable function 'system': not available on iOS問題的解決方案

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>,而後,在下面添加下面的代碼:ios

#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
#include <ftw.h>
#endif

而後在新添加的代碼下面有下面兩個方法:git

bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const

github

bool FileUtils::createDirectory(const std::string& path)

在這兩個方法的下面,添加以下代碼:spa

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
}
  • 而後緊挨着的下面,有一個方法,叫作:
bool FileUtils::removeDirectory(const std::string& path)

在方法的開始部分,添加下面內容:code

#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

方法結尾處添加下面內容:開發

#endif // (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
#endif // !defined(CC_TARGET_OS_TVOS)

至此,就解決了該問題,對於該問題,個人理解是這裏調用了系統底層的刪除目錄的命令,也就是system裏面的方法,可是高版本的系統中,應該是屏蔽掉了這個系統命令,不容許調用了,因此,纔會出現上面的問題。期待後面版本的cocos引擎或者creator可以修復這個問題。rem

相關文章
相關標籤/搜索