UIActivityViewController在Facebook上不显示默认文本。

45

我正在使用UIActivityViewController,它提供一些默认文本和链接。对于所有的社交媒体(短信、电子邮件、Twitter),默认的文本和URL都会显示出来。然而,在Facebook上,尽管URL的图片被显示了,但默认的文本并没有显示出来(它只是空白)。以下是代码:

    NSString *shareStr = [NSString stringWithFormat:@""some text"];
    NSURL *website = [NSURL URLWithString:@"website"];
    NSArray *shareAray = @[shareStr,website];

    [self viewWillDisappear:YES];

    UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:shareAray
                                                                                    applicationActivities:nil];

    if([activityController respondsToSelector:@selector(popoverPresentationController)] )
        activityController.popoverPresentationController.barButtonItem = self.shareButton;


    [self presentViewController:activityController
                       animated:YES completion:nil];

    [activityController setCompletionHandler:^(NSString *activityType, BOOL completed){
        if (!activityType || UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            [self viewWillAppear:YES];
        }
    }];

更新: 正如下面其他人所说,Facebook不再允许预填。这里是另一个视频链接,展示了哪些内容是被允许的,哪些内容是被禁止的:https://developers.facebook.com/docs/apps/review/prefill


我也发现了iOS 8.2的这个问题。 - SanitLee
我也在iOS 8.3上看到了这个问题,@DanielStorm你有一个问题号码吗? - francis
只是确认一下,FB应用程序在这个问题中起了很大的作用。我没有看到之前安装的FB应用程序有问题,但最新版本有问题。所以正如@DanielStorm所说,也许要等待新的更新的FB应用程序。 - SanitLee
1
这是多年来一直在使用的Android政策。不要预先填写文本,如果您想与Facebook分享,请放置一个Facebook分享按钮,而不是默认分享。 - encastellano
1
@Daniel Storm 这不是一个错误 - 它是最新 Facebook 应用程序版本的一个特性。从一段时间开始,Facebook 政策不允许文本预填充。它将不会被“修复”,所以等待没有意义。 - mkll
6个回答

50
看起来Facebook不再希望开发者在帖子中预填文本。从https://developers.facebook.com/docs/sharing/ios#ios-integration得知:使用iOS共享工具表视为使用Facebook平台政策,其中包括第2.3节规定的应用程序不得预先填写。在共享表中,这意味着应用程序不能使用先前未由人输入的内容填充共享表的initialText字段。
似乎他们更希望开发者使用SDK: 虽然可以直接使用iOS本地视图控制器API(共享表),但使用Facebook SDK提供的本机iOS Share对话框有几个理由。使用本机共享对话框可以快速测试人们是否已在其iOS 6+设备上登录到Facebook。此API还使用与Facebook SDK的其他部分相同的样式块。

这是已经在安卓系统使用了多年的同样策略。 - encastellano
1
如果Facebook API能够正常运行,并且在出现问题时有任何支持,那将会很有帮助。 - Craig

5
我已经想出了一种技巧,可以在iOS中使用UIActivityViewController分享文本和图片。首先,我需要找到用户是否点击了UIActivityView中的Facebook图标,然后打开Facebook的共享对话框,并添加文本和图片。这是同时分享文本和图片的唯一方法。以下是我的代码。我希望这能为开发人员节省时间。由于Facebook已经更改了政策,现在很难分享预填充文本。
请在.h文件中添加UIActivityItemSource作为代理。
当用户单击共享按钮以显示UIActivityViewController时,将调用此方法。
NSString *textObject = [NSString stringWithFormat:@"%@, %@",shareString,timeDuration];
NSMutableArray *activityItems = [NSMutableArray arrayWithObjects:self, textObject, shareImage, nil];
activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
[self presentViewController:activityController animated:YES completion:nil];

当用户从中点击Facebook图标时。

pragma mark - UIActivityItemSource协议

