2016-03-29 13 views
7

Uygulama deposunda, çevrimdışı kullanım için aygıtta kalması gereken görece büyük dosyaları karşıdan yükleyebileceğiniz bir iOS uygulamasına sahibim. Bu dosyalar şu anda uygulamanın Documents klasöründe saklanır, ancak şimdi sadece Documents klasörünün yedeklendiğini okuyorum ve sadece kullanıcı tarafından oluşturulan içerik için kullanılmalıdır. This Apple technical Q&A, NSURLIsExcludedFromBackupKey'un yedeklemeyi önlemek için ayarlanması gerektiğini belirtir. This, bir uygulamanın /Library/Caches'un bu tür dosyaları yerleştirmek için doğru yer olduğunu belirtir; daha fazla okuma, aygıtın bu uygulama için kabul edilemez olan depolama alanı doluyken klasörün silinebileceğini önerir. /Library/Application Support/'un onlar için en iyi yer olduğuna inanıyorum - bu doğru mu?Belgeler'e indirilen ve iCloud'a yedeklenen büyük dosyalar

Maalesef, bu hata uygulama inceleme sürecinden geçti. Kullanıcıların uygulamayı kullandığı ve zaten bazı dosyalarının zaten Documents klasörüne ve yedeklerine devam ettiği için bunu düzeltmek için bazı en iyi yöntemler nelerdir? Tüm mevcut dosyaları taşımalı ve uygulama güncellemesinde NSURLIsExcludedFromBackupKey'u ayarlamam gerekiyor. Bunun tam olarak bir kez yapıldığını ve kesintiye uğramadığını nasıl garanti ederim? Dosyaları Documents klasöründen kaldırmak önemli mi yoksa onları orada bırakabilir miyim? Dosyaların yedekleme durumunu değiştirerek bunları mevcut yedeklerden kaldıracak mı?

Swift 2.1.1 kullanıyorum ve iOS 8.0+ hedefliyorum.

cevap

2

Teknik Q & A'da belirtildiği gibi, en iyi seçim Belgeler'de bir alt dizin oluşturabilir ve bu alt dizini bir kez hariç tutabilirsiniz.

+0

Teşekkürler, @Allen. Dosyalar zaten tek bir klasördeydi, bu yüzden onları hariç tuttum ve uygulama incelemesinden geçtim. [NSURL belgeleri] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/#//apple_ref/doc/constant_group/Common_File_System_Resource_Keys) "Bazı işlemlerin yaygın olarak yapıldığını belirtir. kullanıcı belgelerine, bu özelliğin sıfırlanmasına neden olur ve sonuç olarak, bu özelliği kullanıcı belgeleri üzerinde kullanmayın. Şimdilik, her uygulama lansmanında dizini hariç tutuyorum, ancak ideal görünmüyor. –

+0

endişelenmeyin, kullanmak istediğiniz alt dizini değil, Belgeler klasörüne uygulanır ve iOS'ta hatırlarsanız, başka hiç kimse uygulamanızın ortamına erişemez. – Allen

+0

Belgeler klasöründe dosya bırakmak ve dosyalarınızın durumunu değiştirerek bunların varolan yedeklemelerden (muhtemelen değil mi?) Değiştirilip değiştirilmeyeceğine dair daha fazla ayrıntı eklemek için Tamam'ı doğrulayan bir kaynak ekleyebiliyorsanız, cevabı kabul edebilirim. –

2

Çalıştırırken uygulamanızın çökmesini garanti edemeyeceğinizden, bir kez 'bunu bir kez yapıp tamamlandığından emin olun' yazabileceğinizi sanmıyorum. Tamamlandığından emin olduğunuzda bir tamamlama bayrağını kesinlikle ayarlayabilirsiniz, böylece bir kez bittiğinde tekrar çalıştırmak zorunda kalmazsınız.

Dizininizi tek tek değil, yedeklemeden hariç tutun. Xcode itibaren : Bir yedekleme gerekli değildir önbellek ve diğer uygulama destek dosyaları dışlamak için bu özelliği kullanabilirsiniz

. Genellikle kullanıcı belgelerinde yapılan bazı işlemler bu özelliğin yanlışlığa sıfırlanmasına neden olur; sonuç olarak, bu özelliği kullanıcı belgelerinde kullanmayın.

- (BOOL)moveAllFiles{ 

    // Searches through the documents directory for all files ending in .data 
    BOOL success = true; 
    NSString *myNewLocation = @"/store/my/files/here/now"; 

    // Get the documents directory 
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDirectory = [documentDirectories objectAtIndex:0]; 

    // Get all files ending in .data (whatever your file type is) 
    NSArray *dataFilesArray = [NSArray arrayWithArray:[NSBundle pathsForResourcesOfType:@"data" inDirectory:documentDirectory]]; 
    // If you have multiple resource types, use this line once each for each resource type, then append the arrays. 

    // Iterate the found files 
    NSString *fileName = [NSString string]; 
    for (int i=0; i<[dataFilesArray count]; i++) { 
     fileName = [[dataFilesArray objectAtIndex:i] lastPathComponent]; 

     // Move file, set success to false if unsuccessful move 
     if (![[NSFileManager defaultManager] moveItemAtPath:[dataFilesArray objectAtIndex:i] 
                toPath:[myNewLocation stringByAppendingPathComponent:fileName] 
                error:nil]) { 
      success = false; // Something went wrong 
     } 
    } 
    return success; 
} 
: - (. Ben hızlı bir adam değilim Umarım bu size fikir verecektir amaç-c üzgünüm, onun) İşte

Ben iyi sonuçlar ile kullandık stratejidir

Şimdi, kullanıcı varsayılanları dosyasında bir anahtar ayarlamak için başarı değerini kullanın. Başlangıçta bu anahtarı kontrol edin. Eğer yanlış (veya yok) ise, bu rutini (tekrar) çalıştırın.

Bu örnek dosya yollarıyla birlikte. İsterseniz aynı şeyi dosya URL'leriyle de yapabilirsiniz.

+0

Teşekkürler, @Peter. Şu an için yaptığım şey, indirilen dosyaları yedeklenmeyecek şekilde saklayan Belgeler dizini klasöründe işaretlenir. Dosyaları taşımam gerekip gerekmediğini veya onları oldukları gibi bırakıp bırakamayacağımı kesin bir cevap bulamıyorum. Aldığınız pasajda "bu özelliği kullanıcı dokümanlarında kullanmayın" yazıyor, ancak teknik soru ve cevap yazabilirsiniz. Bu konuda başka bir belge buldunuz mu? –

+0

Bence işe yarayacak. Resmi olmayan yedek dosyalarının dosyalarda kullanılıp kullanılmayacağı konusunda çelişkili bir örnek buldum, ancak yukarıdaki pasajın bunu yapmamasının bir nedeni olduğunu (bayrak kullanıcı etkileşimi ile değiştirilebileceğini) göz önüne aldım. dizin ile sopa için en ihtiyatlı yol olurdu. – Peter

İlgili konular