web-dev-qa-db-fra.com

Ouvrir le lien vers la page Facebook depuis l'application iOS

Je veux rediriger l'utilisateur vers la page Facebook de mon application, j'ai donc le code suivant:

[[UIApplication sharedApplication] openURL:
    [NSURL URLWithString: @"https://facebook.com/myAppsPage"]];

cela fonctionne très bien s'il n'y a pas d'application Facebook sur l'appareil. Ensuite, le lien s'ouvre dans Safari.

Si une application Facebook est installée sur l'appareil, puis, après l'exécution du code ci-dessus, l'application Facebook s'ouvre, mais affiche la chronologie des utilisateurs, pas la page de mon application. J'ai essayé de changer le lien en @"fb://pages/myAppsPage" et en @"fb://profile/myAppsPage, mais cela a de nouveau ouvert la chronologie des utilisateurs.

Ma question est donc la suivante: comment puis-je ouvrir ma page d'applications dans Safari, s'il n'y a pas d'application Facebook, ou dans l'application Facebook, si celle-ci est installée.

65
medvedNick

Vous devez utiliser l'ID facebook pour la page donnée plutôt que l'URL personnalisée. Pour obtenir l'ID de la page, entrez le nom de votre nom de la page à l'URL suivante et copiez la valeur correspondant à "id":

https://graph.facebook.com/yourappspage

Une fois que vous avez l'ID, vous pouvez configurer la méthode pour vérifier si le FB est installé à l'aide de la méthode canOpenURL et fournir le contenu approprié pour les deux états:

NSURL *facebookURL = [NSURL URLWithString:@"fb://profile/113810631976867"];
if ([[UIApplication sharedApplication] canOpenURL:facebookURL]) {
    [[UIApplication sharedApplication] openURL:facebookURL];
} else {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://facebook.com"]];
}
120
Sean Kladek

J'étais heureux de trouver la réponse de skladek, alors voici ma contribution: Swift + autres réseaux sociaux.

J'ai trouvé qu'il me fallait 3 barres obliques pour Twitter et seulement 2 pour Facebook et Google+, je n'ai pas enquêté davantage que cela…

// Go to https://graph.facebook.com/PageName to get your page id
func openFacebookPage() {
    let facebookURL = NSURL(string: "fb://profile/PageId")!
    if UIApplication.sharedApplication().canOpenURL(facebookURL) {
        UIApplication.sharedApplication().openURL(facebookURL)
    } else {
        UIApplication.sharedApplication().openURL(NSURL(string: "https://www.facebook.com/PageName")!)
    }
}

func openTwitterProfile() {
    let twitterURL = NSURL(string: "Twitter:///user?screen_name=USERNAME")!
    if UIApplication.sharedApplication().canOpenURL(twitterURL) {
        UIApplication.sharedApplication().openURL(twitterURL)
    } else {
        UIApplication.sharedApplication().openURL(NSURL(string: "https://Twitter.com/USERNAME")!)
    }
}

func openGooglePlusPage() {
    let googlePlusURL = NSURL(string: "gplus://plus.google.com/u/0/PageId")!
    if UIApplication.sharedApplication().canOpenURL(googlePlusURL) {
        UIApplication.sharedApplication().openURL(googlePlusURL)
    } else {
        UIApplication.sharedApplication().openURL(NSURL(string: "https://plus.google.com/PageId")!)
    }
}

Une tentative de refactoring:

struct SocialNetworkUrl {
    let scheme: String
    let page: String

    func openPage() {
        let schemeUrl = NSURL(string: scheme)!
        if UIApplication.sharedApplication().canOpenURL(schemeUrl) {
            UIApplication.sharedApplication().openURL(schemeUrl)
        } else {
            UIApplication.sharedApplication().openURL(NSURL(string: page)!)
        } 
    }
}

enum SocialNetwork {
    case Facebook, GooglePlus, Twitter, Instagram
    func url() -> SocialNetworkUrl {
        switch self {
        case .Facebook: return SocialNetworkUrl(scheme: "fb://profile/PageId", page: "https://www.facebook.com/PageName")
        case .Twitter: return SocialNetworkUrl(scheme: "Twitter:///user?screen_name=USERNAME", page: "https://Twitter.com/USERNAME")
        case .GooglePlus: return SocialNetworkUrl(scheme: "gplus://plus.google.com/u/0/PageId", page: "https://plus.google.com/PageId")
        case .Instagram: return SocialNetworkUrl(scheme: "instagram://user?username=USERNAME", page:"https://www.instagram.com/USERNAME")
        }
    }
    func openPage() {
        self.url().openPage()
    }
}

Maintenant, vous pouvez appeler:

SocialNetwork.Twitter.openPage()
29
Nycen

