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.
Здравствуйте, я просто следую по ссылке @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