Я довольно долго не мог понять, чем вызвана “не адекватная” реакция фейсбука на мои запросы к нему из приложения для iPhone. Я получал сплошные SessionInvalidated. Самое интересное заключалось в том, что старых версиях приложения все работало нормально. И, если старая версия уже смогла поднять сессию, то обновленная тоже начинала её спокойно “подхватывать”. Я начал искать проблему в отличиях кода двух версий. Но он был одинаковым! Совершенно! Но одна версия приложения работала нормально, другая – нет. Не смешно мне стало, когда и ранее рабочая версия… получила SessionInvalodated!
Поэтому я начал капать глубже и внимательнее. Выяснилось, что у моего делегата никогда не вызывается fbDidLogin. У меня появилось подозрение, что это и есть причина всех проблем. Скажу сразу, что это оказалось весьма недалеко от истины. Как выяснилось, didLogin не вызывался по причине того, что авторизация проходила в вызываемом браузере Сафари, а не внутри приложения. И для того, чтобы производить её не прибегая к внешним программам, нужно немного изменить официальное SDK.
Нужно найти в нем строку:
1 |
[self authorizeWithFBAppAuth:YES safariAuth:YES]; |
И заменить ее на:
1 |
[self authorizeWithFBAppAuth:NO safariAuth:NO]; |
В этом случае при авторизации будет появляться всплывающее окно с UIWebView, а после неё – вызываться fbDidLoad.
Одна проблема была решена.
Остальные я решил другим, возможно не очень красивым способом: производя принудительно каждый раз авторизацию путем вызова
1 2 3 4 5 6 7 8 |
NSArray *permissions = [[NSArray alloc] initWithObjects: @"user_likes", @"read_stream", @"user_photos", @"publish_stream", nil]; [facebook authorize:permissions]; [permissions release]; |
Такой способ не вынуждает пользователя каждый раз вводить данные для авторизации и позволяет уменьшить вероятность получения SessionInvalidated, хотя и отнимает на несколько секунд больше времени.
Полезная статья? Их будет больше, если вы поддержите меня!