在iOS上使用原生的Facebook应用程序打开Facebook链接

65
如果iPhone上已安装原生Facebook应用程序,我应该如何从我的应用程序中将Facebook链接打开到原生Facebook应用程序。在通过Safari打开的情况下,链接与以下链接相同:

http://www.facebook.com/AlibabaUS

谢谢。

5
你的方法无法在新版 Facebook 应用程序(2012年8月)中使用……fb://profile/<id> 是指向个人资料的链接。 - yonix
11个回答

133

以下是Facebook应用程序使用的一些方案,源链接中还有更多内容:

示例

NSURL *url = [NSURL URLWithString:@"fb://profile/<id>"];
[[UIApplication sharedApplication] openURL:url];

链接方案

fb://profile – 打开用户资料的Facebook应用程序

fb://friends – 打开Facebook应用程序的好友列表

fb://notifications – 打开Facebook应用程序的通知列表(注意:此URL存在问题。通知页面会打开,但无法在Facebook应用程序中导航到其他任何地方)

fb://feed – 打开Facebook应用程序的新闻源

fb://events – 打开Facebook应用程序的活动页面

fb://requests – 打开Facebook应用程序的请求列表

fb://notes – 打开Facebook应用程序的笔记页面

fb://albums – 打开Facebook应用程序的照片相册列表

如果在打开此URL之前要检查用户是否拥有Facebook应用程序,可以执行以下操作(如下面的另一个答案中所述):

if ([[UIApplication sharedApplication] canOpenURL:nsurl]){
    [[UIApplication sharedApplication] openURL:nsurl];
}
else {
    //Open the url as usual
}

来源

http://wiki.akosma.com/IPhone_URL_Schemes#Facebook


3
请注意,Facebook官方不支持计划方案,这些方案可能随时更改/停止运行。 - DogDog
1
我知道ID是正确的,但是页面显示未找到。你有什么想法为什么会这样? - C0D3
1
我们需要在iOS 9的Info.plist中添加白名单以使其工作。请参见http://useyourloaf.com/blog/querying-url-schemes-with-canopenurl.html。 - haxpor
1
我做了同样的事情,但是对于包含视频的帖子却不起作用。它会跳转到Facebook应用程序,但是什么也不显示。例如这个10153231379946729。有什么想法吗? - hientrq
源链接已失效。是否有官方文档的更新链接? - alexdriedger
显示剩余7条评论

27

只需使用https://graph.facebook.com/(your_username或页面名称)来获取您的页面ID,然后您就可以查看所有详细信息和您的ID。

在您的IOS应用程序中使用:

 NSURL *url = [NSURL URLWithString:@"fb://profile/[your ID]"];
 [[UIApplication sharedApplication] openURL:url];

1
感谢提供图表链接!非常有用。 - Plot
1
这是谜题中的重要一环。谢谢! - Chris Miles
5
无法运行。 错误: 信息:"需要访问令牌才能请求此资源。" 类型:"OAuthException" 代码:104 FBTrace ID:"AlTl1RaNO9b" - thienlode
这在iOS 9上对我很有效,但在iOS 8和iOS 10上它只是打开Facebook应用程序而不进入我的页面。 - AmineG

26
为将yonix的评论作为回答添加,旧的 fb://page/… URL不再有效。 显然它已被 fb://profile/… 替换,尽管页面不是个人资料。

2
我正在尝试并且在 FB 应用程序加载后得到“页面未找到”的错误。无法弄清原因。 - C0D3

10

我在MonoTouch中使用了以下方法,我相信纯Obj-C的方法并不会有太大差异。我将其用于一个具有不断变化的URL的类中,这就是为什么我没有将它放在if/elseif语句中的原因。

NSString *myUrls = @"fb://profile/100000369031300|http://www.facebook.com/ytn3rd";
NSArray *urls = [myUrls componentsSeparatedByString:@"|"];
for (NSString *url in urls){
    NSURL *nsurl = [NSURL URLWithString:url];
    if ([[UIApplication sharedApplication] canOpenURL:nsurl]){
        [[UIApplication sharedApplication] openURL:nsurl];
        break;
    }
}

在您的应用程序转换到Safari/Facebook之前,并不总是会调用break语句。我假设当您回到应用程序时,您的程序将在那里停止并调用该语句。


谢谢你的编辑。那是我最初发布的Monotouch代码的Obj-C代码。 - Brad Moore

