web-dev-qa-db-ja.com

Facebook共有コンテンツはiOS 9でURLのみを共有します

FBSDKShareLinkContentFBSDKShareDialogを共有すると、iOS 8では正常に動作しますが、iOS 9デバイスでimageURLcontentTitlecontentDescriptionを共有できません。

このアプリは、iOS 9 SDK、Xcode 7、Facebook SDK 4.7.0で構築されており、 iOS9用のアプリの準備 で説明されているすべてのアクションが完了しています。このアプリは現在App Storeでは利用できず、Facebookアプリは開発モードです。

ダイアログを表示するコードは非常に一般的です(Swift 2.0):

let content = FBSDKShareLinkContent()

content.contentURL = <URL to the app in the App Store>
content.imageURL = <valid image URL>
content.contentTitle = <some title>
content.contentDescription = <some descr>

let shareDialog = FBSDKShareDialog()
shareDialog.fromViewController = viewController
shareDialog.shareContent = content
shareDialog.delegate = self

if !shareDialog.canShow() {
    print("cannot show native share dialog")
}

shareDialog.show()

IOS 9では、Facebook SDKは画像、タイトル、説明のないネイティブダイアログを表示します: On iOS 9 Facebook SDK presents native dialog with no image, title and description

ダイアログが表示されたときに、FBアプリをiOS 9デバイスにインストールすると、エラーが発生しますが、Info.plistにそれぞれのURLを追加することで解決しても、問題は解決しません。もう表示されないのは単なるログステートメントです。

-canOpenURL: failed for URL: "fbapi20150629:/" - error: "This app is not allowed to query for scheme fbapi20150629"

これにより、空の投稿が生成されます。 empty post shared from iOS 9 device appearance from the web

ただし、iOS 8では、FBアプリがインストールされていない場合、FBアプリORがアプリ内Safari vcを開きます。

比較のために、iOS 8デバイスでも同じコードが機能します。

iOS 8 share post appearance

UPDATE:

@ rednuhtの答え は最初の問題を解決しますが、 @ sophie-faderが指摘したAppStore URL固有のケース

38
Yevhen Dubinin

私は同じ問題を抱えていましたが、使用している回避策は、ネイティブアプリを使用するようにダイアログの共有モードを設定することです。

私はObj-Cを使用していますが、Swiftでもほとんど同じであるはずです:

FBSDKShareDialog *dialog = [[FBSDKShareDialog alloc] init];
dialog.fromViewController = viewController;
dialog.shareContent = content;
dialog.mode = FBSDKShareDialogModeNative; // if you don't set this before canShow call, canShow would always return YES
if (![dialog canShow]) {
    // fallback presentation when there is no FB app
    dialog.mode = FBSDKShareDialogModeFeedBrowser;
}
[dialog show];

IOS 9では、ユーザーはアプリ切り替えダイアログを取得しますが、正常に機能します。アプリ切り替えダイアログを持たないFBSDKShareDialogModeWebもありますが、画像も表示しません。

デフォルトはFBSDKShareDialogModeAutomaticであり、FBSDKShareDialogModeShareSheetを選択します。これが表示されています。

