我想提供分享图片到Facebook的选项。当我安装FB应用程序时,我可以毫无问题地向我的feed发布内容。但是,当没有安装应用程序时,我得到以下错误:
- canopenurl: failed for URL: "fbauth2:/" - error: "(null) "
Facebook在文档中说我不需要做任何事情:
现在SDK自动检查原生Facebook应用程序。如果它没有安装,SDK切换到他们的默认浏览器,并打开Feed对话框。如果有人想分享一个Open Graph故事,SDK会打开Web共享对话框。
我发现可以检查的一个hack是:
BOOL isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fbauth2:/"]];
if (isInstalled) {....}
有没有更好更"正确"的方式?
我用来共享的抛出错误的方法如下:
- (void)showFBShare {
FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc] init];
photo.image = self.shareImage;
photo.userGenerated = YES;
FBSDKSharePhotoContent *content = [[FBSDKSharePhotoContent alloc] init];
content.photos = @[photo];
[FBSDKShareDialog showFromViewController:self
withContent:content
delegate:nil];
}
tl;dr:实例化并配置FBSDKShareDialog为dialog并设置dialog。mode = FBSDKShareDialogModeNative或FBSDKShareDialogModeShareSheet。if [dialog canShow] then [dialog show].
用于测试解决方案的FBSDK版本:
- FBSDKCoreKit (4.12.0):
- FBSDKShareKit (4.12.0):
当调用showFromViewController方法时,该方法似乎不会抛出任何异常,因此排除了try/catch修复。然而,如果你实例化FBSDKShareDialog,你可以调用canShow方法来检查应用程序是否能够在其当前模式中显示对话框(在本例中为FBSDKShareDialogModeShareSheet)。
方法描述from source (FBSDKSharing.h:64):
@abstract布尔值,表示接收方是否可以发起共享。
@discussion可能返回NO,如果适当的Facebook应用程序没有安装,是必需的或访问令牌是必需但不可用。此方法不验证接收器上的内容,因此可以在此之前进行检查构建内容。
@see [FBSDKSharing validateWithError:]
@result如果接收方可以共享,则为"是",否则为"否"。
() - BOOL canShow;
代码示例:
...
FBSDKShareDialog *dialog = [[FBSDKShareDialog alloc] init];
dialog.fromViewController = self;
dialog.shareContent = content;
/**
* !important: Only mode FBSDKShareDialogModeNative and
* FBSDKShareDialogModeShareSheet do the appropriate checks.
* Otherwise canShow returns yes regardless.
*/
dialog.mode = FBSDKShareDialogModeShareSheet;
if ([dialog canShow]) {
[dialog show];
} else {
// handle exception case.
}
模拟器运行时的问题(来自文档):
iOS Simulator and Testing
如果你在应用程序中使用模拟器来测试共享,如果你尝试共享视频,照片或Open Graph Actions,你会看到错误。这是因为你需要在iOS上安装Facebook,它提供共享对话框。我们不支持模拟器。
在链接共享的情况下,你不需要为iOS安装Facebook,所以这个测试用例是可能的。要测试其他共享场景,请设置一个安装了Facebook for iOS的实际测试设备。
如上所述,模拟器只支持链接内容。例如:
FBSDKShareLinkContent *linkContent = [[FBSDKShareLinkContent alloc] init];
linkContent.contentURL = [NSURL URLWithString:@"somelink"];
linkContent.quote = @"Very interesting, shareworthy link.";
[FBSDKShareDialog showFromViewController:self
withContent:linkContent
delegate:nil];