Share image/text through WhatsApp in an iOS app

Is it possible to share images, text or whatever you want through Whatsapp in a iOS app? I'm searching on google but I only found results talking about Android implementations.

Upvotes: 58

Views: 105150

Answers (12)

oscar castellon
oscar castellon

Reputation: 3138

For Swift 4 - Works fine

delclare

var documentInteractionController:UIDocumentInteractionController!

func sharePicture() {
    let urlWhats = "whatsapp://app"
    if let urlString = urlWhats.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) {
        if let whatsappURL = NSURL(string: urlString) {

            if UIApplication.shared.canOpenURL(whatsappURL as URL) {

                let imgURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
                let fileName = "yourImageName.jpg"
                let fileURL = imgURL.appendingPathComponent(fileName)
                if let image = UIImage(contentsOfFile: fileURL.path) {
                    if let imageData = image.jpegData(compressionQuality: 0.75) {
                        let tempFile = NSURL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Documents/yourImageName.jpg")
                        do {
                            try imageData.write(to: tempFile!, options: .atomicWrite)
                            self.documentInteractionController = UIDocumentInteractionController(url: tempFile!)
                            self.documentInteractionController.uti = "net.whatsapp.image"
                            self.documentInteractionController.presentOpenInMenu(from: CGRect.zero, in: self.view, animated: true)
                        } catch {
                            print(error)
                        }
                    }
                }
            } else {
                // Cannot open whatsapp
            }
        }
    }
}

Do not forget to edit the .plist with the following lines

<key>LSApplicationQueriesSchemes</key>
 <array>
  <string>whatsapp</string>
 </array>

Enjoy!!!

Upvotes: 5

Saranjith
Saranjith

Reputation: 11547

Swift 4

let urlWhats = "whatsapp://app"
        if let urlString = urlWhats.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed) {

            if let whatsappURL = URL(string: urlString) {

                if UIApplication.shared.canOpenURL(whatsappURL) {

                        if let imageData = UIImageJPEGRepresentation(image, 1.0) {
                            let tempFile = NSURL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Documents/whatsAppTmp.wai")!
                            do {
                                try imageData.write(to: tempFile, options: .atomic)
                                self.documentController = UIDocumentInteractionController(url: tempFile)
                                self.documentController.uti = "net.whatsapp.image"
                                self.documentController.presentOpenInMenu(from: CGRect.zero, in: self.view, animated: true)
                            } catch {
                                print(error)
                            }
                        }

                } else {
                    let ac = UIAlertController(title: "MessageAletTitleText".localized, message: "AppNotFoundToShare".localized, preferredStyle: .alert)
                    ac.addAction(UIAlertAction(title: "OKButtonText".localized, style: .default))
                    present(ac, animated: true)

                    print("Whatsapp isn't installed ")

                    // Cannot open whatsapp
                }
            }
        }

Upvotes: 2

mourodrigo
mourodrigo

Reputation: 2232

Swift 3 version for sending text:

func shareByWhatsapp(msg:String){
        let urlWhats = "whatsapp://send?text=\(msg)"
        if let urlString = urlWhats.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
            if let whatsappURL = NSURL(string: urlString) {
                if UIApplication.shared.canOpenURL(whatsappURL as URL) {
                    UIApplication.shared.openURL(whatsappURL as URL)
                } else {

                    let alert = UIAlertController(title: NSLocalizedString("Whatsapp not found", comment: "Error message"),
                                                  message: NSLocalizedString("Could not found a installed app 'Whatsapp' to proceed with sharing.", comment: "Error description"),
                                                  preferredStyle: UIAlertControllerStyle.alert)

                    alert.addAction(UIAlertAction(title: NSLocalizedString("Ok", comment: "Alert button"), style: UIAlertActionStyle.default, handler:{ (UIAlertAction)in
                    }))

                    self.present(alert, animated: true, completion:nil)
                    // Cannot open whatsapp
                }
            }
        }
}

Also, you need to add whatsapp to LSApplicationQueriesSchemes in your Info.plist

Upvotes: 1

Mehul
Mehul

Reputation: 3178

Simple code and Sample code ;-)

