web-dev-qa-db-fra.com

UIActivityViewController pour Facebook n'indiquant pas le texte par défaut

J'utilise un UIActivityViewController qui fournit du texte par défaut et un lien. Avec tous les médias sociaux (SMS, email, Twitter), le texte et l'URL par défaut sont affichés. Cependant, avec FB alors que l'image URL est affichée, le texte par défaut ne s'affiche pas (il est simplement vide). Ci-dessous le code:

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

Mise à jour: Comme indiqué dans ce que d'autres ont dit ci-dessous, FB n'autorise plus le remplissage préalable. Voici un autre lien vers une vidéo qui donne des exemples de ce qui est permis et de ce qui ne l'est pas: https://developers.facebook.com/docs/apps/review/prefill

43
C6Silver

Il semblerait que Facebook ne souhaite plus que les développeurs pré-remplissent les messages avec du texte. De https://developers.facebook.com/docs/sharing/ios#ios-integration :

L'utilisation de la feuille de partage iOS est soumise à la politique de la plate-forme Facebook, y compris à la section 2.3 qui stipule que les applications ne peuvent pas être pré-remplies. Dans le contexte de la feuille de partage, cela signifie que les applications ne peuvent pas pré-remplir le champ texte initial de la feuille de partage avec du contenu qui n'a pas été entré par des personnes précédemment lors de leur utilisation de l'application.

Il semblerait qu'ils préfèrent que les développeurs utilisent le SDK:

Bien que vous puissiez utiliser directement l'API (feuille de partage) du contrôleur de vue natif iOS, il existe plusieurs raisons d'utiliser la boîte de dialogue de partage iOS natif fournie par le SDK de Facebook. La boîte de dialogue Partager native vous permet de vérifier rapidement que des personnes se sont connectées à Facebook sur leurs appareils iOS 6+. Cette API utilise également le même bloc de style que d'autres parties du SDK de Facebook.

45

J'ai fait un tour pour partager du texte et une image de UIActivityViewController dans iOS. Je dois d’abord déterminer si les utilisateurs ont cliqué sur l’icône facebook à partir de UIActivityView, puis ouvrir la boîte de dialogue de partage de facebook avec texte et image. C’est le seul moyen de partager du texte et des images. Ci-dessous mon code. J'espère que cela permettra de gagner du temps pour les développeurs. Depuis que Facebook a modifié ses politiques, il est très difficile de partager un texte prérempli. 

Veuillez ajouter UIActivityItemSource au fichier .h en tant que délégué

Ceci sera appelé lorsque l'utilisateur cliquera sur le bouton de partage pour afficher 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];

Et quand l'utilisateur clique sur l'icône facebook à partir de celui-ci.

marque pragma - Protocole 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];

}
5
Kashif

J'ai constaté que cela se produit lorsque l'application Facebook est installée. En supprimant l'application Facebook, la UIActivityViewController affiche correctement le texte prérempli et l'aperçu de l'image est également différent. Il montre l'URL du site au bas de l'image.

3
odm

Basé sur la solution @Kashifs. Voici une version dans Swift 4.2, Xcode 10 et 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
Yedy

Cette extension corrige le problème, vérifiez-le! https://github.com/alexruperez/ARFacebookShareKitActivity

Lancez FBSDKShareKit à partir de UIActivityViewController au lieu de la feuille de partage Facebook par défaut.

0
alexruperez