2016-03-30 18 views
0

Seçili fotoğrafımı app 'iphone fotoğraf galerisinden yerel depolama alanına kaydetmek için paylaşım uzantısına sahip bir uygulama yazıyorum. NSData WriteToFile, YES'i döndürür, ancak saklanan dosyayı yazarken yol verdiğim dizine bulamadım. Yani, kısaca NSData WriteToFile verilen bir yolda bir fotoğraf kaydetmek için başarısız olur.NSData WriteToFile Paylaşım uzantısı aracılığıyla bir fotoğraf kaydedilirken başarısızlık Uzantısı

Kodum aşağıda.

- (IBAction)acceptButtonTapped:(id)sender 
{ 
    __block UIImage *photo; 
    for (NSExtensionItem *item in self.extensionContext.inputItems) 
    { 
     for (NSItemProvider *itemProvider in item.attachments) 
     { 
      if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) 
      { 
       [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) { 
        if(image) 
        { 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          photo = image; 

          NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 

          [formatter setDateFormat:@"yyyy_MM_dd_hh_mm_ss"]; 

          NSString *fileName; 

          fileName = [NSString stringWithFormat:@"%@.jpeg",[formatter stringFromDate:[NSDate date]]]; 

          dataPath = [dataPath stringByAppendingPathComponent:fileName]; 
          NSData * imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)]; 
          BOOL isdone = [imageData writeToFile:dataPath atomically:NO]; 
          NSLog(@"%u", isdone); 
         }); 
        } 
       }]; 
       break; 
      } 
     } 
    } 

    [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil]; 
} 

Herhangi bir Yardım çok yararlı olacaktır.

Teşekkür ederiz.

+0

Lütfen 'dataPath' öğesini doğrulayın, yani DocumentDirectory gibi yerel depolamanızın yolunu içeriyor mu? –

+0

DocumentDirectory'de, DocumentDirectory içinde bir klasör oluşturdum ve içine fotoğraf saklıyorum. Bununla ilgili herhangi bir sorunu var mı? –

+0

Yolunuzu simülatördeki hata ayıklama konsoluna kaydedin, daha sonra dosya adının tamamını panoya kopyalayın, bulucuya gidin, G komutuna basın ve yolu "Klasöre git" iletişim kutusuna yapıştırın. Ne olduğunu görün. Ayrıca, "applicationDidFinishLaunching" belgesindeki dizin dizinine giden yolu günlüğe kaydedin ve yolunuzun bu dizindeki bir dosyaya işaret ettiğinden emin olun. –

cevap

1

Paylaşım uzantısından Document dizinine erişmeye çalışıyorsanız, NO bunu yapamazsınız. Paylaşım uzantısı veya diğer widget'lar, kendi uygulamalarından ayrı bir uygulamadır ve bu nedenle kendi sanal alanlarına sahiptir. Bu yüzden dosyaları paylaşmak için Uygulama Gruplarını kullanmanız gerekecektir.

Uygulama grupları, öncelikle özellikle genişletilmiş dosyalar için uzantıları hedef alır.

NSFileManager

bunun containerURLForSecurityApplicationGroupIdentifier üzerinde bir yöntemi vardır: Uygulamalarınızdan

NSURL *containerURL = [[NSFileManager defaultManager] 
      containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"]; 

erişebileceğiniz çünkü bu konuma dosyaları kaydedebilirsiniz App Grupları açarken oluşturduğunuz tanımlayıcı geçmek nerede hem uzantıdan hem de ana bilgisayar uygulamasından paylaşılan uygulama grupları.

+0

Evet, kapsayıcı URL hakkında haklısınız, ancak herhangi bir dosyayı bu URL'de sakladığımda her seferinde başarısız oluyor. Herhangi bir dizin yapmam ve sonra saklamaya mı ihtiyacım var? Bu tür bir dosya veya dizinin bulunmadığı bir hata olduğunu gösterir –

+0

Uygulama araçları grubunu, hem widget hem de ana makine uygulaması için ortak olması gereken, Proje yetenekleri sekmesinde oluşturmanız gerekir. Yukarıdaki kodda oluşturulan uygulama grubu tanımlayıcı adını değiştirin. O zaman işe yaramalı. –

0

Veri geçişini, her geçişte, döngüden başka bir dosya adı ekleyerek değiştiriyorsunuz. Bu, tüm dosya adlarını içeren, sürekli gelişen bir dizi kötü şekilde oluşturulmuş yollar yaratacaktır.

Bunu yapma. Yeni bir yerel değişken filepath oluşturun ve

filePath = [docsPath stringByAppendingPathComponent: filename]; 

senin yolunu ve BT AT GÖZ Log kullanarak FilePath içine bir dosya adı oluşturmak. Programınız beklendiği gibi davranmıyorsa, varsayımlarınızdan hiçbirine güvenmeyin, çünkü bir veya daha fazlası yanlış olabilir.