C недавних пор мой старый метод открытия файлов в другом приложении перестал работать на ipad mini и iphone6. Оказалось что Apple ещё с ios 7 представил свой способ передачи файлов Airdrop, он же предоставляет возможность открывать файл в различных приложениях аналогично кнопке Open in. Итак код:
uses
{$IFDEF IOS}
iOSapi.UIKit,
iOSapi.Foundation,
iOSapi.CoreGraphics,
FMX.Helpers.iOS,
Macapi.Helpers,
Macapi.ObjectiveC
{$ENDIF};
procedure Share(const AControl: TControl; filepath: string);
var
objects: NSMutableArray;
controller : UIActivityViewController;
popoverController: UIPopoverController;
url: NSURL;
procedure ShowForPhone;
var
Window: UIWindow;
begin
Window := SharedApplication.keyWindow;
if (Window <> nil) and (Window.rootViewController <> nil) then
Window.rootViewController.presentModalViewController(controller, True);
end;
procedure ShowForPad;
var
Window: UIWindow;
PopoverRect: CGRect;
AbsolutePos: TPointF;
begin
Window := SharedApplication.keyWindow;
if AControl <> nil then
begin
AbsolutePos := AControl.LocalToAbsolute(PointF(0, 0));
if AControl.Scene <> nil then
AbsolutePos := AControl.Scene.LocalToScreen(AbsolutePos);
PopoverRect := CGRectMake(AbsolutePos.X, AbsolutePos.Y, AControl.Width, AControl.Height);
end
else
PopoverRect := CGRectMake(0, 0, 0, 0);
popoverController := TUIPopoverController.Alloc;
popoverController.initWithContentViewController(controller);
popoverController.presentPopoverFromRect(PopoverRect, Window.rootViewController.View, UIPopoverArrowDirectionAny, True);
end;
procedure ShowActionsSheet;
begin
if IsPad then
ShowForPad
else
ShowForPhone;
end;
begin
url := TNSURL.Wrap(TNSURL.OCClass.fileURLWithPath(StrToNSStr(filepath)));
objects := TNSMutableArray.Create;
objects.addObject((url as ILocalObject).GetObjectID);
try
if objects.count > 0 then
begin
controller := TUIActivityViewController.alloc;
controller.initWithActivityItems(objects , nil);
ShowActionsSheet;
end;
finally
objects.release;
objects := nil;
end;
end;
Возможно Вы найдёт для себя что-то лишнее или нагромождённое, но заметьте, этот код подходит и для телефона и для планшета и сделан для быстрого понимания происходящего. Он был "заимствован" и модифицирован из самой RAD Studio из модуля FMX.MediaLibrary.IOS 395 строка. Оригинал же позволял передавать лишь String и TBitmap. Если же Вам нужно передавать именно их, Вы можете открыть этот модуль "C:\Program Files\Embarcadero\Studio\17.0\source\fmx\FMX.MediaLibrary.iOS.pas" и найти в оригинале как это делается.