我使用以下代码在 iOS 上的 MAUI 中共享文本或文件。它在我的测试示例项目中运行良好。但它在我的其他添加标识符的项目中不起作用,共享对话框不会出现。不知道是不是和标识符有关,查了一些资料,没有找到解决办法。
我已将这些键添加到 Info.plist:
<key>NSPhotoLibraryAddUsageDescription</key>
<string>This app needs access to the photo gallery to save photos and videos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to the photo gallery to save photos and videos.</string>
分享文字:
await Share.Default.RequestAsync(new ShareTextRequest { Text = "Hello word!!!!!", Title = "Share Text" });
共享单个文件:
string fn = "Attachment.txt";
string file = Path.Combine(FileSystem.CacheDirectory, fn);
File.WriteAllText(file, "Hello World");
await Share.Default.RequestAsync(new ShareFileRequest
{
Title = "Share text file",
File = new ShareFile(file)
});
它在我的测试示例项目中运行良好。
通过同事的分析,我猜测是因为代码中的某个线程影响了它的弹出,但我认为这是一个bug,现在我使用ios原生代码来实现这个功能。
public partial class SystemServiceHelper
{
public partial void ShareFile(ShareMultipleFilesRequest request);
}
public partial class SystemServiceHelper
{
public partial void ShareFile(ShareMultipleFilesRequest request)
{
UIViewController viewController = GetTopViewController();
if (viewController != null)
{
var items = new List<NSObject>();
foreach (var file in request.Files)
{
var fileUrl = NSUrl.FromFilename(file.FullPath);
items.Add(GetShareItem(fileUrl, request.Title));
}
UIActivityViewController activityViewController = new UIActivityViewController(items.ToArray(), new UIActivity[] { });
activityViewController.ExcludedActivityTypes = new NSString[] { };
if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone)
{
viewController.PresentViewController(activityViewController, true, null);
}
else
{
UIPopoverPresentationController presentationPopover = activityViewController.PopoverPresentationController;
presentationPopover.SourceView = UIApplication.SharedApplication.KeyWindow;
presentationPopover.SourceRect = request.PresentationSourceBounds;
presentationPopover.PermittedArrowDirections = UIPopoverArrowDirection.Any;
viewController.PresentViewController(activityViewController, true, null);
}
}
NSObject GetShareItem(NSObject obj, string title)
=> string.IsNullOrWhiteSpace(title)
? obj
: new ShareActivityItemSource(obj, title);
}
class ShareActivityItemSource : UIActivityItemSource
{
readonly NSObject item;
readonly string title;
internal ShareActivityItemSource(NSObject item, string title)
{
this.item = item;
this.title = title;
}
public override NSObject GetItemForActivity(UIActivityViewController activityViewController, NSString activityType) => item;
public override NSObject GetPlaceholderData(UIActivityViewController activityViewController) => item;
}
private UIViewController GetTopViewController()
{
UIViewController viewController = UIApplication.SharedApplication.KeyWindow.RootViewController;
while (viewController.PresentedViewController != null)
{
viewController = viewController.PresentedViewController;
}
return viewController;
}
}
使用此服务共享文件:
SystemServiceHelper systemServiceHelper = new SystemServiceHelper();
systemServiceHelper.ShareFile(new ShareMultipleFilesRequest
{
Title = Title,
Files = strings,
PresentationSourceBounds = IsSharePatient && DeviceInfo.Current.Idiom == DeviceIdiom.Tablet
? new Microsoft.Maui.Graphics.Rect((int)(this.Width / 2), (int)this.Height - 50, 0, 0)
: new Microsoft.Maui.Graphics.Rect((int)(this.Width / 8 * 7), (int)this.Height - 50, 0, 0)
});