【问题标题】:UIActivityViewController for Facebook not Showing Default TextFacebook 的 UIActivityViewController 不显示默认文本
【发布时间】:2015-04-24 17:52:49
【问题描述】:

我正在使用提供一些默认文本和链接的 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

【问题讨论】:

  • 我在 iOS 8.2 中也发现了这个问题。
  • 我在 iOS 8.3 上也看到了这个问题,你有问题编号 @DanielStorm 吗?
  • 只是为了确认 FB 应用程序在这个问题上发挥了重要作用。我没有看到安装以前的 FB 应用程序但最新的问题。所以正如@DanielStorm 所说,也许等待新更新的 FB 应用程序。
  • 这与使用android多年的策略相同。不预填文本,如果你想与 facebook 分享,请放置一个 facebook 分享按钮,而不是默认分享
  • @Daniel Storm 这不是错误 - 这是最新 Facebook 应用程序版本的功能。一段时间以来,Facebook 政策不允许文本预填充。它不会被“修复”,所以没有必要等待。

标签: objective-c xcode facebook uiactivityviewcontroller


【解决方案1】:

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 的其他部分相同的样式块。

【讨论】:

  • 和使用android多年的策略一样
  • 如果 Facebook API 能够正常运行,并且如果它们没有任何支持,那将会有所帮助。
【解决方案2】:

我已经做了一个技巧来在 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 功能应该如何工作,因为它充满了错误,请如何使其工作...... :((
  • 'contentTitle' 已弃用:contentTitle 已从 Graph API 2.9 中弃用 contentDescription 已从 Graph API 2.9 中弃用
【解决方案3】:

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

【讨论】:

  • 在 iOS9 中,Facebook 活动不会显示为选项,一旦您从设备中删除 Facebook 应用程序,它也不会出现在“...”列表中。
  • 我没有发现@E.Freitas 的评论是真的。如果你是通过 iPhone 的 Settings App 登录 Facebook 并且没有安装 Facebook App,那么 UIActivityViewController 中还有一个 Facebook 分享选项
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    这个扩展解决了这个问题,看看吧! https://github.com/alexruperez/ARFacebookShareKitActivity

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 对我也没有帮助@mkll
      • 你能解释一下“预览图像”是什么意思吗?
      • 在原问题的代码中,有一个shareArray变量包含一个NSString和一个NSURL。就我而言,还提供UIImage(例如共享网站或商店商品的预览)就可以了。
      • 你能告诉我你是如何欺骗 UIAcitvityViewController 的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多