zoukankan      html  css  js  c++  java
  • AssetsManager 在ios更新失败解决方案

    AssetsManager在安卓平台使用正常,但是到ios就不行了,最后发现是 cocos2dcocos etworkCCDownloader-apple.mm中的

    - (void)URLSession:(NSURLSession *)session task :(NSURLSessionTask *)task
    didCompleteWithError:(NSError *)error 函数有问题,代码如下:

    - (void)URLSession:(NSURLSession *)session task :(NSURLSessionTask *)task
                                didCompleteWithError:(NSError *)error
    {
        DLLOG("DownloaderAppleImpl task: "%s" didCompleteWithError: %d errDesc: %s"
              , [task.originalRequest.URL.absoluteString cStringUsingEncoding:NSUTF8StringEncoding]
              , (error ? (int)error.code: 0)
              , [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]);
    
        // clean wrapper C++ object
        DownloadTaskWrapper *wrapper = [self.taskDict objectForKey:task];
        
        // if no error, callback has been called in finish task
        if (_outer && error)
        {
            std::vector<unsigned char> buf; // just a placeholder
            _outer->onTaskFinish(*[wrapper get],
                                 cocos2d::network::DownloadTask::ERROR_IMPL_INTERNAL,
                                 (int)error.code,
                                 [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding],
                                 buf);
        }
        [self.taskDict removeObjectForKey:task];
        [wrapper release];
    }
    

     如果error为空的话就不会调用_outer->onTaskFinish,好坑爹啊,最后参考新版代码修改如下:

    - (void)URLSession:(NSURLSession *)session task :(NSURLSessionTask *)task
                                didCompleteWithError:(NSError *)error
    {
        DLLOG("DownloaderAppleImpl task: "%s" didCompleteWithError: %d errDesc: %s"
              , [task.originalRequest.URL.absoluteString cStringUsingEncoding:NSUTF8StringEncoding]
              , (error ? (int)error.code: 0)
              , [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]);
    
        // clean wrapper C++ object
        DownloadTaskWrapper *wrapper = [self.taskDict objectForKey:task];
        
        // if no error, callback has been called in finish task
        if (_outer)
        {
            if(error)
            {
                std::vector<unsigned char> buf; // just a placeholder
                _outer->onTaskFinish(*[wrapper get],
                                     cocos2d::network::DownloadTask::ERROR_IMPL_INTERNAL,
                                     (int)error.code,
                                     [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding],
                                     buf);
            }
            else if (![wrapper get]->storagePath.length())
            {
                // call onTaskFinish for a data task
                // (for a file download task, callback is called in didFinishDownloadingToURL)
                std::string errorString;
                
                const int64_t buflen = [wrapper totalBytesReceived];
                char buf[buflen];
                [wrapper transferDataToBuffer:buf lengthOfBuffer:buflen];
                std::vector<unsigned char> data(buf, buf + buflen);
                
                _outer->onTaskFinish(*[wrapper get],
                                     cocos2d::network::DownloadTask::ERROR_NO_ERROR,
                                     0,
                                     errorString,
                                     data);
            }
            else
            {
                NSInteger statusCode = ((NSHTTPURLResponse*)task.response).statusCode;
                
                // Check for error status code
                if (statusCode >= 400)
                {
                    std::vector<unsigned char> buf; // just a placeholder
                    const char *originalURL = [task.originalRequest.URL.absoluteString cStringUsingEncoding:NSUTF8StringEncoding];
                    char cmsg[256];
                    sprintf(cmsg,"Downloader: Failed to download %s with status code (%d)", originalURL, (int)statusCode);
                    std::string errorMessage = cmsg;
                    
                    _outer->onTaskFinish(*[wrapper get],
                                         cocos2d::network::DownloadTask::ERROR_IMPL_INTERNAL,
                                         0,
                                         errorMessage,
                                         buf);
                }
            }
        }
        [self.taskDict removeObjectForKey:task];
        [wrapper release];
    }
  • 相关阅读:
    C++ <cstring> 里的一些常用函数
    Hadoop_第一次作业
    线性回归理解和应用例子
    条款28 :避免返回handles指向对象内部成分
    条款25 :尽可能延后变量定义式的出现时间
    条款21 :必须返回对象时,别妄想返回其reference
    条款16:成对使用new和delete时要采用相同的形式
    条款22 :将成员变量声明为private
    条款13:以对象管理资源
    条款12:复制对象时勿忘其每一个成分
  • 原文地址:https://www.cnblogs.com/gamesky/p/8954329.html
Copyright © 2011-2022 走看看