最新的Facebook SDK是否自动检查其应用程序是否已安装?它说它会……但这不会发生在我身上



我想提供分享图片到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];

最新更新