8
我知道这个问题很老了,但为了支持以上答案,我想分享我的工作代码。 只需将这两种方法添加到任何类中。该代码检查Facebook应用程序是否已安装,如果未安装,则在浏览器中打开URL。如果在尝试查找profileId时发生任何错误,则将在浏览器中打开该页面。只需将url(例如,http://www.facebook.com/AlibabaUS)传递给openUrl:它会完成所有魔法。希望能对有所帮助! 注意:UrlUtils是我的类,您可能需要将其更改为其他名称以适合您的需求。
+(void) openUrlInBrowser:(NSString *) url
{
    if (url.length > 0) {
        NSURL *linkUrl = [NSURL URLWithString:url];
        [[UIApplication sharedApplication] openURL:linkUrl];
    }
}
+(void) openUrl:(NSString *) urlString
{

    //check if facebook app exists
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]]) {

        // Facebook app installed
        NSArray *tokens = [urlString componentsSeparatedByString:@"/"];
        NSString *profileName = [tokens lastObject];

        //call graph api
        NSURL *apiUrl = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@",profileName]];
        NSData *apiResponse = [NSData dataWithContentsOfURL:apiUrl];

        NSError *error = nil;
        NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:apiResponse options:NSJSONReadingMutableContainers error:&error];

        //check for parse error
        if (error == nil) {

            NSString *profileId = [jsonDict objectForKey:@"id"];

            if (profileId.length > 0) {//make sure id key is actually available
                NSURL *fbUrl = [NSURL URLWithString:[NSString stringWithFormat:@"fb://profile/%@",profileId]];
                [[UIApplication sharedApplication] openURL:fbUrl];
            }
            else{
                [UrlUtils openUrlInBrowser:urlString];
            }

        }
        else{//parse error occured
            [UrlUtils openUrlInBrowser:urlString];
        }

    }
    else{//facebook app not installed
        [UrlUtils openUrlInBrowser:urlString];
    }

}

这个不再起作用了: "message": "(#803) 无法通过用户名(user.name)查询用户" - Jasper

4

swift 3

if let url = URL(string: "fb://profile/<id>") {
        if #available(iOS 10, *) {
            UIApplication.shared.open(url, options: [:],completionHandler: { (success) in
                print("Open fb://profile/<id>: \(success)")
            })
        } else {
            let success = UIApplication.shared.openURL(url)
            print("Open fb://profile/<id>: \(success)")
        }
 }

如何获取这个ID? - Neelam Pursnani
这里有一个链接可能会对你有所帮助:https://developers.facebook.com/docs/apps/upgrading#upgrading_v2_0_user_ids - iParesh
当您创建Facebook帐户时,Facebook会为用户创建唯一的ID。以上示例中,我们需要在本机Facebook应用程序上打开用户个人资料。 - iParesh
你尝试在Info.plist文件中设置LSApplicationQueriesSchemes了吗?如果没有,请尝试设置并检查。这里是链接https://dev59.com/2Zffa4cB1Zd3GeqP1gP5 - iParesh
我已经添加了这4个东西: <string>fb</string> <string>fbapi</string> <string>fbauth2</string> <string>fbshareextension</string> <string>fb-messenger-api</string> - Neelam Pursnani
显示剩余4条评论

1

今天刚验证过,如果你想要打开Facebook的页面,可以使用"fb://page/{Page ID}"

页面ID可以在页面底部的关于部分找到。

对于我的用例,在Xamarin.Forms中,您可以使用此代码片段在应用程序中打开,否则在浏览器中打开。

Device.OpenUri(new Uri("fb://page/{id}"));


1

之前的方法fb://profile/[ID]已经失效。

请尝试使用fb://profile?id=[ID]

使用示例:

// Open Profile or page
// To open in Application
if UIApplication.shared.canOpenURL(URL(string: "fb://profile?id=vikramchaudhary.ios")!) {
    UIApplication.shared.open(URL(string: "fb://profile?id=vikramchaudhary.ios")!, options: [:], completionHandler: nil)
} else {
    // To open in safari
    UIApplication.shared.open(URL(string: "https://facebook.com/vikramchaudhary.ios/")!, options: [:], completionHandler: nil)
}

1
如果Facebook应用程序已登录,则执行以下代码时将打开该页面。如果在执行代码时尚未登录Facebook应用程序,则用户将被重定向到Facebook应用程序以进行登录,然后连接到Facebook之后不会被重定向到该页面!
NSURL *fbNativeAppURL = [NSURL URLWithString:@"fb://page/yourPageIDHere"] [[UIApplication sharedApplication] openURL:fbNativeAppURL]

0

这将在Safari中打开URL:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.facebook.com/comments.php?href=http://wombeta.jiffysoftware.com/ViewWOMPrint.aspx?WPID=317"]];

对于 iPhone,如果已安装 Facebook 应用程序,则可以使用以 fb:// 开头的 URL 启动 Facebook 应用程序

更多信息可以在此处找到:http://iphonedevtools.com/?p=302 还可以在此处找到:http://wiki.akosma.com/IPhone_URL_Schemes#Facebook

从上述网站盗取:

fb://profile – Open Facebook app to the user’s profile
fb://friends – Open Facebook app to the friends list
fb://notifications – Open Facebook app to the notifications list (NOTE: there appears to be a bug with this URL. The Notifications page opens. However, it’s not possible to navigate to anywhere else in the Facebook app)
fb://feed – Open Facebook app to the News Feed
fb://events – Open Facebook app to the Events page
fb://requests – Open Facebook app to the Requests list
fb://notes - Open Facebook app to the Notes page
fb://albums – Open Facebook app to Photo Albums list

要启动以上的URL:

NSURL *theURL = [NSURL URLWithString:@"fb://<insert function here>"];
[[UIApplication sharedApplication] openURL:theURL];

在模拟器6.1中进行检查是否可行? - Chintan
你不能在模拟器上添加任何应用程序。这就是为什么它无法在模拟器上运行的原因。 - Saad
在iOS 7中,似乎即使URL无法正常工作(例如使用别名而不是UID),http facebook URL也会在本机Facebook应用程序中打开。我应该提交一个radar。 - gerry3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接