Facebook Connect для iOS: dialogDidComplete дифференциация ответа

Мне было интересно, как провести различие между пользователем, который нажимает "Отправить" или пропускает встроенный пост-поток FBDialog. Кто-нибудь знает, что проверить?

Я использую последнюю версию iOS Facebook Connect в среде iOS 4.2.

/**
 * Called when a UIServer Dialog successfully return.
 */
- (void)dialogDidComplete:(FBDialog *)dialog {
    if user tapped submit and post was successful
        alert user of successful post

    if user tapped "skip" (cancel equivalent)
        do not display alert
}

4 ответа

Решение

Как сказали Феде и Кеннбродхаген, это выглядит самым простым способом (пока Facebook не исправит эту ошибку):


- (void) dialogCompleteWithUrl:(NSURL*) url
{
    if ([url.absoluteString rangeOfString:@"post_id="].location != NSNotFound) {
        //alert user of successful post
    } else {
        //user pressed "cancel"
    }
}

Я понимаю, что

- (void)dialogDidNotComplete:(FBDialog *)dialog;

будет вызван для пропуска.

Я не проверял эту теорию, хотя.

Изменить: я проверил это сейчас, и моя теория неверна. Код выглядит так, как будто диалог должен вызвать

- (void)dialogDidNotCompleteWithUrl:(NSURL *)url

в вашем делегате, но, по-видимому, он этого не делает, поскольку веб-страница возвращает fbconnect://success для нажатия кнопки "пропустить". Это звучит как ошибка для меня.

Я провел некоторые эксперименты, и кажется, что когда сообщение отправлено, вы получите два обратных вызова: dialogCompleteWithUrl и затем dialogDidComplete. Когда сообщение пропущено, вы получите только обратный вызов dialogDidComplete.

Вы можете активировать оповещение об успешном завершении в обратном вызове dialogCompleteWithUrl. Если вы хотите подождать, пока не получите обратный вызов dialogDidComplete, вы можете сохранить некоторое состояние во время обратного вызова dialogCompleteWithUrl, а затем, основываясь на этом состоянии, запустить оповещение в dialogDidComplete.

Во время моего теста URL, который я получил во время dialogCompleteWithUrl, был в форме "fbconnect://success/? Post_id=1627754863_182914058401072"

Поэтому, если потребуется, вы можете даже посмотреть на это значение, чтобы еще раз подтвердить свой успех, хотя я ожидаю, что если публикация действительно потерпела неудачу (в отличие от пропуска), вы получите вместо этого один из обратных вызовов.

Недавно я обнаружил следующее решение этой проблемы.

Пожалуйста, посмотрите ответ Braceta.

https://github.com/ideashower/ShareKit/issues

Здравствуйте, я просто следую по ссылке @Oh Danny Boy, и я нашел это решение

из этой темы: http://forum.developers.facebook.net/viewtopic.php?pid=303257 Исправлено это путем добавления следующего в webViewDidFinishLoad: в FBDialog.m

[_webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByName('cancel')[0].onclick = function onclick(event) { window.location.href = 'fbconnect://cancel'; return false;}"];

Это заставляет кнопку отмены правильно вызывать "fbconnect://cancel" вместо "fbconnect://success".

- (void)webViewDidFinishLoad:(UIWebView *)webView {
  [_webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByName('cancel')[0].onclick = function onclick(event) { window.location.href = 'fbconnect://cancel'; return false;}"];

  [_spinner stopAnimating];
  _spinner.hidden = YES;

  self.title = [_webView stringByEvaluatingJavaScriptFromString:@"document.title"];
  [self updateWebOrientation];
}

Работает нормально:

Но есть еще одна проблема, если Facebook Изменить HTML, то этот код больше не будет работать. Мое решение этой проблемы заключается в следующем:

Вместо статического JavaScript-кода просто получите его с сервера через равные промежутки времени или с помощью механизма сравнения

[_webView stringByEvaluatingJavaScriptFromString://We need to control this javascript from server//];

поэтому в будущем мы можем изменить этот JavaScript вместо обновления всего приложения.

Я надеюсь, что в будущем эта ошибка будет решена http://bugs.developers.facebook.net/show_bug.cgi?id=5958

Другие вопросы по тегам