Facebook分享内容在iOS 9中仅分享URL

38

在 iOS 8 中,使用 FBSDKShareDialog 共享链接内容FBSDKShareLinkContent 可以正常工作,但在 iOS 9 设备上无法分享 imageURLcontentTitlecontentDescription

该应用程序基于 iOS 9 SDK、Xcode 7、Facebook SDK 4.7.0 构建,并完成了为 iOS9 准备应用程序中提到的所有操作。该应用程序目前不在 App Store 上,Facebook 应用程序处于开发模式。

呈现对话框的代码非常常见(Swift 2.0):

let content = FBSDKShareLinkContent()

content.contentURL = <URL to the app in the App Store>
content.imageURL = <valid image URL>
content.contentTitle = <some title>
content.contentDescription = <some descr>

let shareDialog = FBSDKShareDialog()
shareDialog.fromViewController = viewController
shareDialog.shareContent = content
shareDialog.delegate = self

if !shareDialog.canShow() {
    print("cannot show native share dialog")
}

shareDialog.show()
在iOS 9上,Facebook SDK呈现的本机对话框没有图像、标题和描述: 在iOS 9上,Facebook SDK呈现的本机对话框没有图像、标题和描述 当iOS 9设备上安装了FB应用时,呈现对话框时出现错误,添加相应URL到Info.plist后不会解决问题。只是日志语句不再显示。
-canOpenURL: failed for URL: "fbapi20150629:/" - error: "This app is not allowed to query for scheme fbapi20150629"

这会导致一个空的帖子:

empty post shared from iOS 9 device appearance from the web

然而,在iOS 8上,该对话框是通过FB应用程序呈现的,或者在未安装FB应用程序时通过应用内Safari vc打开。

出于比较的目的,相同的代码可在iOS 8设备上正常工作:

iOS 8 share post appearance

更新:

虽然@rednuht's的答案解决了最初的问题,但值得注意的是由@sophie-fader指出的AppStore URL特定情况


1
我无法在使用iOS 9设备时在Facebook上分享标题和描述,我正在使用与答案中给出的相同代码,如何分享标题和描述? - Rushabh
9个回答

59

我遇到了同样的问题,我的解决方法是将共享对话框模式设置为使用本机应用程序。

我使用的是Obj-C语言,但在Swift语言中应该基本相同:

FBSDKShareDialog *dialog = [[FBSDKShareDialog alloc] init];
dialog.fromViewController = viewController;
dialog.shareContent = content;
dialog.mode = FBSDKShareDialogModeNative; // if you don't set this before canShow call, canShow would always return YES
if (![dialog canShow]) {
    // fallback presentation when there is no FB app
    dialog.mode = FBSDKShareDialogModeFeedBrowser;
}
[dialog show];

在iOS 9中,用户会看到应用切换对话框,但它能正常工作。还有一个名为FBSDKShareDialogModeWeb的选项,它不会显示应用切换对话框,但也不会显示图片。
默认选项是FBSDKShareDialogModeAutomatic,它会选择FBSDKShareDialogModeShareSheet,这就是你看到的那个。
更新:以下是iOS9可用对话框模式的行为:
- FBSDKShareDialogModeAutomatic:使用ShareSheet,这就是OP的情况 - FBSDKShareDialogModeShareSheet:同上 - FBSDKShareDialogModeNative:如果用户安装了FB应用,则可以使用,否则会静默失败。会出现应用切换对话框。 - FBSDKShareDialogModeBrowser:分享时不显示图片。 - FBSDKShareDialogModeWeb:分享时不显示图片。 - FBSDKShareDialogModeFeedBrowser:正常工作。 - FBSDKShareDialogModeFeedWeb:正常工作。
“Browser”会全屏打开Safari,“Web”会打开一个WebView对话框。
我建议在iOS9上选择最后两个选项,在iOS8上选择自动选项。

我刚刚用其他模式进行了一些测试:
  • FBSDKShareDialogModeBrowser - 没有图片
  • FBSDKShareDialogModeFeedWeb - 可以使用!
现在,由于如果应用程序未安装,则不会出现错误,因此最好对所有情况使用FeedWeb。
- rednuht
FBSDKShareDialogModeFeedBrowser 也可以使用。为了完整起见,我将所有这些都添加到答案中。 - rednuht
当FB应用程序未安装时,演示会默默失败,并将error == nil返回给委托回调函数func sharer(sharer: FBSDKSharing!, didFailWithError error: NSError!) - Yevhen Dubinin
.Native.FeedBrowser的组合确实适用于iOS 9和iOS 8,无论是否安装了FB应用程序。我已经更新了这个答案的代码。谢谢,大家! - Yevhen Dubinin
1
@Rushabh,你能确认标题和描述不是空的,URL不是AppStore的URL吗? - Yevhen Dubinin
显示剩余6条评论

