68

我想将用户重定向到我的应用程序的 Facebook 页面,所以我有以下代码:

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

如果设备上没有 Facebook 应用程序,这很好用。然后链接在 Safari 中打开。

如果设备上安装了 Facebook 应用程序,则在执行上述代码后,Facebook 应用程序会打开,但它显示的是用户时间线,而不是我的应用程序页面。我试图将链接更改为@"fb://pages/myAppsPage"@"fb://profile/myAppsPage,但这再次打开了用户时间线。

所以,我的问题是:如果没有 Facebook 应用程序,我如何在 safari 中打开我的应用程序页面,或者如果安装了 Facebook 应用程序,我该如何打开我的应用程序页面。

4

8 回答 8

124

您必须使用给定页面的 facebook ID 而不是虚 URL。要获取页面 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"]];
}
于 2013-05-16T15:06:52.103 回答
38

似乎自上次回答以来,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 页面,您可以从您的 Facebook 网页源page_id中提取准确的 iOS URL。fb

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

应该做的工作...

于 2015-12-17T04:52:43.120 回答
30

我很高兴找到 skladek 的答案,所以这是我的贡献:Swift + 其他社交网络。

我发现 twitter 需要 3 个正斜杠,而 Facebook 和 Google+ 只需要 2 个,我没有调查更多……</p>

// Go to https://graph.facebook.com/PageName to get your page id
func openFacebookPage() {
    let facebookURL = NSURL(string: "fb://profile?id=PageName")!
    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()
于 2015-02-12T17:58:50.517 回答
11

对于 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>
于 2015-12-01T22:29:28.617 回答
3

我刚刚找到了这个 URL 方案fb://profile?id={userid/username/pageid},截至 2020 年 8 月 30 日它运行良好。

例如:fb://profile?id=4fb://profile?id=zuck

警告:请自行承担使用风险,因为 Facebook 开发人员文档中没有记录。此 URL 方案将来可能会被 Facebook 应用程序删除,而不会发出任何警告和指示。

于 2020-08-30T14:18:14.020 回答
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]);
}

句子“if else”的顺序因您的喜好而异...

好好享受!!:-)

于 2015-09-14T15:26:46.860 回答
1

斯威夫特 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,您需要设置以下参数:

注意:要在 Source Mode 上打开 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>
于 2018-03-01T21:48:58.470 回答
1

// Swift 5,您可以使用此功能打开 fb 页面/配置文件

       func openFacebookPage() {
            let facebookURL = NSURL(string: "fb://profile/PageId")!
            if UIApplication.shared.canOpenURL(facebookURL as URL) {
            UIApplication.shared.open(facebookURL as URL)
        } else {
            UIApplication.shared.open(NSURL(string: 
             "https://www.facebook.com/PageName")! as URL)
           }
      }
//By Using PageId or name only
      func openFacebookPage(pageID:String) {
            let facebookURL = NSURL(string: "fb://profile/\(pageID)")!
            if UIApplication.shared.canOpenURL(facebookURL as URL) {
            UIApplication.shared.open(facebookURL as URL)
         } else {
             UIApplication.shared.open(NSURL(string: "https://www.facebook.com/\ 
           (pageID)")! as URL)
         }
     }
//By Using Url only
     func openFacebookPageURL(url:String) {
               let facebookURL = NSURL(string: url)!
               if UIApplication.shared.canOpenURL(facebookURL as URL) {
               UIApplication.shared.open(facebookURL as URL)
            } else {
               UIApplication.shared.open(NSURL(string: url)! as URL)
            }
        }
于 2020-09-23T05:45:42.820 回答