Il semble que depuis la dernière réponse, Facebook a modifié le schéma des pages (le profil est le même qu'avant) 

le page_id fait maintenant partie de la requête d'URL . Donc, pour pouvoir rediriger vers l'application fb, l'URL doit être au format suivant:

fb://page/?id='your_page_numeric_id'

Assurez-vous également de mettre la liste fb en liste blanche dans vos applications Info.plist

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fb</string>
</array>

Au cas où il y aurait d'autres modifications ou si vous ne connaissez pas le page_id de votre page Facebook, vous pouvez extraire l'URL iOS fb précise de la source de votre page Web Facebook. 

  1. Ouvrez votre page Facebook dans Safari
  2. Clic droit -> Élément à inspecter
  3. Rechercher al:ios:url

Vous devriez pouvoir trouver:

<meta property="al:ios:url" content="fb://page/?id='your_page_numeric_id'">

Copier cette URL dans votre application, puis appeler:

guard let facebookURL = NSURL(string: "fb://page/?id='your_page_numeric_id'") else {
    return
}

if (UIApplication.sharedApplication().canOpenURL(facebookURL)) {
    UIApplication.sharedApplication().openURL(facebookURL)
} else {

    guard let webpageURL = NSURL(string: "http://facebook.com/yourPage/") else {
        return
    }

    UIApplication.sharedApplication().openURL(webpageURL)
}

devrait faire le travail.

23
ambientlight

Pour iOS 9, vous devez inclure dans la liste blanche les URL que votre application appellera pour utiliser la clé LSApplicationQueriesSchemes dans votre Info.plist. 

Vérifiez ici .

<key>LSApplicationQueriesSchemes</key>
    <array>
     <string>fb</string>
     <string>fbapi</string>
     <string>fbauth2</string>
     <string>fbshareextension</string>
     <string>fb-messenger-api</string>
     <string>Twitter</string>
     <string>whatsapp</string>
     <string>wechat</string>
     <string>line</string>
     <string>instagram</string>
     <string>kakaotalk</string>
     <string>mqq</string>
     <string>vk</string>
     <string>comgooglemaps</string>
    </array>
11
Emre

Après de nombreux essais, j'ai trouvé l'une des solutions les plus efficaces:

NSString *facebookID = @"XXXXXXXXXX";
NSString *facebookURL = @"www.facebook.com/XXXXXXXX";
NSURL *urlModal = [NSURL URLWithString:[NSString stringWithFormat:@"fb://facewebmodal/f?href=%@", facebookURL]];
NSURL *urlWithID = [NSURL URLWithString:[NSString stringWithFormat:@"fb://page/%@", facebookID]]; // or "fb://profile/%@" or another type of ID
NSURL *url = [NSURL URLWithString:facebook_url];


if(facebookID && !facebookID.isEmpty && [[UIApplication sharedApplication] canOpenURL:urlWithID]) {
    // open facebook app with facebookID
    [[UIApplication sharedApplication] openURL:urlWithID];
} else if (facebookURL && !facebookURL.isEmpty && [[UIApplication sharedApplication] canOpenURL:urlModal]) {
    // open facebook app with facebookUrl
    [[UIApplication sharedApplication] openURL:urlModal];
} else if (![[UIApplication sharedApplication] openURL:url]) {
    // somehow open
    NSLog(@"%@%@",@"Failed to open url:",[url description]);
}

L'ordre des phrases "if else" varie selon vos goûts ...

Profitez-en!! :-)

1
Javier Amor Penas

Swift 2.3

Pour le code, vous pouvez utiliser cet exemple:

Remarque: Si vous ne trouvez pas l'identifiant de profil facebook, pouvez-vous utiliser le site suivant pour le faire ( https://findmyfbid.com/ )

func goFacebook() {
    let profileID = "" //Here put profile id Example:'62260589592'
    let facebookURL = NSURL(string: "fb://profile/\(profileID)")!

    if UIApplication.sharedApplication().canOpenURL(facebookURL) {
        UIApplication.sharedApplication().openURL(facebookURL)
    } else {
        UIApplication.sharedApplication().openURL(NSURL(string: "https://www.facebook.com/PageName")!)
    }
}

Pour Info.plist, vous devez définir les paramètres suivants:

Remarque: pour ouvrir le fichier Info.plist en mode source

-Allez dans le fichier Info.plist et cliquez à droite

-Sélectionnez "Ouvrir en tant que"

-Sélectionnez "Code source"

-Mettre le code ci-dessus d'un autre 

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>fb</string>
 <string>fbapi</string>
 <string>fbauth2</string>
 <string>fbshareextension</string>
 <string>fb-messenger-api</string>
</array>
0
Cristian Mora