Xamarin iOS post 图片到 Instagram
Xamarin iOS post image to Instagram
目标:使用 iOS 本机方法,将用户制作的图片推送到他们在 C# 中的 Instagram 源上。
public bool ShareImage(byte[] imageByte)
{
bool result = false;
//string fileName = "xxx.png";
//string path = Path.Combine(FileSystem.CacheDirectory, fileName);
//File.WriteAllBytes(path, imageByte);
NSData data = NSData.FromArray(imageByte);
UIImage image = UIImage.LoadFromData(data);
//NSUrl url = NSUrl.FromString($"instagram://library?AssetPath={path}"); // Only opens
NSUrl url = NSUrl.FromString($"instagram://library?LocalIdentifier={1}");
if (UIApplication.SharedApplication.CanOpenUrl(url))
{
UIApplication.SharedApplication.OpenUrl(url);
}
return result;
}
据我所知,我必须这样做的方法是将我的图像保存到设备并为此获取一个本地标识符。
我是根据我看到的 objective-c 代码片段构建的。共享照片仅适用于安装的本机应用程序,正如我从使 facebook 模块正常工作的试验中了解到的那样。
编辑:使用来自 iOS 照片命名空间的 PHAssetChangeRequest 不起作用。
一位同事向我指出了保存然后使用照片选择器获取本地标识符的 PHAsset 的可能性。但这是一个额外的步骤,我不希望应用程序的用户通过。最好只删除 Instagram 支持,因为我可以通过如下所示的通用共享方法。这种方法的缺点是用户必须选择要共享的媒体。
public async void ShareImage(byte[] imageByte)
{
string fileName = "xxx.png";
string path = Path.Combine(FileSystem.CacheDirectory, fileName);
File.WriteAllBytes(path, imageByte);
await Share.RequestAsync(
new ShareFileRequest()
{
File = new ShareFile(path),
Title = "xxx"
}
);
}
编辑 2
尝试了使用 UIDocumentInteractionController 的不同方式,但它没有显示任何内容,也没有显示 posting,它没有抛出任何异常来给我任何关于我做错了什么的线索。
public bool ShareImage(byte[] imageByte)
{
bool result = false;
string fileName = "xxx.igo";
string path = Path.Combine(FileSystem.CacheDirectory, fileName);
File.WriteAllBytes(path, imageByte);
//string caption = "xxx";
string uti = "com.instagram.exclusivegram";
UIImageView view = new UIImageView();
//UIDocumentInteractionController controller = UIDocumentInteractionController.FromUrl(NSUrl.FromString(path));
UIDocumentInteractionController controller = new UIDocumentInteractionController
{
//controller.Url = NSUrl.FromString(path);
Url = NSUrl.FromFilename(path),
Uti = uti
};
//CoreGraphics.CGRect viewDimensions = new CoreGraphics.CGRect(0, 0, 200, 100);
_ = controller.PresentOpenInMenu(CoreGraphics.CGRect.Empty, view, true);
//_ = controller.PresentOpenInMenu(viewDimensions, view, true);
return result;
}
编辑 3
使用
UIView view = new UIImageView();
if (UIApplication.SharedApplication.KeyWindow.RootViewController is UIViewController uiController && uiController.View != null)
{
view = uiController.View;
}
我能够获得可能的共享选项来显示。我使用本机应用程序登录到 Instagram,但 post 没有显示。
改变
Url = NSUrl.FromFilename(path)
到
Url = new NSUrl(path,false)
第二种方法是指向正确的文件路径而不是文件名。
改变
controller.PresentOpenInMenu(CoreGraphics.CGRect.Empty, view, true);
到
controller.PresentOptionsMenu(UIScreen.MainScreen.Bounds, (UIApplication.SharedApplication.Delegate as AppDelegate).Window, true);
在当前 Window 中显示 UIDocumentInteractionController
并设置适当的框架。
目标:使用 iOS 本机方法,将用户制作的图片推送到他们在 C# 中的 Instagram 源上。
public bool ShareImage(byte[] imageByte)
{
bool result = false;
//string fileName = "xxx.png";
//string path = Path.Combine(FileSystem.CacheDirectory, fileName);
//File.WriteAllBytes(path, imageByte);
NSData data = NSData.FromArray(imageByte);
UIImage image = UIImage.LoadFromData(data);
//NSUrl url = NSUrl.FromString($"instagram://library?AssetPath={path}"); // Only opens
NSUrl url = NSUrl.FromString($"instagram://library?LocalIdentifier={1}");
if (UIApplication.SharedApplication.CanOpenUrl(url))
{
UIApplication.SharedApplication.OpenUrl(url);
}
return result;
}
据我所知,我必须这样做的方法是将我的图像保存到设备并为此获取一个本地标识符。 我是根据我看到的 objective-c 代码片段构建的。共享照片仅适用于安装的本机应用程序,正如我从使 facebook 模块正常工作的试验中了解到的那样。
编辑:使用来自 iOS 照片命名空间的 PHAssetChangeRequest 不起作用。 一位同事向我指出了保存然后使用照片选择器获取本地标识符的 PHAsset 的可能性。但这是一个额外的步骤,我不希望应用程序的用户通过。最好只删除 Instagram 支持,因为我可以通过如下所示的通用共享方法。这种方法的缺点是用户必须选择要共享的媒体。
public async void ShareImage(byte[] imageByte)
{
string fileName = "xxx.png";
string path = Path.Combine(FileSystem.CacheDirectory, fileName);
File.WriteAllBytes(path, imageByte);
await Share.RequestAsync(
new ShareFileRequest()
{
File = new ShareFile(path),
Title = "xxx"
}
);
}
编辑 2 尝试了使用 UIDocumentInteractionController 的不同方式,但它没有显示任何内容,也没有显示 posting,它没有抛出任何异常来给我任何关于我做错了什么的线索。
public bool ShareImage(byte[] imageByte)
{
bool result = false;
string fileName = "xxx.igo";
string path = Path.Combine(FileSystem.CacheDirectory, fileName);
File.WriteAllBytes(path, imageByte);
//string caption = "xxx";
string uti = "com.instagram.exclusivegram";
UIImageView view = new UIImageView();
//UIDocumentInteractionController controller = UIDocumentInteractionController.FromUrl(NSUrl.FromString(path));
UIDocumentInteractionController controller = new UIDocumentInteractionController
{
//controller.Url = NSUrl.FromString(path);
Url = NSUrl.FromFilename(path),
Uti = uti
};
//CoreGraphics.CGRect viewDimensions = new CoreGraphics.CGRect(0, 0, 200, 100);
_ = controller.PresentOpenInMenu(CoreGraphics.CGRect.Empty, view, true);
//_ = controller.PresentOpenInMenu(viewDimensions, view, true);
return result;
}
编辑 3 使用
UIView view = new UIImageView();
if (UIApplication.SharedApplication.KeyWindow.RootViewController is UIViewController uiController && uiController.View != null)
{
view = uiController.View;
}
我能够获得可能的共享选项来显示。我使用本机应用程序登录到 Instagram,但 post 没有显示。
改变
Url = NSUrl.FromFilename(path)
到
Url = new NSUrl(path,false)
第二种方法是指向正确的文件路径而不是文件名。
改变
controller.PresentOpenInMenu(CoreGraphics.CGRect.Empty, view, true);
到
controller.PresentOptionsMenu(UIScreen.MainScreen.Bounds, (UIApplication.SharedApplication.Delegate as AppDelegate).Window, true);
在当前 Window 中显示
UIDocumentInteractionController
并设置适当的框架。