"This item cannot be shared. Please select a different item." WhatsApp iOS 共享扩展失败消息

"This item cannot be shared. Please select a different item." WhatsApp iOS share extension failure message

此错误已由 WhatsApp 团队于 2016 年 5 月 23 日(内部版本号 2.16.4)修复。

无法使用 UIActivityViewController 将 NSString 对象共享到 WhatsApp。

我尝试使用以下代码进行分享。但是一旦从列表中选择了联系人,它就会显示一个警告,显示“This item cannot be shared. Please select a different item.

代码

NSString *shareText = @"Temp text to share";
NSArray *itemsToShare = @[shareText];

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:itemsToShare applicationActivities:nil];

我将 WhatsApp 更新到版本 2.16.2 后遇到这个问题

我不确定你的问题...你只想通过 whatsapp 发送文本吗?如果是,则不需要使用 UIActivityViewController。只需使用 urlschemes.

类似的东西:

NSString *string = @"whatsapp://send?text=<YOUR MESSAGE>";
NSURL *url = [NSURL URLWithString:[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL: ];

您还可以检查用户是否安装了 whatsapp

if ([[UIApplication sharedApplication] canOpenURL: url]) {
   // wahtsapp installed
} else {
   // whatsapp not installed
}

看这个问题: Share image/text through WhatsApp in an iOS app

更新 whatsapp 后遇到同样的问题。即使您在 whatsapp 上按“取消”,完成块仍然显示成功。 我已经通过在 whatsapp 上分享时使用“WFActivitySpecificItemProvider”和“WFActivitySpecificItemProvider”解决了这个问题,然后关闭 activityViewController 并通过你分享。您可以从 https://github.com/wileywimberly/WFActivitySpecificItemProvider

拉取 WFActivitySpecificItemProvideractivityViewController

这是我的代码

- (void)share{

NSString *defaultMessage = @"your message may contain url";

// Use a dictionary
WFActivitySpecificItemProvider *provider1 =
[[WFActivitySpecificItemProvider alloc]
 initWithPlaceholderItem:@""
 items:@{
         WFActivitySpecificItemProviderTypeDefault : defaultMessage,
         UIActivityTypePostToFacebook : defaultMessage,
         UIActivityTypeMail : defaultMessage,
         UIActivityTypeMessage : defaultMessage,
         @"com.linkedin.LinkedIn.ShareExtension":defaultMessage,
         UIActivityTypePostToTwitter : defaultMessage

         }];


// Use a block
WFActivitySpecificItemProvider *provider2 =
[[WFActivitySpecificItemProvider alloc]
 initWithPlaceholderItem:@""
 block:^(NSString *activityType){

     if ([activityType isEqualToString:@"net.whatsapp.WhatsApp.ShareExtension"]) {


         [avc dismissViewControllerAnimated:NO completion:nil];

         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{



             NSString *string = [NSString stringWithFormat:@"whatsapp://send?text=%@",defaultMessage];
             NSURL *url = [NSURL URLWithString:[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
             [[UIApplication sharedApplication] openURL: url];


         });
     }

     return defaultMessage;
 }];


avc = [[UIActivityViewController alloc]
       initWithActivityItems:@[provider1, provider2]
       applicationActivities:nil];

[avc dismissViewControllerAnimated:YES completion:nil];
[avc setValue:sharingHeader forKey:@"subject"];

[avc setCompletionHandler:^(NSString *activityType, BOOL completed) {

    if (activityType) {


        NSLog(@"activity: %@ completed: %@",activityType,completed ? @"YES" : @"NO");


    } else {


        NSLog(@"No activity was selected. (Cancel)");
    }

}];

[self presentViewController:avc animated:YES completion:nil];
}

收到 WhatsApp 团队的回复

- WhatsApp Support -

Hi,

Sorry for the delay! We have received many emails recently, and we do our best to answer them all. Thank you for your patience.

Thank you for informing us about the issue; it will be fixed in a future version of WhatsApp. Unfortunately, we cannot comment on any future timelines, sorry. Thank you for your continued patience and support of WhatsApp.

Cheers, Hans

所以,他们承认了这个错误,并将在下一个版本中解决这个问题。

可能的解决方法=>

  • 到时候可以使用UrlSchemes 明文共享+url。跟随
  • 可以创建 UIActivity 的子类 activityCategory 作为 UIActivityCategoryShare 与 whatsapp 图标。然后 当用户选择它时,将使用 url 方案来共享文本。为此使用 JBWhatsAppActivity
  • 只需分享 NSUrl 对象即可分享url。修复完成后,您可以恢复共享纯文本和 url.

使用最新版本的whatsapp,现在我们不能同时分享文本和URL。

我尝试了下面的代码

NSArray *activityItems= @[someText,[NSURL URLWithString:@"http://www.google.com"]];

使用此代码我只能分享 URL link,whatsApp 过滤掉了 "someText" 文本。

但其他共享应用程序(短信等)能够共享文本和 url。

希望 WhatsApp 尽快解决这个问题。

WhatsApp 已在 2016 年 5 月 23 日的更新(版本号 2.16.4)中修复了此错误。

官方消息来源尚未报道,但我已经在我的代码中对其进行了测试 - 工作正常。

您可能想尝试分享您要分享的项目的本地 URL。例如,如果您想共享 pdf,请不要尝试共享它的 NSData 或 Data 对象,WhatsApp 仍然会为此显示该错误。相反,如果您分享它的本地 URL,WhatsApp 会识别它并很好地分享它。

我必须注意,如果您尝试共享数据对象,许多应用程序(包括本机 Mail、Gmail、Slack、GDrive 等)都可以识别 pdf。

例如:

下载 PDF 后,将其 URL 绑定到名为 fileURL:

的变量中
var fileURL = URL(string: url)
    let destination: DownloadRequest.DownloadFileDestination = { _, _ in
        let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        fileURL = documentsURL.appendingPathComponent("AWESOME_PDF.pdf")
        return (fileURL!, [.removePreviousFile, .createIntermediateDirectories])
    }

然后您可以简单地共享文件URL而不是:

let activityViewController = UIActivityViewController(            
      activityItems: [fileURL!],
      applicationActivities: nil
)

WhatsApp 将识别 PDF。

希望对您有所帮助!

运行 使用自定义 UIActivityItemSource 解决了这个问题,我在其中传回了 kUTTypeData 大多数提供商理解的 dataTypeIdentifierForActivityType 委托方法而不是 kUTTypeText.简单案例覆盖解决了我的问题。如果有人看到上面的错误,这只是另一个原因。

open func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivityType?) -> String {
    switch activityType {
    case UIActivityType(rawValue: "net.whatsapp.WhatsApp.ShareExtension"):
        return kUTTypeText as String
    default:
        return kUTTypeData as String
    }
}