14

In my current project I need to share text on whatsapp from iOS app.

Here is my code to share text on whatsapp:

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

but canOpenURL always returning false in iOS9.

Is there any iOS9 privacy policy? Can anyone help me out?

Artem Stepanenko
  • 3,423
  • 6
  • 29
  • 51
Mayank Jain
  • 5,663
  • 7
  • 32
  • 65
  • 1
    with iOS 9, Apple Transport Security was introduced. Maybe it has something to do with it. It basically says you can´t send any unsecure requests anymore. But I´m not sure if it is the problem in this case. – 最白目 Dec 17 '15 at 08:18
  • 2
    maybe this can help you http://stackoverflow.com/questions/30987986/ios-9-not-opening-instagram-app-with-url-scheme – 最白目 Dec 17 '15 at 08:20
  • ATS has nothing to do with this. Apple introduced a separate system which requires stating in `info.plist` which schemes an app will use, but it's completely orthogonal to ATS. – Avi Dec 17 '15 at 08:25

5 Answers5

62

In iOS 9 you must whitelist any URL schemes your App wants to query in Info.plist under the LSApplicationQueriesSchemes key (an array of strings):

For example:

enter image description here

So in your case, instead of fb and twitter you will have to specify whatsapp.

Note that this mechanism only applies to canOpenURL and not openURL. You do not need to have a scheme listed in Info.plist to be able to open it with openURL.

starball
  • 20,030
  • 7
  • 43
  • 238
z22
  • 10,013
  • 17
  • 70
  • 126
5

In addition to @z22's answer if you need to add it textually (e.g. with Xamarin) then it looks like this:

    <dict>
        ... 

        <key>LSApplicationQueriesSchemes</key>
        <array>
            <string>whatsapp</string>
        </array>
    </dict>
noelicus
  • 14,468
  • 3
  • 92
  • 111
1

Step:1 Add LSApplicationQueriesSchemes in Info.plist

Step:2 Add whatsapp in items

Mobile Apps Expert
  • 1,028
  • 1
  • 8
  • 11
1

For me the issue was because I was using URL types instead of LSApplicationQueriesSchemes

and it work only for LSApplicationQueriesSchemes

This will not work

URL types

This will work

LSApplicationQueriesSchemes

Musa almatri
  • 5,596
  • 2
  • 34
  • 33
1

for someone who still finding this issue, its because canOpenURL is abuse to check all installed app. use Open instead and wait for async result.

UIApplication.shared.open(url, options: [:], completionHandler: {success in
            if !success { self.screen?.showToast(message: "App not installed")}
        })