Delphi -在iOS下使用默认应用程序打开文件或显示应用程序选择器

uklbhaso  于 11个月前  发布在  iOS
关注(0)|答案(1)|浏览(199)

我正在尝试使用我的应用程序打开一个文件。该文件通过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(iOS)上运行该代码时,屏幕的末尾会显示一个你通常期望出现的框。但屏幕上什么都没有。没有应用程序,没有文本,什么都没有。我希望应用程序会出现在这里,让我打开该文件。我的错误在哪里?我寻找Kastri框架,如果有用的东西是实现了那里,但只有一个共享组件,但我不想分享我的文件,我只想在另一个应用程序中显示它。
有人能帮帮我吗?

rn0zuynd

rn0zuynd1#

代码中的一个可能问题是,您正在使用UIDocumentInteractionController的presentOpenInMenuFromRect方法来显示应用程序选取器。但是,此方法需要有效的矩形来指定应从其显示菜单的锚点。在代码中,您正在传递一个空矩形(CGRectFromRect(TCFF.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和必要的权限,您应该能够在所需的应用程序中打开文件或显示应用程序选择器对话框。

相关问题