Показывает "Импорт с Instagram" в UIActivityViewController

Я пытаюсь добавить Instagram в функцию "Поделиться" в моем приложении. Я видел в Instagram документы для iPhone. Я создал пользовательский UIActivty, который прекрасно работает, но мой вопрос в том, есть ли способ добавить функцию "Импорт с Instagram", как это можно увидеть в приложении "Фото" для iOS "Приложение для фотографий в iOS":

В моем приложении почему-то не показывается, что "Импортировать с Instagram". мое приложение Поделиться видом:

Я не хочу делиться только с Instagram, поэтому нет ".igo"

РЕДАКТИРОВАТЬ: Все это специально для версий iOS < 10. По некоторым причинам Instagram Share Extension отлично работает (для моего приложения) на устройствах с iOS >= 10.

РЕДАКТИРОВАТЬ: я пытаюсь поделиться изображения и видео в форматах ".jpeg" и ".mov" соответственно

Я видел / читал, что Instagram добавил расширение для общего доступа в выпуске 8.2, поэтому технически все приложения должны отображать "Instagram" в трее для общего доступа, то есть его можно увидеть в приложении Google Photos.

public void NativeShareImage(UIView sourceView, CGRect sourceRect,
                             UIImage image, string shareCaption, string emailSubject)
{
  string filename = Path.Combine(FileSystemUtils.GetTemporaryDataPath(), "Image.jpg");

  NSError err = null;
  using(var imgData = image.AsJPEG(JpgImageQuality))
  {
    if(imgData.Save(filename, false, out err))
    {
      Logger.Information("Image saved before native share as {FileName}", filename);
    }
    else
    {
      Logger.Error("Image NOT saved before native share as to path {FileName}. {Error}", filename, err.Description);
      return;
    }
  }

  // this are the items that needs to be shared
  // Instagram ignores the caption, that is known
  var activityItems = new List<NSObject>
  {
    new NSString(shareCaption),
    new NSUrl(new Uri(filename).AbsoluteUri)
  };

  // Here i add the custom UIActivity for Instagram
  UIActivity[] applicationActivities = 
  {
    new InstagramActivity(image, sourceRect, sourceView),
  }

  var activityViewController = new UIActivityViewController(activityItems.ToArray(), applicationActivities);
  activityViewController.SetValueForKey(new NSString(emailSubject), new NSString("subject"));

  activityViewController.CompletionWithItemsHandler = (activityType, completed, returnedItems, error) => 
  {
    UserSharedTo(activityType, completed);
  };

  // Hide some of the less used activity types so that Instagram shows up in the list. Otherwise it's pushed off the activity view
  // and the user has to scroll to see it.
  activityViewController.ExcludedActivityTypes = new[] { UIActivityType.AssignToContact, UIActivityType.CopyToPasteboard, UIActivityType.Print };

  if(UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone)
  {
    PresentViewController(activityViewController, true, null);
  }
  else
  {
    activityViewController.ModalPresentationStyle = UIModalPresentationStyle.Popover;
    PresentViewController(activityViewController, true, null);

    // Get the popover presentation controller and configure it.
    UIPopoverPresentationController presentationController = activityViewController.PopoverPresentationController;
    presentationController.PermittedArrowDirections = UIPopoverArrowDirection.Down;
    presentationController.SourceRect = sourceRect;
    presentationController.SourceView = sourceView;
  }
}



// when opening custom activity use ".igo" to only show instagram
  public class InstagramActivity : UIActivity
  {

    public InstagramActivity(UIImage imageToShare, CGRect frame, UIView view, string shareCaption = "")
    {
      _ImageToShare = imageToShare;
      _Frame = frame;
      _View = view;
    }

    public override UIImage Image { get { return UIImage.FromBundle("Instagram"); } }

    public override string Title { get { return "Instagram"; } }

    public override NSString Type { get { return new NSString("PostToInstagram"); } }

    public string Caption { get; set; }


    public override bool CanPerform(NSObject[] activityItems)
    {
      return UIApplication.SharedApplication.CanOpenUrl(NSUrl.FromString("instagram://app"));
    }

    public override void Prepare(NSObject[] activityItems)
    {
    }

    public override void Perform()
    {
      string filename = Path.Combine(FileSystemUtils.GetTemporaryDataPath(), "Image.igo");

      NSError err = null;
      using(var imgData = _ImageToShare.AsJPEG(JpgImageQuality))
      {
        if(imgData.Save(filename, false, out err))
        {
          Logger.Information("Instagram image saved as {FileName}", filename);
        }
        else
        {
          Logger.Error("Instagram image NOT saved as to path {FileName}. {Error}", filename, err.Description);
          Finished(false);
          return;
        }
      }

      var url = NSUrl.FromFilename(filename);
      _DocumentController = UIDocumentInteractionController.FromUrl(url);
      _DocumentController.DidEndSendingToApplication += (o, e) => Finished(true);
      _DocumentController.Uti = "com.instagram.exclusivegram";
      if(!string.IsNullOrEmpty(ShareCaption))
      {
        _DocumentController.Annotation = NSDictionary.FromObjectAndKey(new NSString(ShareCaption), new NSString("InstagramCaption"));
      }
      _DocumentController.PresentOpenInMenu(_Frame, _View, true);
    }

    UIImage _ImageToShare;
    CGRect _Frame;
    UIView _View;
    UIDocumentInteractionController _DocumentController;
  }

0 ответов

Другие вопросы по тегам