UIActivityViewController for Facebook 未显示默认文本



我正在使用UIActivityViewController,它提供了一些默认文本和一个链接。 对于所有社交媒体(短信,电子邮件,推特),都会显示默认文本和URL。 但是,在显示URL图像时,使用FB时,默认文本不显示(它只是空白)。 下面是代码:

    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];
        }
    }];

更新:正如下面其他人所说,FB不再允许预填充。 这是另一个视频链接,其中提供了允许和不允许的示例:https://developers.facebook.com/docs/apps/review/prefill

Facebook似乎不再希望开发人员用文本预先填充帖子。从 https://developers.facebook.com/docs/sharing/ios#ios-integration:

iOS 共享表的使用受 Facebook 平台政策的约束,包括第 2.3 节,其中规定应用不得预填。在共享表的上下文中,这意味着应用可能不会使用用户在使用应用时未输入的内容预填充共享表的 initialText 字段。

似乎他们更喜欢开发人员使用 SDK:

虽然您可以直接使用 iOS 本机视图控制器 API(共享表),但使用 Facebook SDK 提供的本机 iOS 共享对话框有几个原因。使用本机"共享"对话框提供了一种快速方法来测试用户是否已在其 iOS 6+ 设备上登录 Facebook。此 API 还使用与 Facebook SDK 其他部分相同的样式块。

我做了一个技巧来共享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图标时。

杂注标记 - UIActivityItemSource Protocol

- (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];
}

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

基于@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

此扩展程序解决了问题,请检查一下! https://github.com/alexruperez/ARFacebookShareKitActivity

从UIActivityViewController启动FBSDKShareKit,而不是默认的Facebook共享表。

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

最新更新