0

私は、選択した写真をiphoneフォトギャラリーから自分のアプリのローカルストレージに保存する拡張機能を持つアプリを書いています。 NSData WriteToFileはYESを返しますが、書き込み中にパスを渡したディレクトリに格納されたファイルが見つかりませんでした。 したがって、短いNSData WriteToFileは、指定されたパスに写真を保存できません。NSData WriteToFileがギャラリーからShare Extension経由で写真を保存するときに失敗する

以下は私のコードです。

- (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]; 
} 

どのようなヘルプでも相当な評価が得られます。

ありがとうございます。

+0

'dataPath'を確認してください。つまり、DocumentDirectoryのようなローカルストレージのパスが含まれていますか? –

+0

それはDocumentDirectoryにあり、私はDocumentDirectoryの中にフォルダを作成しており、その中に写真を保管しています。それに何か問題がありますか? –

+0

シミュレータ上のデバッグコンソールへのパスを記録し、ファイル名以外のすべてをクリップボードにコピーし、ファインダに移動し、コマンドシフトGを押してパスを[フォルダに移動]ダイアログボックスに貼り付けます。何が起こるか見る。 'applicationDidFinishLaunching'のドキュメントディレクトリへのパスも記録し、パスがそのディレクトリ内のファイルを指していることを確認してください。 –

答えて

1

共有ディレクトリの拡張子からドキュメントディレクトリにアクセスしようとしている場合は、NOはできません。共有の拡張機能やその他のウィジェットは、アプリを含むアプリケーションとは別のアプリケーションであるため、独自のサンドボックスを持ちます。したがって、ファイルを共有するにはApp Groupsを使用する必要があります。

アプリケーショングループは、主に拡張機能、具体的にはウィジェットの対象となります。

NSFileManager

containerURLForSecurityApplicationGroupIdentifierの方法があります:あなたは、アプリ

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

あなたがアクセスすることができますので、あなたは、この場所にファイルを保存することができますためのアプリケーショングループをオンにしたときに作成した識別子を渡すことができる場所拡張アプリとホストアプリの共有アプリケーショングループ。

+0

はい、あなたはコンテナURLについては正しいですが、そのURLにファイルを保存すると毎回失敗します。ディレクトリを作成して保存する必要がありますか?そのようなファイルやディレクトリがないというエラーが表示されます –

+0

[プロジェクトの機能]タブでAppグループを作成する必要があります。これはウィジェットとホストの両方で共通する必要があります。上記のコードで作成したアプリケーショングループ識別子の名前を変更します。そうすればうまくいくはずです。 –

0

ループを通過するたびにdataPathを変更し、別のファイル名を追加します。それはすべてのファイル名を含むひどく形成された一連の経路を生み出します。

しないでください。新しいローカル変数filePathにを作成し、

filePath = [docsPath stringByAppendingPathComponent: filename]; 

を使用してfilePathににファイル名を構築し、あなたのパスとIT AT LOOKをログに記録します。あなたのプログラムが期待どおりに動作しないときは、1つ以上が間違っているかもしれないので、あなたの前提を信頼しないでください。

関連する問題