我尝试使用我的应用程序打开 A 文件。文件通过 Web 服务传输并以 BASE64 编码保存在本地数据库中。当我在应用程序中显示文件时,我想使用该文件类型的默认应用程序。或者至少我想显示一个应用程序选择器对话框,并让用户选择用于打开文件的应用程序。到目前为止我所拥有的是:
procedure Base64StringToFileAndOpen(const base64String: string; Filename: string);
var
decodedBytes: TBytes;
filePath: string;
fileStream: TFileStream;
interactionController: UIDocumentInteractionController;
NSU: NSURL;
begin
// Decode BASE64 string into bytes
decodedBytes := TNetEncoding.Base64.DecodeStringToBytes(base64String);
// Determine the file path
// NSStrToStr(TNSString.Wrap(NSTemporaryDirectory));
filePath := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetTempPath, Filename);
// Save decoded bytes into a file
fileStream := TFileStream.Create(filePath, fmCreate);
try
fileStream.WriteBuffer(decodedBytes[0], length(decodedBytes));
finally
fileStream.Free;
end;
NSU := TNSURL.Wrap(TNSURL.OCClass.URLWithString(StrToNSStr(PChar(filePath))));
interactionController := TUIDocumentInteractionController.Wrap(TUIDocumentInteractionController.alloc.init);
interactionController.setURL(NSU);
interactionController.setUTI(StrToNSStr('public.data'));
interactionController.presentOpenInMenuFromRect(CGRectFromRect(TRectF.Empty), SharedApplication.keyWindow.rootViewController.view, true);
end;
当我在 iPhone 上运行该代码时,屏幕末端会显示一个像您通常期望的那样的框。但那个屏幕上什么也没有。没有应用程序,没有文本,什么都没有。我希望应用程序出现在这里,让我打开该文件。我的错误在哪里?我寻找 Kastri 框架,如果那里实现了一些有用的东西,但只有一个共享组件,但我不想共享我的文件,我只想在另一个应用程序中显示它。
有人可以帮我吗?
代码中的一个可能的问题是您正在使用 UIDocumentInteractionController 的presentOpenInMenuFromRect 方法来显示应用程序选择器。但是,此方法需要一个有效的矩形来指定应显示菜单的锚点。在您的代码中,您传递了一个空矩形 (CGRectFromRect(TRectF.Empty)),这可能会导致问题。
要解决此问题,您可以尝试为锚点提供有效的矩形。例如,您可以将视图控制器视图的边界作为矩形传递:
var
anchorRect: CGRect;
rootView: UIView;
begin
// ...
rootView := SharedApplication.keyWindow.rootViewController.view;
anchorRect := rootView.bounds;
interactionController.presentOpenInMenuFromRect(anchorRect, rootView, true);
通过提供有效的矩形,应用程序选择器应该正确显示。
此外,请确保您已为尝试打开的文件设置适当的文档类型 (UTI)。在您的代码中,您将其设置为“public.data”,这是一个通用类型。您可能需要使用与您正在使用的文件类型相对应的特定 UTI。例如,如果您正在使用 PDF 文件,则可以使用“com.adobe.pdf”作为 UTI。
确保您已在项目中导入必要的框架,例如 MobileCoreServices.framework,以处理 UTI。
最后,仔细检查您的应用程序是否具有打开文件并与其他应用程序交互所需的权限和权利。
通过解决这些问题并确保您拥有正确的 UTI 和必要的权限,您应该能够在所需的应用程序中打开文件或显示应用程序选择器对话框。