Note:- You can only share text or image, both sharing together in whatsApp is not working from whatsApp side

 /*
    //Share text
    NSString *textToShare = @"Enter your text to be shared";
    NSArray *objectsToShare = @[textToShare];
    
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
    [self presentViewController:activityVC animated:YES completion:nil];
     */
    
    //Share Image
    UIImage * image = [UIImage imageNamed:@"images"];
    NSArray *objectsToShare = @[image];
    
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
    [self presentViewController:activityVC animated:YES completion:nil];

Upvotes: 8

rckoenes
rckoenes

Reputation: 69459

No this is not possible, whatsapp does not have any public API you can use.

Please note that this answer is correct for 2011 when there was no API for WhatsApp.

Now there is an api available for interacting with WhatsApp: http://www.whatsapp.com/faq/en/iphone/23559013

The Objective-C call to open one of these URLs is as follows:

NSURL *whatsappURL = [NSURL URLWithString:@"whatsapp://send?text=Hello%2C%20World!"];
if ([[UIApplication sharedApplication] canOpenURL: whatsappURL]) {
    [[UIApplication sharedApplication] openURL: whatsappURL];
}

Upvotes: 21

saurabh rathod
saurabh rathod

Reputation: 1268

NSString *shareText = @"http:www.google.com";
NSArray *objectsToShare = @[shareText];

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

if (isIphone)
{
    [self presentViewController:activityVC animated:YES completion:nil];
}
else {
    UIPopoverController *popup = [[UIPopoverController alloc]         initWithContentViewController:activityVC];
    [popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0)inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

Upvotes: -1

Adel
Adel

Reputation: 411

It is now possible. Have not tried yet though.

The latest release notes for whatsapp indicate that you can through the share extension:

WhatsApp accepts the following types of content:

  • text (UTI: public.plain-text)
  • photos (UTI: public.image)
  • videos (UTI: public.movie)
  • audio notes and music files (UTI: public.audio)
  • PDF documents (UTI: com.adobe.pdf)
  • contact cards (UTI: public.vcard)
  • web URLs (UTI: public.url)

Upvotes: 24

JoeGalind
JoeGalind

Reputation: 3805

Swift 3 version of Wagner Sales' answer:

let urlWhats = "whatsapp://app"
if let urlString = urlWhats.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) {
  if let whatsappURL = URL(string: urlString) {
    if UIApplication.shared.canOpenURL(whatsappURL) {

      if let image = UIImage(named: "image") {
        if let imageData = UIImageJPEGRepresentation(image, 1.0) {
          let tempFile = NSURL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Documents/whatsAppTmp.wai")
          do {
            try imageData.write(to: tempFile!, options: .atomic)

            self.documentIC = UIDocumentInteractionController(url: tempFile!)
            self.documentIC.uti = "net.whatsapp.image"
            self.documentIC.presentOpenInMenu(from: CGRect.zero, in: self.view, animated: true)
          }
          catch {
            print(error)
          }
        }
      }

    } else {
      // Cannot open whatsapp
    }
  }
}

Upvotes: 5

Devyani Shinde
Devyani Shinde

Reputation: 81

This is the correct code for share link to whats app users.

NSString * url = [NSString stringWithFormat:@"http://video...bla..bla.."];
url =    (NSString*)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef) url, NULL,CFSTR("!*'();:@&=+$,/?%#[]"),kCFStringEncodingUTF8));

  NSString * urlWhats = [NSString stringWithFormat:@"whatsapp://send?text=%@",url];
NSURL * whatsappURL = [NSURL URLWithString:urlWhats];
if ([[UIApplication sharedApplication] canOpenURL: whatsappURL]) {
    [[UIApplication sharedApplication] openURL: whatsappURL];
} else {
    // can not share with whats app
}

Upvotes: 8

Wagner Sales
Wagner Sales

Reputation: 1558

Is now possible in this way:

Send Text - Obj-C

