[英]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的是只在可见
UIActivityViewController
为activityItems: [activityImage]
和activityItems: [activityImage, NSNull()]
Instagram is hidden for activityItems: [activityImage, activityText()]
even when the returned UIActivityItemSource
protocol value is ""
, nil
, NSNull()
.即使返回的
UIActivityItemSource
协议值为""
、 nil
、 NSNull()
,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
andNSNull()
that I could try when calling theUIActivityItemSource
protocol?在调用
UIActivityItemSource
协议时,我可以尝试哪些替代""
、nil
和NSNull()
?
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.