简体   繁体   English

使用“UIActivityItemSource”协议无法分享到 Instagram

[英]Sharing to Instagram does not work using the `UIActivityItemSource` protocol

I share text and an image using the UIActivityViewController .我使用UIActivityViewController共享文本和图像。 The image is from activityImage which is an UIImage() .该图像来自一个UIImage() activityImage The custom text is from activityText() which is returned from an UIActivityItemSource protocol.自定义文本来自从UIActivityItemSource协议返回的activityText()

The trouble is, Instagram is only visible in the UIActivityViewController under certain conditions.问题是,Instagram 只能在特定条件下在UIActivityViewController可见。

To summerize the tests below:总结以下测试:

  • Instagram is only visible in the UIActivityViewController for activityItems: [activityImage] and activityItems: [activityImage, NSNull()] Instagram的是只在可见UIActivityViewControlleractivityItems: [activityImage]activityItems: [activityImage, NSNull()]

  • Instagram is hidden for activityItems: [activityImage, activityText()] even when the returned UIActivityItemSource protocol value is "" , nil , NSNull() .即使返回的UIActivityItemSource协议值为""nilNSNull() ,Instagram 也会为activityItems: [activityImage, activityText()]隐藏

The issue is that the UIActivityItemSource protocol needs to be called so that different sharing platforms can be managed separately.问题是需要调用UIActivityItemSource协议,以便可以分别管理不同的共享平台。


Questions:问题:

  • How can I share to Instagram when calling the UIActivityItemSource protocol?如何在调用UIActivityItemSource协议时分享到 Instagram?

  • What are the alternatives to "" , nil and NSNull() that I could try when calling the UIActivityItemSource protocol?在调用UIActivityItemSource协议时,我可以尝试哪些替代""nilNSNull()


Code:代码:

class activityText: NSObject, UIActivityItemSource {
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        return ""
    }
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
        switch activityType {
        case UIActivityTypeMessage:
            return "Special text when sharing to Messages."
        default:
            return ""
        }
    }
}

func shareEverwhere() {
      var activityImage: UIImage() 
      let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
      self.presentViewController(activity, animated: true, completion: nil)
}

Tests:测试:

Instagram is visible in the UIActivityViewController Instagram 在UIActivityViewController可见

let activity = UIActivityViewController(activityItems: [activityImage], applicationActivities: nil)

or或者

let activity = UIActivityViewController(activityItems: [activityImage, NSNull()], applicationActivities: nil)

Instagram is hidden in the UIActivityViewController Instagram隐藏UIActivityViewController

let activity = UIActivityViewController(activityItems: [activityImage, ""], applicationActivities: nil)

or或者

let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)

or或者

let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        return ""
    }
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
        return NSNull()
    }
}

or或者

let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        return ""
    }
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
            return nil
    }
}

or或者

let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        return ""
    }
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
            return ""
    }
}

The question was asked and answered at: Share image with hashtag via UIActivityViewController (Twitter, Facebook, Instagram) 问题被提出并回答: 通过UIActivityViewController(Twitter,Facebook,Instagram)与hashtag共享图像

        UIActivityViewController *activityViewController =
 [[UIActivityViewController alloc] initWithActivityItems:@[vm.image, [[ActivityStringItemSource alloc] initWithString:attributedString]] applicationActivities:nil];

And the class that implements the return of the string (or not) is: 实现字符串返回的类(或不是)是:

@interface ActivityStringItemSource()<UIActivityItemSource>

@property(strong, nonatomic) NSMutableAttributedString *stringContent;
@end

@implementation ActivityStringItemSource

- (instancetype)initWithString:(NSMutableAttributedString *) placeholder
{
    self = [super init];
    if (self) {
        _stringContent = placeholder;
    }
    return self;
}

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
    return [NSObject new];
}

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType {
    if([activityType containsString:@"instagram"]) {
        return nil;
    } else {
        return _stringContent;
    }
}

@end

The key, as pointed by the original answer is to return an NSObject (the class extends NSObject). 正如最初的答案所指出的那样,关键是返回一个NSObject(该类扩展了NSObject)。 Then in the item selection, just test instagram to return nil and otherwise return your string. 然后在项目选择中,只测试instagram以返回nil,否则返回您的字符串。

After testing only you have to do is add your image to activityViewControllerPlaceholderItem测试后,您只需将图像添加到 activityViewControllerPlaceholderItem

final class MyImageItemSource: NSObject, UIActivityItemSource {

    final let image: UIImage

    init(image: UIImage) {
        self.image = image
    }

    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        image
    }

    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        image
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM