Firemonkey开发APP实现分享功能
APP分享功能Firemonkey分享FMX.MediaLibrary.IOS.pasTShareServiceTShowShareSheetActionUIActivityViewController
前言
大家开发APP的时候,都希望内置一个分享功能,方便用户把APP分享给自己的朋友,那么在使用Firemonkey开发App的过程中,如何实现分享的功能呢?
实现方法
借助万能的搜索引擎查阅了一下,在XCode里是可以使用UIActivityViewController组件的,我们Delphi里也可以进行类似UIActivityViewController组件的调用,那么希望自己按照接口的规则去填充一个NSArray的数组,这个可以根据XCode相关的代码翻译过来即可。这里要告诉大家的是我们Delphi里已经对这个功能进行了封装,它封装的类名叫TShowShareSheetAction,是内置在TActionList组件里的。不过遗憾的是TShowShareSheetAction有点小问题,在分享URL的时候会出现无标题的情况,吾八哥我将这个做了个简单的修正,让我们分享的时候可以自己指定这个标题。
代码修正所在的单元FMX.MediaLibrary.IOS.pas,代码如下:
procedure TShareService.Share(const AControl: TControl; const AText: string; const ABitmap: TBitmap); procedure ShowForPhone; var Window: UIWindow; begin Window := SharedApplication.keyWindow; if (Window <> nil) and (Window.rootViewController <> nil) then Window.rootViewController.presentModalViewController(FActivityViewController, 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); FPopoverController := TUIPopoverController.Alloc; FPopoverController.initWithContentViewController(FActivityViewController); FPopoverController.presentPopoverFromRect(PopoverRect, Window.rootViewController.View, UIPopoverArrowDirectionAny, True); end; procedure ShowActionsSheet; begin if IsPad then ShowForPad else ShowForPhone; end; var OCImage: UIImage; TextList: TStringList; begin Assert((ABitmap <> nil) or not AText.IsEmpty); FActivityItems.removeAllObjects; { TODO -o5bug : 修正分享无标题的问题 } if not AText.IsEmpty then begin TextList := TStringList.Create; try TextList.CommaText := AText; case TextList.Count of 1: FActivityItems.addObject((StrToNSStr(AText) as ILocalObject).GetObjectID); 2: begin FActivityItems.addObject((StrToNSStr(TextList[0]) as ILocalObject).GetObjectID); FActivityItems.addObject((StrToNSUrl(TextList[1]) as ILocalObject).GetObjectID); end; end; finally TextList.Free; end; end; if (ABitmap <> nil) and not ABitmap.IsEmpty then begin OCImage := BitmapToUIImage(ABitmap); FActivityItems.addObject((OCImage as ILocalObject).GetObjectID); end; try if FActivityItems.count > 0 then begin ReleaseOldSharingController; FActivityViewController := TUIActivityViewController.alloc; FActivityViewController.initWithActivityItems(FActivityItems , nil); ShowActionsSheet; end; finally if OCImage <> nil then OCImage.release; end; end;
拷贝一份FMX.MediaLibrary.IOS.pas然后做上述改动后,放在工程代码文件夹里即可并且加到library path里即可,外部传参的时候使用换行符进行隔开,如下:
var FShareAction: TShowShareSheetAction; procedure TMaster.ShareURL(const AURL: string); begin FShareAction.TextMessage := '史上最安全的密码管理工具!无广告,无需联网!' + #13#10 + 'http://www.uumima.com/'; FShareAction.Bitmap.Assign(ImgLogo.Bitmap); FShareAction.ExecuteTarget(Self); end;
效果截图:
注:开发环境Delphi10.2.1