2012-10-02 10 views
5

RubyMotionでファイルをダウンロードして解凍する必要があります。私は例を探しましたが、このプロセスのどれも見つけることができませんでした。Rubymotion:iOSでZipファイルをダウンロードして抽出する

私は、リクエストからのすべてのデータである変数(@file)を持っています。そのデータをファイルに書き込んだ後に解凍し、圧縮されていないデータを保持し、tmp圧縮ファイルを削除する必要があります。ここで

は、私がこれまで持っているものです。

class LoadResourcesViewController < UIViewController 


    def viewDidAppear(animated) 
    @loading_bar = retrieve_subview_with_tag(self, 1) 
    req=NSURLRequest.requestWithURL(NSURL.URLWithString("#{someurl}")) 
    @connection = NSURLConnection.alloc.initWithRequest req, delegate: self, startImmediately: true 
    end 

    def connection(connection, didFailWithError:error) 
    p error 
    end 

    def connection(connection, didReceiveResponse:response) 
    @file = NSMutableData.data 
    @response = response 
    @download_size = response.expectedContentLength 
    end 

    def connection(connection, didReceiveData:data) 
    @file.appendData data 
    @loading_bar.setProgress(@file.length.to_f/@download_size.to_f) 
    end 

    def connectionDidFinishLoading(connection)  
    #create tmp file 
    #uncompress .tar, .tar.gz or .zip 
    #presist uncompresssed files and delete original tmp file 

    puts @file.inspect 
    @connection.release 
    solutionStoryboard = UIStoryboard.storyboardWithName("Master", bundle:nil) 
    myVC = solutionStoryboard.instantiateViewControllerWithIdentifier("Main3") 
    self.presentModalViewController(myVC, animated:true) 
    end 

end 

すべてのヘルプや例は、素晴らしいことです!

答えて

3

だから私は解凍と解凍のためにこれを解決しました。解凍する

#UNZIP given you have a var data that contains the zipped up data. 
tmpFilePath = "#{NSTemporaryDirectory()}temp.zip" #Get a temp dir and suggest the filename temp.zip 
@fileManager = NSFileManager.defaultManager() #Get a filemanager instance 
@fileManager.createFileAtPath(tmpFilePath, contents: data, attributes:nil) #Create the file in a temp directory with the data from the "data" var. 

destinationPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, true).objectAtIndex(0) //get the target home for the unzipped files. This MUST be within your domain in order to persist. 

SSZipArchive.unzipFileAtPath(tmpFilePath, toDestination: destinationPath) #Use the SSZipArchive to unzip the file. 
@fileManager.removeItemAtPath(tmpFilePath, error: nil) #Cleanup the tmp dir/files 

あなたはSSZipArchiveのlibが含まれるように持って覚えておいてください。私はココアポッドの代わりにobj-c libを使いました。これはあなたのRakefileに以下の行を追加行うには(あなたは、ベンダー/ SSZipArchiveフォルダにOBJ-Cファイルを置くことを想定):untarしに

app.libs += ['/usr/lib/libz.dylib'] 
app.vendor_project('vendor/SSZipArchive', :static) 

を:あなたが必要となります。この場合

dir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, true) #get target dir for untar'd files 
error_ptr = Pointer.new(:object) 
NSFileManager.defaultManager.createFilesAndDirectoriesAtPath(dir[0], withTarData: data, error: error_ptr) #Create and untar te data (assumes you have collected some tar'd data in the data var) 

Light Untarライブラリ(https://github.com/mhausherr/Light-Untar-for-iOS/)。このlibをインクルードするには、あなたのRakefileに以下を追加してください(ファイルがvendor/unTarにあると仮定します)。

app.vendor_project('vendor', :static, :headers_dir=>"unTar") 
+0

解決策を投稿してくれてありがとう! – sbauch

関連する問題