[〜#〜] update [〜#〜]:これは、利用可能なダイアログモードに対するiOS9の動作です。

  • FBSDKShareDialogModeAutomatic:OPケースであるShareSheetを使用します
  • FBSDKShareDialogModeShareSheet:同上
  • FBSDKShareDialogModeNative:ユーザーがFBアプリをインストールしている場合は動作し、それ以外の場合はサイレントに失敗します。アプリ切り替えダイアログを表示します。
  • FBSDKShareDialogModeBrowser:画像なしの共有
  • FBSDKShareDialogModeWeb:画像なしの共有
  • FBSDKShareDialogModeFeedBrowser意図したとおりに動作します
  • FBSDKShareDialogModeFeedWeb意図したとおりに動作します

「ブラウザ」はSafariをフルスクリーンで開き、「Web」はWebViewダイアログを開きます。

IOS9の最後の2つのオプションとiOS8の自動のどちらかを選択します。

58
rednuht

この問題の解決策は、ネイティブアプリを使用するように共有ダイアログモードを設定することです。 iOS9では、Swift 2.0

最初の質問:Facebook Shareコンテンツは、iTunes以外のURLをコンテンツの説明と共有できます。 iTunesのURLが共有されている場合、説明は共有されません。

次に、同じ問題が発生していました。FB共有ボタンをクリックするとブラウザーにリダイレクトされ、使用している回避策は、ネイティブアプリを使用するように共有ダイアログモードを設定することです。

これは、共有しているURLがiTunes App StoreのURLである場合に一貫して発生します。 URLを他のWebサイトに変更すると、問題は解決しました。 https://developers.facebook.com/docs/sharing/ios "

注:アプリがiTunesまたはGoogle Playストアへのリンクを共有している場合、共有で指定した画像や説明を投稿しません。代わりに、Webcrawlerを使用してアプリストアから直接取得したアプリ情報を投稿します。これには画像が含まれない場合があります。 iTunesまたはGoogle Playへのリンク共有をプレビューするには、URLデバッガーにURLを入力してください。」

  func shareFB(sender: AnyObject){

    let content : FBSDKShareLinkContent = FBSDKShareLinkContent()

    content.contentURL = NSURL(string: "//URL other then iTunes/AppStore")
    content.contentTitle = “MyApp”
    content.contentDescription = “//Desc“

    content.imageURL = NSURL(string:“//Image URL”)


    let dialog : FBSDKShareDialog = FBSDKShareDialog()
    dialog.mode = FBSDKShareDialogMode.Native
  // if you don't set this before canShow call, canShow would always return YES
    if !dialog.canShow() {
        // fallback presentation when there is no FB app
      dialog.mode = FBSDKShareDialogModeFeedBrowser
     }
    dialog.show()
 }
10
ViJay Avhad

エラーメッセージ-canOpenURL: failed for URL: "fbapi20150629:/" - error: "This app is not allowed to query for scheme fbapi20150629"を取り除くには、プロジェクトのinfo.plistの<key>LSApplicationQueriesSchemes</key>配列に次の行を追加します。

<string>fbapi20150629</string>

7
dzhuowen

あなたがウェブマスターであるウェブサイトを共有している場合、最も良いことは、contentURLを共有することです。次に、こちらの情報に従って、Open GraphマークアップをHTMLファイルに追加します。 https://developers.facebook.com/docs/sharing/webmasters

FacebookはWebページから情報を取得し、そこからすべてのフィールドにデータを入力します。値が正しいことを確認するには、デバッガーを実行します。

https://developers.facebook.com/tools/debug/

そのページで、実際にスクレイプを再度強制することができます。これはキャッシュされます。

2
jsonfellin

Facebookのタイトル、説明、画像を含むアプリ内の共有ダイアログ:

  1. iOS:

dialog.mode = FBSDKShareDialogMode.ShareSheet //未試行

or
//Working for me:


let linkcontent: FBSDKShareLinkContent = FBSDKShareLinkContent()
        linkcontent.contentURL = videoURL
 //       linkcontent.contentDescription = videoDesc
 //       linkcontent.contentTitle = videoTitle
 //       linkcontent.imageURL = imageURL
        FBSDKShareDialog.showFromViewController(self, withContent: linkcontent, delegate: self)
  1. Webからの実装:共有リンクのタイトル、説明、および画像は、Facebookによって自動的に提供されるURLの応答である必要があります。例:

meta http-equiv = "content-type" content = "text/html; charset = utf-8"> title>マイシュレッドURLタイトルmeta content = '"+ imageUrl +"' property = 'og:image' />

2
Yogesh Lolusare

以下のコードは、あらゆる種類の状況で私にとって魅力的なものでした:

@IBAction func facebookTap() {
    let content = FBSDKShareLinkContent()
    content.contentTitle = imageTitle
    content.contentURL =  URL(string: "http://technokriti.com/")
    content.imageURL = URL(string: self.imageURL)
    content.contentDescription = imageDescription

    let dialog : FBSDKShareDialog = FBSDKShareDialog()
    dialog.fromViewController = self
    dialog.shareContent = content
    dialog.mode = FBSDKShareDialogMode.feedWeb
    dialog.show()
}
2
Pradeep Mittal

FBSDKShareLinkContent contentURLを空白にすると、Facebookのタイトルが共有されます。

例えば:

content.contentURL = [[NSURL alloc] initWithString:@"http://"];
0
tania_S
This works for me:-

FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
content.contentURL = [NSURL URLWithString:APP_STORE_LINK];
content.imageURL=[NSURL URLWithString:IMAGE_LINK];

FBSDKShareDialog *dialog = [[FBSDKShareDialog alloc] init];
dialog.shareContent = content;
dialog.fromViewController = self;
dialog.mode = FBSDKShareDialogModeFeedBrowser;
[dialog show];
0
Praveen Sevta