我正在尝试开发一个共享扩展,以获取文件(图像,pdf,办公室,文本等),并通过Rest API将其发送到云,但无法将NSItemProvider中的数据转换为NSData。同时,我在使用VS2017调试共享扩展项目时遇到了问题,所以我使用标志和警报代替了老式的做法。我的ViewController代码是这样的
using CoreFoundation;
using Foundation;
using Social;
using System;
using UIKit;
namespace Share
{
public partial class ShareExtensionViewController : SLComposeServiceViewController
{
public string message = string.Empty;
public ShareExtensionViewController(IntPtr handle) : base(handle)
{
}
public override void DidReceiveMemoryWarning()
{
base.DidReceiveMemoryWarning();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
}
public override bool IsContentValid()
{
return true;
}
public override void DidSelectPost()
{
NSItemProvider itemProvider = new NSItemProvider();
try
{
NSExtensionItem item = ExtensionContext.InputItems[0];
if (item != null)
{
message = "NSExtensionItem 1\n";
itemProvider = item.Attachments[0];
if (itemProvider?.HasItemConformingTo(itemProvider.RegisteredTypeIdentifiers[0]) == true)
{
message += "NSItemProvider 2\n";
itemProvider.LoadDataRepresentation(itemProvider.RegisteredTypeIdentifiers[0], (dataRaw, error) =>
{
var data = dataRaw;
DispatchQueue.MainQueue.DispatchSync(() =>
{
message += "NSData 3\n" + error;
if (data != null)
{
message += "dataBytes 4\n";
//byte[] dataBytes = data.ToArray();
}
});
});
}
}
}
catch (Exception ex)
{
message += "\n" + ex.Message + "\n" + ex.StackTrace;
}
message += "\n" + ExtensionContext.InputItems[0].AttributedContentText;
UIAlertController alert = UIAlertController.Create(itemProvider.RegisteredTypeIdentifiers[0], message, UIAlertControllerStyle.Alert);
PresentViewController(alert, true, () =>
{
DispatchQueue.MainQueue.DispatchAfter(new DispatchTime(DispatchTime.Now, 5000000000), () =>
{
ExtensionContext.CompleteRequest(null, null);
});
});
}
public override SLComposeSheetConfigurationItem[] GetConfigurationItems()
{
return new SLComposeSheetConfigurationItem[0];
}
}
}执行只是简单地传递LoadDataRepresentation方法。我尝试了LoadItem,也得到了同样的结果。
求求你,我需要一些帮助。
发布于 2018-10-31 07:43:40
您是否尝试过使用LoadDataRepresentation method(s) of NSItemProvider?
有三个重载:
LoadDataRepresentation(String, Action<NSData, NSError>) : NSProgress
LoadDataRepresentationAsync(String) : System.Threading.Tasks.Task<NSData>
LoadDataRepresentationAsync(String, out NSProgress) : System.Threading.Tasks.Task<NSData>第二个似乎是最简单的,只需用await调用它,您应该会得到一个NSData对象。
编辑:哦,我看到你在使用上面的第一个重载。是否确定dataRaw是有效的NSData对象?您似乎没有检查error是否为null,会不会有遗漏的错误?
https://stackoverflow.com/questions/53071766
复制相似问题