web-dev-qa-db-ja.com

FacebookのUIActivityViewControllerにデフォルトのテキストが表示されない

デフォルトのテキストとリンクを提供するUIActivityViewControllerを使用しています。すべてのソーシャルメディア(SMS、メール、Twitter)で、デフォルトのテキストと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

43
C6Silver

Facebookは、開発者が投稿にテキストを事前に入力することをもはや望んでいないようだ。 https://developers.facebook.com/docs/sharing/ios#ios-integration から:

IOS共有シートの使用は、Facebookプラットフォームポリシーの対象となります。これには、アプリが事前入力できない場合があることを示すセクション2.3が含まれます。共有シートのコンテキストでは、これは、アプリが共有シートのinitialTextフィールドに、アプリを使用する以前に人々によって入力されなかったコンテンツが事前に入力されないことを意味します。

開発者がSDKを使用することを好むようです:

IOSネイティブView Controller API(共有シート)を直接使用できますが、Facebook SDKが提供するネイティブiOS共有ダイアログを使用する理由はいくつかあります。ネイティブの共有ダイアログを使用すると、iOS 6以降のデバイスでFacebookにサインインしたことを簡単にテストできます。このAPIは、Facebook SDKの他の部分と同じスタイルブロックも使用します。

46

IOSでUIActivityViewControllerのテキストと画像を共有するための1つのトリックを実行しました。まず、ユーザーが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プロトコル

- (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

Facebookアプリをインストールしているときに起こることがわかりました。 Facebookアプリを削除すると、UIActivityViewControllerは事前に入力されたテキストを正しく表示し、画像のプレビューも異なります。画像の下部にサイトのURLが表示されます。

3
odm

@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
Yedy

この拡張機能は問題を修正します、チェックしてください! https://github.com/alexruperez/ARFacebookShareKitActivity

デフォルトのFacebook共有シートではなく、UIActivityViewControllerからFBSDKShareKitを起動します。

0
alexruperez