2016-04-08 3 views
2

В настоящее время мы разрабатываем iOS-приложение с Appcelerator, которое хранит мультимедийные файлы на устройстве для последующего просмотра (pdf, mp4, zipped web pages).Приложение Appcelerator падает при загрузке большого (> 500mb) zip-файла

У нас возникла проблема с файлами выше 500 МБ, которые разбивают приложение на iPhone. Приложение работает над iPad2, но при загрузке этих файлов все iPhone тестировали крах (случайным образом).

Файлы распаковываются (все файлы мультимедиа поставляются с дополнительной информацией внутри архива) через ti.compression.

Код, используемый в (с разбивкой на соответствующие части):

var zipDownloader = Ti.Network.createHTTPClient({ 
'onload' : function() { 
    var tempname = Math.floor((Math.random() * 10000000) + 1); 

    var dir = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, 'tempDownloads', tempname); 
    dir.createDirectory(); 

    filename = '' + tempname + '.zip'; 
    var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'tempDownloads', filename); 
    f.write(this.responseData); 
    var Compression = require('ti.compression'); 

    var zipFileName = Ti.Filesystem.applicationDataDirectory + 'tempDownloads/' + filename; 
    var outputDirectory = Ti.Filesystem.applicationDataDirectory + 'tempDownloads/' + tempname + '/'; 
    var start = Math.floor(Date.now()/1000); 
    var result = Compression.unzip(outputDirectory, zipFileName, true); 
    var finished = Math.floor(Date.now()/1000) - start; 
    f.deleteFile(); 
    Compression = null; 
    this.callback(outputDirectory); 
} 
}); 
zipDownloader.open('GET', url); 
zipDownloader.callback = callback; // given in previous code, not relevant 
zipDownloader.send(); 
+0

У вас есть журнал аварий? – Shawn

+0

@Shawn Спасибо за ваш вопрос, ответ майги решил проблему. – rickkrueger

ответ

3

Установите файл свойство HTTPClient (https://docs.appcelerator.com/platform/latest/#!/api/Titanium.Network.HTTPClient-property-file) вместо того, чтобы писать файл после его загрузки.

Это будет работать для больших файлов, поскольку оно записывает данные непосредственно в файл. В противном случае он попытается сначала кэшировать ваш файл, и ваше приложение может потерпеть крах из-за ошибок памяти. Пробовал его с файлами 500 + МБ

+0

Если вы установите свойство 'file', будет ли' this.responseText' пустым? И 'this.responseData' просто указывает на сохраненный файл, который не загружен в память? – Shawn

+0

не уверен, не пробовал. Но вы можете просто проигнорировать его и просто использовать имя файла, которое вы установили ранее, чтобы получить доступ к файлу (он готов, когда вы находитесь в 'onload' – miga

+0

@miga: Большое спасибо! Это решило проблему. Я полностью игнорировал это в документации , – rickkrueger

Смежные вопросы