web-dev-qa-db-ja.com

iOSアプリからFacebookページへのリンクを開く

ユーザーをアプリのFacebookページにリダイレクトしたいので、次のコードがあります。

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

デバイスにFacebookアプリがない場合、これは非常に効果的です。次に、Safariでリンクが開きます。

デバイスにFacebookアプリがインストールされている場合、上記のコードを実行するとFacebookアプリが開きますが、アプリのページではなくユーザーのタイムラインが表示されます。リンクを@"fb://pages/myAppsPage"および@"fb://profile/myAppsPageに変更しようとしましたが、これによりユーザーのタイムラインが再び開かれました。

だから、私の質問は次のとおりです。Facebookアプリがない場合、またはFacebookアプリがインストールされている場合、サファリでアプリページを開くにはどうすればよいですか。

67
medvedNick

バニティURLではなく、指定されたページのfacebook IDを使用する必要があります。ページIDを取得するには、次のURLでページのバニティ名を入力し、「id」の値をコピーします。

https://graph.facebook.com/yourappspage

Idを取得したら、canOpenURLメソッドを使用してFBがインストールされているかどうかを確認するメソッドを設定し、両方の状態に適切なコンテンツを提供できます。

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"]];
}
122
Sean Kladek

Skladekの答えを見つけてうれしかったので、ここに私の貢献を示します:Swift +その他のソーシャルネットワーク。

Twitterには3つのスラッシュが必要で、FacebookとGoogle+には2つしか必要ないことがわかりました。それ以上の調査はしませんでした…

// 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")!)
    }
}

リファクタリングの試み:

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()
    }
}

今、あなたは呼び出すことができます:

SocialNetwork.Twitter.openPage()
29
Nycen

Facebookの最後の回答以来、ページのスキームが変更されたようです(プロファイルは以前と同じです)

page_idはURLクエリの一部になりました。そのため、fbアプリにリダイレクトするには、URLの形式を次のようにする必要があります。

fb://page/?id=your_page_numeric_id

また、アプリのfbスキームをホワイトリストに追加してくださいInfo.plist

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

さらに変更がある場合、またはFacebookページのpage_id、Facebook Webページのソースから正確なiOS fb URLを抽出できます。

  1. SafariでFacebookページを開きます
  2. 右クリック->要素の検査
  3. 検索する al:ios:url

あなたが見つけることができるはずです:

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

このURLをアプリにコピーしてから呼び出します:

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)
}

仕事をする必要があります...

28
ambientlight

IOS 9の場合、Info.plistでLSApplicationQueriesSchemesキーを使用してアプリが呼び出すURLをホワイトリストに登録する必要があります。

こちら を確認してください。

<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

何度もテストした結果、最も効果的なソリューションの1つが見つかりました。

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]);
}

「他の場合」の文の順序はあなたの好みによって異なります...

楽しめ!! :-)

1

Swift 2.3

コードの場合、次の例を使用できます。

注:FacebookのプロフィールIDが見つからない場合は、フォローサイトを使用してそれを行うことができます( 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")!)
    }
}

Info.plistの場合、次のパラメーターを設定する必要があります。

注:ソースモードでInfo.plistを開くには

-Info.plistファイルに移動し、右クリックします

-「名前を付けて開く」を選択します

-「ソースコード」を選択

-別のコードの上にコードを配置する

<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