Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

This bug is fixed by WhatsApp team on 23rd May, 2016 (build no. 2.16.4).

Unable to share NSString object using UIActivityViewController to WhatsApp.

I tried to share using below code. But once contact is selected from the list, it shows an alert displaying "This item cannot be shared. Please select a different item."

CODE

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

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

I am facing this problem after updating WhatsApp to version 2.16.2

like image 701
santhu Avatar asked Apr 13 '16 16:04

santhu


People also ask

Why can't I share a file on WhatsApp?

You might wanna try sharing the local URL of the item you're trying to share. For example, if you'd like to share a pdf, don't try to share it's NSData or Data object, WhatsApp still does show that error for that. Instead, if you share the local URL of it, WhatsApp recognizes it and shares it well.

Does WhatsApp recognize a PDF file as a data object?

Instead, if you share the local URL of it, WhatsApp recognizes it and shares it well. I must note that many apps including native Mail, Gmail, Slack, GDrive etc. do recognize the pdf if you try to share the Data object.

How do you share text on WhatsApp?

After playing a lil bit it seems whatsapp won't allow you to share directly text. But it allows you to share urls, videos, images, etc. So (at least in our case) we were sharing Text with embedded url and we replaced it to: @ [NSURL (***), "share Text"]; so that whatsapp only takes the url but the rest of apps take the text too.


4 Answers

Received a response from WhatsApp team

- 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

So, they acknowledge the bug and will fix this in the next release.

Possible Workarounds =>

  • Till then one can use UrlSchemes to share plaintext+url. Follow Spydy's answer.
    OR
  • One can create subclass of UIActivity with activityCategory as UIActivityCategoryShare with whatsapp icon. Then when user selects it, will use urlschemes to share text. For this use JBWhatsAppActivity
    OR
  • Just share NSUrl object for sharing url. Once the fix is done you can revert to sharing plain text and url.
like image 122
santhu Avatar answered Oct 16 '22 22:10

santhu


WhatsApp has fixed this bug in the their update dated 23rd May, 2016 (build no. 2.16.4).

It hasn't been reported by official sources, but I have tested it in my code - works fine.

like image 38
Ulhas Mandrawadkar Avatar answered Oct 16 '22 22:10

Ulhas Mandrawadkar


You might wanna try sharing the local URL of the item you're trying to share. For example, if you'd like to share a pdf, don't try to share it's NSData or Data object, WhatsApp still does show that error for that. Instead, if you share the local URL of it, WhatsApp recognizes it and shares it well.

I must note that many apps including native Mail, Gmail, Slack, GDrive etc. do recognize the pdf if you try to share the Data object.

For example:

After downloading a PDF, bind its URL into a variable called 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])
    }

Then you can simply share the fileURL instead:

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

WhatsApp will recognize the PDF.

Hope this helps!

like image 43
Mert Kahraman Avatar answered Oct 16 '22 21:10

Mert Kahraman


have faced same issue after updating whatsapp. Even you press "cancel" on whatsapp still completion block shows success. i have resolved it by using "WFActivitySpecificItemProvider" and "WFActivitySpecificItemProvider"when sharing on whatsapp then dissmiss activityViewController and share via ur. You can pull WFActivitySpecificItemProvider, activityViewController classes from https://github.com/wileywimberly/WFActivitySpecificItemProvider

here is my code

- (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];
}
like image 43
Spydy Avatar answered Oct 16 '22 22:10

Spydy