NSString * msg = @"YOUR MSG";
NSString * urlWhats = [NSString stringWithFormat:@"whatsapp://send?text=%@",msg];
NSURL * whatsappURL = [NSURL URLWithString:[urlWhats stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
if ([[UIApplication sharedApplication] canOpenURL: whatsappURL]) {
    [[UIApplication sharedApplication] openURL: whatsappURL];
} else {
    // Cannot open whatsapp
}

Send Text - Swift

let msg = "YOUR MSG"
let urlWhats = "whatsapp://send?text=\(msg)"
if let urlString = urlWhats.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) {
    if let whatsappURL = NSURL(string: urlString) {
        if UIApplication.sharedApplication().canOpenURL(whatsappURL) {
            UIApplication.sharedApplication().openURL(whatsappURL)
        } else {
            // Cannot open whatsapp
        }
    }
}

Send Image - Obj-C

-- in .h file

<UIDocumentInteractionControllerDelegate>

@property (retain) UIDocumentInteractionController * documentInteractionController;

-- in .m file

if ([[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString:@"whatsapp://app"]]){

    UIImage     * iconImage = [UIImage imageNamed:@"YOUR IMAGE"];
    NSString    * savePath  = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/whatsAppTmp.wai"];

    [UIImageJPEGRepresentation(iconImage, 1.0) writeToFile:savePath atomically:YES];

    _documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:savePath]];
    _documentInteractionController.UTI = @"net.whatsapp.image";
    _documentInteractionController.delegate = self;

    [_documentInteractionController presentOpenInMenuFromRect:CGRectMake(0, 0, 0, 0) inView:self.view animated: YES];


} else {
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"WhatsApp not installed." message:@"Your device has no WhatsApp installed." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}

Send Image - Swift

let urlWhats = "whatsapp://app"
if let urlString = urlWhats.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) {
    if let whatsappURL = NSURL(string: urlString) {

        if UIApplication.sharedApplication().canOpenURL(whatsappURL) {

            if let image = UIImage(named: "image") {
                if let imageData = UIImageJPEGRepresentation(image, 1.0) {
                    let tempFile = NSURL(fileURLWithPath: NSHomeDirectory()).URLByAppendingPathComponent("Documents/whatsAppTmp.wai")
                    do {
                        try imageData.writeToURL(tempFile, options: .DataWritingAtomic)
                        self.documentInteractionController = UIDocumentInteractionController(URL: tempFile)
                        self.documentInteractionController.UTI = "net.whatsapp.image"
                        self.documentInteractionController.presentOpenInMenuFromRect(CGRectZero, inView: self.view, animated: true)
                    } catch {
                        print(error)
                    }
                }
            }

        } else {
            // Cannot open whatsapp
        }
    }
}

Because a new security feature of iOS 9, you need add this lines on .plist file:

<key>LSApplicationQueriesSchemes</key>
 <array>
  <string>whatsapp</string>
 </array>

More information about url sheme: https://developer.apple.com/videos/play/wwdc2015-703/

I did not find a single solution for both. More information on http://www.whatsapp.com/faq/en/iphone/23559013

I made a small project to help some. https://github.com/salesawagner/SharingWhatsApp

Upvotes: 133

Hassan Refaat
Hassan Refaat

Reputation: 31

Yes it's possible :

NSMutableArray *arr = [[NSMutableArray alloc]init];
    NSURL *URL = [NSURL fileURLWithPath:path];
    NSString *textToShare = [NSString stringWithFormat:@"%@ \n",_model.title];
    NSString *SchoolName= [[AppUtility sharedUtilityInstance]getAppConfigInfoByKey:@"SchoolName" SecondKeyorNil:Nil];
    [arr addObject:textToShare];
    [arr addObject:URL];
    [arr addObject:_model.body];
    [arr addObject:SchoolName];
    TTOpenInAppActivity *openInAppActivity = [[TTOpenInAppActivity alloc] initWithView:_parentController.view andRect:((UIButton *)sender).frame];

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:arr applicationActivities:@[openInAppActivity]];

    // Store reference to superview (UIActionSheet) to allow dismissal
    openInAppActivity.superViewController = activityViewController;
    // Show UIActivityViewController
    [_parentController presentViewController:activityViewController animated:YES completion:NULL];

Upvotes: 1

Himanshu Garg
Himanshu Garg

Reputation: 599

WhatsApp provides two ways for your iPhone app to interact with WhatsApp:

  • Through a custom URL scheme
  • Through the iOS Document Interaction API

For more information Visit this link

Thanks.

Upvotes: 1

Related Questions