10
解决此问题的方法是将分享对话框模式设置为使用原生应用程序。在iOS9,swift 2.0中。
首先,Facebook分享内容可以共享除iTunes以外的网址及其描述。如果共享iTunes网址,则不会共享我们的描述。
接下来,我遇到了同样的问题,点击FB共享按钮会将我重定向到浏览器,我正在使用的解决方法是将共享对话框模式设置为使用原生应用程序。
如果您要共享的URL是iTunes App Store URL,则会一直发生这种情况。将URL更改为任何其他网站即可解决问题。请参见https://developers.facebook.com/docs/sharing/ios
注意:如果您的应用程序共享到iTunes或Google Play商店的链接,则我们不会发布您在共享中指定的任何图像或描述。相反,我们会直接从Webcrawler中抓取一些应用信息并发布。这可能不包括图像。要预览与iTunes或Google Play的链接共享,请将您的URL输入到URL调试器中。
  func shareFB(sender: AnyObject){

    let content : FBSDKShareLinkContent = FBSDKShareLinkContent()

    content.contentURL = NSURL(string: "//URL other then iTunes/AppStore")
    content.contentTitle = “MyApp”
    content.contentDescription = “//Desc“

    content.imageURL = NSURL(string:“//Image URL”)


    let dialog : FBSDKShareDialog = FBSDKShareDialog()
    dialog.mode = FBSDKShareDialogMode.Native
  // if you don't set this before canShow call, canShow would always return YES
    if !dialog.canShow() {
        // fallback presentation when there is no FB app
      dialog.mode = FBSDKShareDialogModeFeedBrowser
     }
    dialog.show()
 }

我已经添加了相同的 +++ dialog.mode = FBSDKShareDialogMode.Native +++ 它在一天内运行良好,但是当我在第二天分享时它就不起作用了,我不知道问题出在哪里。任何帮助都将不胜感激。谢谢。 - veeresh kumbar
当然,这不仅仅是日期的更改,您必须检查代码,以及任何其他因素,例如您已经测试过的设备,是否尝试在带有FB应用程序的设备或模拟器上进行测试。请检查所有其他因素。 - ViJay Avhad
是的,我已经在已安装 FB 应用程序的设备上进行了测试,但仍出现相同的问题。 :( - veeresh kumbar

7
要摆脱错误信息:-canOpenURL: failed for URL: "fbapi20150629:/" - error: "This app is not allowed to query for scheme fbapi20150629",你可以在你的项目的info.plist文件中的<key>LSApplicationQueriesSchemes</key>数组中添加以下行:<string>fbapi20150629</string>

1
这在文档的底部FAQ部分中有说明,我已经遵循并提到了。将此添加到LSApplicationQueriesSchemes本身并不能解决问题。 - Yevhen Dubinin

2

2

在您的应用中使用Facebook分享对话框,包含标题、描述和图片:

  1. iOS:

dialog.mode = FBSDKShareDialogMode.ShareSheet //尚未尝试

or
//Working for me:


let linkcontent: FBSDKShareLinkContent = FBSDKShareLinkContent()
        linkcontent.contentURL = videoURL
 //       linkcontent.contentDescription = videoDesc
 //       linkcontent.contentTitle = videoTitle
 //       linkcontent.imageURL = imageURL
        FBSDKShareDialog.showFromViewController(self, withContent: linkcontent, delegate: self)
  1. 从网络实现:共享链接的标题、描述和图片应该是由 Facebook 自动带来的 URL 的响应。 例如:

我的分享 URL 标题


2
下面的代码对我在各种情况下都很有效:
@IBAction func facebookTap() {
    let content = FBSDKShareLinkContent()
    content.contentTitle = imageTitle
    content.contentURL =  URL(string: "http://technokriti.com/")
    content.imageURL = URL(string: self.imageURL)
    content.contentDescription = imageDescription

    let dialog : FBSDKShareDialog = FBSDKShareDialog()
    dialog.fromViewController = self
    dialog.shareContent = content
    dialog.mode = FBSDKShareDialogMode.feedWeb
    dialog.show()
}

谢谢你。Facebook 的本地视图实在是让人头疼。如果你的手机没有连接 Facebook,而你想要呈现登录对话框,那么这种方法就必不可少了。 - Pan Mluvčí

0

0

如果我们让 FBSDKShareLinkContent 的 contentURL 为空,Facebook 标题就会被共享。

例如:

content.contentURL = [[NSURL alloc] initWithString:@"http://"];

当传递空白的URL时,它会给出一个错误提示,表明“href格式不正确”。 - Mayur Shrivas

0
This works for me:-

FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
content.contentURL = [NSURL URLWithString:APP_STORE_LINK];
content.imageURL=[NSURL URLWithString:IMAGE_LINK];

FBSDKShareDialog *dialog = [[FBSDKShareDialog alloc] init];
dialog.shareContent = content;
dialog.fromViewController = self;
dialog.mode = FBSDKShareDialogModeFeedBrowser;
[dialog show];

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