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
}
Ответы
Ответ 1
Как сказал Fede и kennbrodhagen, это выглядит как самый простой способ (пока Facebook не зафиксирует эту ошибку):
- (void) dialogCompleteWithUrl:(NSURL*) url
{
if ([url.absoluteString rangeOfString:@"post_id="].location != NSNotFound) {
//alert user of successful post
} else {
//user pressed "cancel"
}
}
Ответ 2
Я понимаю, что
- (void)dialogDidNotComplete:(FBDialog *)dialog;
будет вызываться для пропуска.
Я не тестировал эту теорию.
Изменить:
Я тестировал это сейчас, и моя теория ошибочна. Код выглядит так, что диалог должен вызывать
- (void)dialogDidNotCompleteWithUrl:(NSURL *)url
у вашего делегата, но, похоже, это не так, поскольку веб-страница возвращает fbconnect://успех для нажатия кнопки "пропустить". Это звучит как ошибка для меня.
Ответ 3
Я сделал несколько экспериментов, и кажется, что когда сообщение отправлено, вы получите два обратных вызова: dialogCompleteWithUrl, а затем dialogDidComplete. Когда сообщение будет пропущено, вы получите только обратный вызов dialogDidComplete.
Вы можете активировать оповещение о своем успехе в обратном вызове dialogCompleteWithUrl. Если вы хотите подождать до тех пор, пока не получите обратный вызов dialogDidComplete, вы можете сохранить некоторое состояние во время обратного вызова dialogCompleteWithUrl, а затем на основе этого состояния запустите свое предупреждение в диалоговом окнеDIDComplete.
Во время моего теста url, который я получил во время диалогаCompleteWithUrl, имел форму "fbconnect://success/? post_id = 1627754863_182914058401072"
Поэтому, если вам нужно, вы даже можете заглянуть в это значение, чтобы еще раз подтвердить свой успех, хотя я ожидаю, что если сообщение действительно потерпит неудачу (в отличие от пропусков), вы получите один из откатных вызовов.
Ответ 4
Недавно я обнаружил следующее решение этой проблемы.
См. ответ braceta.
https://github.com/ideashower/ShareKit/issues#issue/8
Ответ 5
Привет, я просто следую ссылке @Oh Danny Boy
и я нашел это решение
из этой темы: http://forum.developers.facebook.net/viewtopic.php?pid=303257#p303257
Исправлено это, добавив следующее в 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 Change html, тогда этот код больше не будет работать.
Мое решение этой проблемы заключается в следующем:
Вместо того, чтобы ставить JavaScript, статически просто получить его с сервера с регулярным интервалом или механизмом симулятора
[_webView stringByEvaluatingJavaScriptFromString://We need to control this javascript from server//];
поэтому в будущем мы можем изменить этот javascript вместо обновления всего приложения.
Я надеюсь, что в будущем эта ошибка будет решена http://bugs.developers.facebook.net/show_bug.cgi?id=5958