Facebook share content содержит только URL-адрес в iOS 9
Share FBSDKShareLinkContent
с FBSDKShareDialog
отлично работает в iOS 8, но не имеет возможности использовать imageURL
, contentTitle
, contentDescription
на устройствах iOS 9.
Приложение построено с помощью iOS 9 SDK, Xcode 7, Facebook SDK 4.7.0, все действия, упомянутые в Подготовка ваших приложений для iOS9 сделано. Приложение в настоящее время недоступно в App Store, а приложение Facebook находится в режиме dev.
Код для представления диалога довольно распространен (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 представлен собственный диалог без изображения, названия и описания:
![В iOS 9 Facebook SDK представлен собственный диалог без изображения, названия и описания]()
В то время, когда представлен диалог, когда приложение FB установлено на устройстве iOS 9, появляется ошибка, которая при разрешении путем добавления соответствующего URL-адреса в Info.plist не устраняет проблему. Это просто оператор журнала, который больше не отображается.
-canOpenURL: failed for URL: "fbapi20150629:/" - error: "This app is not allowed to query for scheme fbapi20150629"
В результате получается пустое сообщение:
![пустое сообщение, совместно используемое из внешнего вида устройства iOS 9 из Интернета]()
В iOS 8, однако, диалог представлен через приложение FB или открывается в приложении Safari vc, когда приложение FB не установлено.
Для сравнения, тот же код работает с устройствами iOS 8:
![iOS 8 share post appearance]()
UPDATE:
В то время как @rednuht ответ ниже, решает исходную проблему, стоит отметить AppStore URL-специфический случай, на который указывает @Sophie-фейдер
Ответы
Ответ 1
У меня была такая же проблема, и обходной путь, который я использую, заключается в том, чтобы установить режим "Общий диалог" для использования собственного приложения.
Я использую 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
: использует ShareSheet, который является случаем OP
-
FBSDKShareDialogModeShareSheet
: ditto
-
FBSDKShareDialogModeNative
: работает, если у пользователя установлено приложение FB, в противном случае он не работает. Представляет диалоговое окно приложения-переключателя.
-
FBSDKShareDialogModeBrowser
: акции без изображения
-
FBSDKShareDialogModeWeb
: акции без изображения
-
FBSDKShareDialogModeFeedBrowser
: работает по назначению
-
FBSDKShareDialogModeFeedWeb
: работает по назначению
"Браузер" открывает полноэкранный режим Safari, "Веб" открывает диалог веб-просмотра.
Я бы воспользовался одним из двух последних вариантов для iOS9 и Automatic для iOS8.
Ответ 2
Решение проблемы заключается в том, чтобы установить режим общего доступа для использования собственного приложения. В iOS9, swift 2.0
Для первого вопроса: Facebook Share content может распространять URL-адрес, отличный от iTunes, с описанием содержимого. Если URL-адрес iTunes является общим, он не разделяет наше описание.
Далее: у меня была такая же проблема, нажатие кнопки FB Share переадресовывает меня в браузер, и обходной путь, который я использую, заключается в том, чтобы установить режим общего доступа для использования собственного приложения.
Это происходит последовательно, если URL, который вы используете, является URL-адресом магазина iTunes. Изменение URL-адреса на другом веб-сайте решило проблему. 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()
}
Ответ 3
чтобы избавиться от сообщения об ошибке:
-canOpenURL: failed for URL: "fbapi20150629:/" - error: "This app is not allowed to query for scheme fbapi20150629"
, вы можете добавить следующую строку в массив <key>LSApplicationQueriesSchemes</key>
в info.plist вашего проекта:
<string>fbapi20150629</string>
Ответ 4
Если вы делитесь веб-сайтом, на котором вы являетесь веб-мастером, самое лучшее, что можно сделать, это просто поделиться с ним contentURL
. Затем следуйте указаниям здесь, чтобы добавить разметку Open Graph в ваш HTML файл: https://developers.facebook.com/docs/sharing/webmasters
Facebook очистит информацию с веб-страницы и заполнит все поля оттуда. Чтобы убедиться, что значения выглядят правильно, запустите отладчик:
https://developers.facebook.com/tools/debug/
На этой странице вы можете снова принудительно выполнить очистку, которая будет кэшироваться.
Ответ 5
Следующий код работал как шарм для меня во всех типах ситуаций:
@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()
}
Ответ 6
В диалоговом окне Facebook в вашем приложении с заголовком, описанием и изображением:
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)
- Реализация из Интернета: название, описание и изображение общей ссылки должны быть ответом URL-адреса, который автоматически создается Facebook.
Пример:
meta http-equiv = "content-type" content = "text/html; charset = utf-8" > название > MY SHRED URL TITLE
meta content = ' "+ imageUrl +" ' свойство = 'og: image'/" >
Ответ 7
Заголовок Facebook станет общим, если мы сделаем FBSDKShareLinkContent
contentURL пустым.
Как например:
content.contentURL = [[NSURL alloc] initWithString:@"http://"];
Ответ 8
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];