这个项目无法共享。请选择另一个项目。 WhatsApp iOS分享扩展失败消息。

36

这个问题已经被WhatsApp团队在2016年5月23日修复(版本号为2.16.4)。

无法通过UIActivityViewController分享NSString对象到WhatsApp。

我尝试使用以下代码进行分享,但是一旦从联系人列表中选择联系人,它会显示一个警报,上面写着"此项目无法共享。请选择其他项。"

代码

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

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

我在更新 WhatsApp 到 2.16.2 版本后遇到了这个问题。


你解决了吗?因为我也遇到了同样的问题,它在 Whats App 的最新更新之前一直正常工作,但现在不行了! - Irshad Qureshi
同样的问题在这里。真的很令人沮丧。 - pAkY88
不行。已向WhatsApp支持团队发送了关于此产品问题的邮件,但已经4天没有回复了。不知道该怎么办,但为了临时解决问题,我现在只能允许共享链接。 - santhu
这是因为WhatsApp原生支持ActivityViewController的缘故吗? - Mark Molina
2
玩了一会儿后,似乎WhatsApp不允许您直接分享文本。但它允许您分享URL、视频、图像等。因此(至少在我们的情况下),我们正在共享带有嵌入式URL的文本,并将其替换为: @[NSURL(***), "share Text"]; 这样WhatsApp只获取URL,而其他应用程序也可以获取文本。 - Eli Kohen
显示剩余2条评论
7个回答

21

收到了WhatsApp团队的回复:

- WhatsApp支持 -

您好,

很抱歉让您等待这么久!我们最近收到了很多电子邮件,尽最大努力回复每封邮件。感谢您的耐心等待。

感谢您向我们报告问题;该问题将在WhatsApp的未来版本中修复。不幸的是,我们无法对任何未来时间表进行评论。感谢您一如既往地支持和耐心等待WhatsApp。

此致,敬礼!Hans

所以,他们承认了这个错误,并将在下一个版本中修复。

可能的解决方案 =>

  • 在那之前,可以使用UrlSchemes分享明文+URL。请参考Spydy的答案
    OR
  • 可以创建UIActivity的子类,activityCategory为UIActivityCategoryShare,其中包含WhatsApp图标。然后,当用户选择它时,会使用urlschemes共享文本。请使用JBWhatsAppActivity
    OR
  • 只需共享NSUrl对象以共享URL。修复后,您可以恢复共享纯文本和URL。

如果我使用JBWhatsAppActivity,如何删除第一行中的原始WhatsApp? - Zaporozhchenko Oleksandr
你尝试过通过获取其ActivityType字符串并在excludedActivityTypes中提供来删除原始的WhatsApp活动吗? - santhu
怎么办?在UIActivity.h中没有WhatsApp的UIActivityType。 - Zaporozhchenko Oleksandr

9
您可以尝试共享您想要共享的项目的本地URL。例如,如果您想共享PDF文件,请不要尝试共享其NSData或Data对象,因为WhatsApp仍会显示该错误。相反,如果您共享它的本地URL,WhatsApp将认识到它并成功分享。
我必须指出,包括本机邮件、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格式。

希望这可以帮到您!


我可以通过这个解决方案通过WhatsApp发送PDF。但是从其他iOS设备打开该PDF,而从Android设备无法打开。有任何想法为什么吗? - Soumen

8
我在更新 WhatsApp 后遇到了相同的问题。即使你在 WhatsApp 上按下“取消”,完成处理块仍然会显示为成功。
我使用"WFActivitySpecificItemProvider"和"activityViewController"来分享到 WhatsApp,然后关闭 activityViewController 并通过 ur 进行分享,已经解决了这个问题。你可以从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];
}

你的情况可能不同,在我的情况下,我必须为手机上安装的所有共享应用程序显示一个共享按钮。因此,上述代码适用于我的情况。 - Waseem Sarwar
2
我也是这么想的。我会创建一个UIActivity的子类,其中activityCategory为UIActivityCategoryShare,并带有WhatsApp图标。然后当用户选择它时,将使用urlschemes来分享文本。但我会等一段时间,直到我从WhatsApp产品团队得到回复。 - santhu
2
请告诉我 Whatsapp 团队的回复。谢谢。 - pAkY88
1
我们这里也遇到了同样的问题,所以一旦你收到WhatsApp的回复,请告诉我们。 - Iphone User

2

WhatsApp已在2016年5月23日的更新中修复了这个漏洞(版本号2.16.4)。

虽然没有官方报告,但我已经在我的代码中测试过它 - 运行正常。


仍然存在问题,例如如果您使用1Password并与WhatsApp共享密码库中的密码,则在选择要发送给的人时将出现错误消息。 - RichAppz

0
遇到了一个与自定义UIActivityItemSource相关的问题,我在dataTypeIdentifierForActivityType委托方法中传回了大多数提供程序都能理解的kUTTypeData,而不是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
    }
}

0

随着 WhatsApp 的最新版本,现在我们不能同时分享文本和 URL。

我尝试了以下代码

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

通过这段代码,我只能分享URL链接,WhatsApp过滤掉了“someText”文本。

但是其他分享应用程序(如短信等)可以同时分享文本和URL。

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


你真的认为这个回答解决了问题,而其他回答没有吗?在发布新回答前,请先阅读其他回答。 - santhu

-1

我不确定你的问题... 你只是想通过 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
}

看这个问题: 在iOS应用程序中通过WhatsApp分享图像/文本

3
我知道这个。但我不想使用URL Scheme,因为它需要点击三次才能分享,看起来很麻烦。我更担心WhatsApp的本地分享扩展程序为什么不能像以前那样正常工作。 请尝试一下并告诉我它是否对您起作用。之前我用于分享自定义消息和链接的是明文NSString对象,现在它甚至不支持明文消息了。 - santhu
嗯……有趣。我会寻找关于WhatsApp本地分享扩展的信息。 - Wagner Sales
你的代码只是证明了给定的字符串对象可以分配NSURL。这与Whatsapp无关。 - Onder OZCAN
这是一种发送WhatsApp消息的方式...查看URL方案。@InnaKamoze - Wagner Sales
1
这并不能解决问题,你需要在属性列表文件中添加一个名为“LSApplicationQueriesSchemes”的数组,并插入一个名为“whatsapp”的字符串作为一行,而不是使用URL Scheme。 - Onder OZCAN
只需将“whatsapp”添加到“LSApplicationQueriesSchemes”中,就解决了我分享文本的问题。 - neowinston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接