Share.RequestAsync() 在 MAUI 应用程序中不起作用

问题描述 投票:0回答:1

我使用以下代码在 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)
});

它在我的测试示例项目中运行良好。

maui maui-ios sharefile
1个回答
0
投票

通过同事的分析,我猜测是因为代码中的某个线程影响了它的弹出,但我认为这是一个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)
            });
© www.soinside.com 2019 - 2024. All rights reserved.