gpt4 book ai didi

ios - "Open In"动态生成的文件在 iOS 8 中失败

转载 作者:可可西里 更新时间:2023-11-01 05:12:05 24 4
gpt4 key购买 nike

我使用此代码将一些 PDF 数据保存到文件中,使用“打开方式”菜单将其发送到另一个应用程序,然后在完成后删除该文件:

- (void)openIn:(NSData *)fileData {
// save the PDF data to a temporary file
NSString *fileName = [NSString stringWithFormat:@"%@.pdf", self.name];
NSString *filePath = [NSString stringWithFormat:@"%@/Documents/%@", NSHomeDirectory(), fileName];
BOOL result = [fileData writeToFile:filePath atomically:TRUE];
if (result) {
NSURL *URL = [NSURL fileURLWithPath:filePath];
UIDocumentInteractionController *controller = [[UIDocumentInteractionController interactionControllerWithURL:URL] retain];
controller.delegate = self;
[controller presentOpenInMenuFromBarButtonItem:self.openInButton animated:TRUE];
}
}

- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller {
// when the document interaction controller finishes, delete the temporary file
NSString *fileName = [NSString stringWithFormat:@"%@.pdf", self.name];
NSString *filePath = [NSString stringWithFormat:@"%@/Documents/%@", NSHomeDirectory(), fileName];
[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
}

这在 iOS 8 之前一直运行良好。现在,文件已创建,我可以验证它包含正确的内容,打开菜单出现,我可以选择一个应用程序,委托(delegate)方法运行并清理文件.但是,iOS 并没有像以前那样切换到选定的应用程序并将文件复制到其中,而是在我选择应用程序时“打开方式”菜单简单地关闭,并且文件没有被复制。

如果我为 UIDocumentInteractionController 提供一个现有文件,这将起作用。如果我使用提供的 fileData 但将目标文件名更改为现有文件的文件名,它也会起作用。这表明存在权限问题——就好像在 iOS 8 中创建的新文件具有 UIDocumentInteractionController 无法读取的默认权限。

有谁知道发生了什么以及我该如何解决?

最佳答案

在 iOS 8 中,操作顺序似乎发生了轻微变化。DidDismissOpenInMenu 过去在文件发送完成后运行,但现在在文件开始发送后运行。这意味着我的清理代码有时在文件发送完成之前运行,没有文件要发送。在注意到可以发送较小的文件后,我发现了这一点;显然,对较小文件的处理在我的清理代码获取它们之前就已完成,但对较大文件的处理却没有。

为了确保正确的时间,同时清理当用户打开 DocumentInteractionController 然后在不执行任何操作的情况下关闭 Controller 时创建的文件,我更改了我的方法,如下所示:

- (void)openIn:(NSData *)fileData {
// save the PDF data to a temporary file
NSString *fileName = [NSString stringWithFormat:@"%@.pdf", self.name];
NSString *filePath = [NSString stringWithFormat:@"%@/Documents/%@", NSHomeDirectory(), fileName];
BOOL result = [fileData writeToFile:filePath atomically:TRUE];
if (result) {
self.sendingFile = FALSE;
NSURL *URL = [NSURL fileURLWithPath:filePath];
UIDocumentInteractionController *controller = [[UIDocumentInteractionController interactionControllerWithURL:URL] retain];
controller.delegate = self;
[controller presentOpenInMenuFromBarButtonItem:self.openInButton animated:TRUE];
}
}

- (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application {
// the user chose to send the file, so we shouldn't clean it up until that's done
self.sendingFile = TRUE;
}

- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller {
if (!self.sendingFile) {
// the user didn't choose to send the file, so we can clean it up now
[self openInCleanup];
}
}

- (void)documentInteractionController:(UIDocumentInteractionController *)controller didEndSendingToApplication:(NSString *)application {
// the user chose to send the file, and the sending is finished, so we can clean it up now
[self openInCleanup];
self.sendingFile = FALSE;
}

- (void)openInCleanup {
// delete the temporary file
NSString *fileName = [NSString stringWithFormat:@"%@.pdf", self.name];
NSString *filePath = [NSString stringWithFormat:@"%@/Documents/%@", NSHomeDirectory(), fileName];
[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
}

iOS 11 更新

在 iOS 11 之前,操作系统似乎会保留一份可用的文件副本,直到接收应用程序完成读取它,即使我的清理功能在文件从我的应用程序发送出去后立即运行。在 iOS 11 中,这发生了变化,接收应用程序无法读取文件,因为我的应用程序在完成之前将其删除。所以现在我不是将临时文件保存到 Documents 并使用 openInCleanup 方法立即删除它,而是将临时文件保存到 tmp 并在下次应用启动时清空 tmp 文件夹。这种方法也适用于旧的 iOS 版本。只需删除 openInCleanup,将路径中的 Documents 更改为 tmp,并将其添加到 applicationDidFinishLaunching:

// clear the tmp directory, which will contain any files saved for Open In
NSString *tmpDirectory = [NSString stringWithFormat:@"%@/tmp", NSHomeDirectory()];
NSArray *tmpFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:tmpDirectory error:NULL];
for (NSString *tmpFile in tmpFiles) {
[[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@", tmpDirectory, tmpFile] error:NULL];
}

关于ios - "Open In"动态生成的文件在 iOS 8 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com