- (id)activityViewController:(UIActivityViewController )activityViewController itemForActivityType:(NSString )activityType {
    
    if ([activityType isEqualToString:UIActivityTypePostToFacebook]) {
    
        [self dismissViewControllerAnimated:activityController completion:nil];
        [self performSelector:@selector(postToFacebook) withObject:self afterDelay:1.0];}
    return nil;
}

-(void)postToFacebook {
    
    [FBSDKSettings setAppID:@""];
    NSArray *imagesListingArray = [[item objectForKey:@"imgs"] valueForKey:@"img"];
    NSString * shareImage = [imagesListingArray objectAtIndex:0];
    
    FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
    content.contentTitle = @"F-Spot";
    content.contentDescription = [NSString stringWithFormat:@"%@  %@", [item valueForKey:@"event_name"],[item valueForKey:@"duration"]];
    content.imageURL = [NSURL URLWithString:shareImage];
    
    FBSDKShareDialog *shareDialog = [[FBSDKShareDialog alloc] init];
    shareDialog.mode = FBSDKShareDialogModeNative;
    if(shareDialog.canShow) {
        shareDialog.mode = FBSDKShareDialogModeFeedBrowser;
    }
    shareDialog.shareContent = content;
    shareDialog.delegate = self;
    [shareDialog show];

}

你能否举例说明一下postToFacebook函数应该如何工作,因为它充满了错误,如何使其正常工作呢... :(( - Mostafa Sultan
'contentTitle' 已被弃用:contentTitle 已从 Graph API 2.9 中弃用 contentDescription 已从 Graph API 2.9 中弃用 - Ana Paula

3

我发现这种情况发生在安装了Facebook应用程序的情况下。通过删除Facebook应用程序,UIActivityViewController可以正确显示预填充文本,并且图像预览也会有所不同。它会在图像底部显示站点URL。


2
在iOS9中,如果您从设备中删除了Facebook应用程序,则Facebook活动将不会显示为选项,也不会出现在“…”列表中。 - E.Freitas
1
我认为@E.Freitas的评论不正确。如果您通过iPhone的设置应用程序登录Facebook并且未安装Facebook应用程序,则在UIActivityViewController中仍然有Facebook共享选项。 - Chris

1

根据@Kashifs的解决方案,这是一个在Swift 4.2、Xcode 10和FacebookSDK 4.4中的版本。

  import FBSDKShareKit

extension YourViewController: UIActivityItemSource{

    //MARK: - ActionSheet

    func showShareSheet(){
        let shareStr = "Text you want to share"
        let activItems =  [self,shareStr, #imageLiteral(resourceName: "YourImageName")] as [Any]
        let shareSheet = UIActivityViewController(activityItems: activItems, applicationActivities: nil)
        self.shareSheet = shareSheet
        self.present(shareSheet, animated: true, completion: nil)
    }


    //MARK: - FacebookPost

    func postToFacebook() {
        let quote = "Text you want to share"
        if let URL = URL(string: "https://yourURL"){
            let content : LinkShareContent = LinkShareContent(url: URL, quote: quote)
            let dialog = ShareDialog(content: content)
            dialog.mode = .shareSheet
            dialog.presentingViewController = self
            do{
                try dialog.show()
            }catch{
                print("\(error)")
            }
        }
    }


    //MARK: - UIActivityItemSource Protocol

    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any?{
        if activityType == UIActivity.ActivityType.postToFacebook{
            self.shareSheet?.dismiss(animated: true, completion: {
                self.postToFacebook()
            })
        }
        return nil
    }

    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return ""
    }

}//endReferral/Invite-Share

0

-1
我通过向共享数组添加预览图像来欺骗UIActivityViewController使用文本。

对我来说也没有帮助 @mkll - nivritgupta
你能澄清一下“预览图像”的含义吗? - Warpling
在原问题的代码中,有一个名为shareArray的变量,其中包含一个NSString和一个NSURL。在我的情况下,提供一个UIImage(例如共享网站或商店物品的预览)也可以解决问题。 - r-dent
你能展示一下你是如何欺骗UIActivityViewController的吗? - handiansom

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