从iOS应用打开指向Facebook页面的链接


68

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

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

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

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

所以,我的问题是:如果没有Facebook应用程序,如何在野生动物园中打开我的应用程序页面;如果安装了Facebook应用程序,如何在Facebook应用程序中打开我的应用程序页面。

Answers:


123

您必须使用给定页面的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"]];
}

1
没问题。请注意,URL方案几乎是完全没有文档记录的,而Facebook则要继续支持此功能。他们可以在任何给定时间对其进行重大更改。
肖恩·克拉德克

3
感谢您提供的使用技巧,该技巧fb://profile/xxxxx在当前版本的Facebook应用程序中效果很好。一直在寻找在互联网的解决方案,使用的建议,fb://page/xxxxx这确实没有工作,没有加载页面时,可能是对旧版本的Facebook应用程序的。
2013年

1
确认这在iOS7和iOS8上仍然可以成功运行。

7
随着Facebook弃用ID,这不再起作用。
kopiro 2015年

4
在iOS 9中,请记住通过LSApplicationQueriesSchemes在您的Info.plist中添加数组键并将该项fb作为字符串项添加到数组中来将该方案列入白名单。
莱安德罗

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页面的page_id,可以fb从Facebook网页源中提取精确的iOS 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)
}

应该做...


1
由于此答案已有一年以上的历史,因此:从本评论起,我可以确认此方法(在我的情况下为fb:// event?id = <eventID>)有效。在iOS 10和最新的Facebook应用版本上。
nickdnk

某种程度上它对我不起作用,但是是2月6日,大声笑;它只会打开我当前使用的登录页面
。– TheeBen

1
确认适用于iOS10。正如OP所述,您需要在Safari中打开FB页面以获取正确的内容al:ios:url
David T

寻找该al:ios:url物业的大秘密!我只是用它来查找如何对Facebook组(而不是页面)进行深层链接。欢呼声
BigMcLargeHuge

30

我很高兴找到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?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()

由于网址,这似乎不起作用。我必须将网址从“ fb:/// profile / PageId”更改为“ fb:// profile / PageId”
nRewik 2015年

感谢@NutchaphonRewik的反馈,我最终对fb使用//而不是///,但是忘了编辑我的答案。现在已更正。
Arnaud 2015年

绝对是最好的答案!Thx
Bertrand Bloc'h

1
就我而言,“ fb:// profile / PageId”-它的开头新闻提要;不是Facebook页面:(
Avisek Chakraborty

@AviC是否确定已更改页面值(替换PageName)?
Arnaud

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>

2

我刚刚找到了该URL方案fb://profile?id={userid/username/pageid},并且到2020年8月30日它仍能正常工作。

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

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


我发现它张贴在这里2018和确认它的工作原理,所以它应该是“相当稳定” URL方案:tutorialspoint.com/...
亚历克斯·普雷代斯库

工作解决方案2020
Naveed Ahmad

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

迅捷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>

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

请提供答案的解释,以便更好地理解。
Ankit Das
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.