2013-04-19 1 views
4

Я следую проекту HelloFacebookSample в комплекте с SDK для Windows 3.5. Я фактически скопировал и вложил все в свое приложение, даже материал из AppDelegate, но почему-то нажатие кнопки «Вход» замерзает мое приложение. Только для записи все аутентифицируется правильно при подключении к интегрированной инфраструктуре в iOS 6, что в любом случае выполняется через FB SDK. Только когда я пытаюсь войти в систему через Интернет, то есть ударить по сайту FBLoginView, получить аутентификацию, вернуться в приложение. Вот код в проекте samepl, и я буду сравнивать его с моим:Facebook SDK FBLoginView получение EXC_BAD_ACCESS

FBLoginView *loginview = [[FBLoginView alloc] init]; 

loginview.frame = CGRectOffset(loginview.frame, 5, 5); 
loginview.delegate = self; 

[self.view addSubview:loginview]; 

[loginview sizeToFit]; 

Шахта немного отличается:

loginview = [[FBLoginView alloc] init]; 
loginview.delegate = self; 

[self.facebookCell addSubview:loginview]; 

[loginview sizeToFit]; 

Что касается методов делегата, я реализовал их все дословно. Почему приложение падает? Не существует веских причин для сбоя, когда весь код в значительной степени идентичен между моим приложением и образцом приложения. Отладчик не очень помогает даже с объектами Zombie. Фактическая ошибка: Thread 1: EXC_BAD_ACCESS (code=2, address=somethingoranother) У кого-нибудь есть идеи, почему это происходит?

С уважением,
Майк

UPDATE: Похоже, что авария происходит потому, что что-то повторяющееся бесконечно на петле. Похоже, что более 100 000 процессов были включены в основной поток с помощью FB SDK! Как?!

UPDATE 2: Я начинаю думать, что ошибка здесь, хотя я скопировал это прямо из образца AppDelegate.

- (BOOL)application:(UIApplication *)application 
     openURL:(NSURL *)url 
sourceApplication:(NSString *)sourceApplication 
    annotation:(id)annotation { 
// attempt to extract a token from the url 
return [FBAppCall handleOpenURL:url 
       sourceApplication:sourceApplication 
       fallbackHandler:^(FBAppCall *call) { 
        NSLog(@"In fallback handler"); 
       }]; 
} 

Помогает ли это вообще?

ответ

2

У меня есть то, что кажется точной проблемой, но у меня есть режим работы песочницы, который уже отключен. Это приложение работает отлично, но я только что обновил SDK, и теперь это происходит.

Если у меня есть учетная запись на facebook, настроенная в iOs, она будет работать нормально, но если нет, она сработает. Одна вещь, о которой стоит упомянуть, - это удалить схему URL-адресов, чтобы приложение не могло попасть в веб-браузер или приложение для facebook. Он будет использовать веб-представление для входа в систему, и это тоже работает

EDIT: как я могу сказать, моя проблема связана с отсутствием доступа к моим настройкам приложения в facebook. facebook SDK делает [FBUtility fetchAppSettings: обратный вызов:] вызов, более конкретно, это делает

https://graph.facebook.com/267496536695242?fields=supports_attribution,supports_implicit_sdk_logging,suppress_native_ios_gdp,name, 

, который в случае моего приложения терпит неудачу с:

{ 
    "error": { 
     "message": "Unsupported get request.", 
     "type": "GraphMethodException", 
     "code": 100 
    } 
} 

В СРАВНЕНИЕ, любой из Приведены примеры приложений, например, это один SessionLoginSample

https://graph.facebook.com/380615018626574?fields=supports_attribution,supports_implicit_sdk_logging,suppress_native_ios_gdp,name 

возвращает правильно это:

{ 
    "supports_attribution": true, 
    "supports_implicit_sdk_logging": true, 
    "suppress_native_ios_gdp": 0, 
    "name": "SessionLoginSample", 
    "id": "380615018626574" 
} 

Поскольку SDK ожидает чего-то, он продолжает делать тот же запрос и застревает в цикле, пока симулятор не сработает.

Чтобы подтвердить это, я вручную ввел ожидаемые параметры в обратном вызове, modifyng на facebook sdk, и теперь все работает отлично.

Следует отметить, что я обновил SDK от версии 2.0, которая была устаревшей, и на странице настроек было устарело несколько параметров (не установлен токен клиента, авторизация как native/Desktop вместо Web), не имея приложения в тайне ключ в приложении), но я уже установил их в порядке.

EDIT 2: Это метод из Facebook SDK (в FBUtility.m), который я изменил. Я добавил только «плохие вещи», если оговорка.

+ (void)fetchAppSettings:(NSString *)appID 
      callback:(void (^)(FBFetchedAppSettings *, NSError *))callback { 

if (!g_fetchedAppSettingsError && !g_fetchedAppSettings) { 

    NSString *pingPath = [NSString stringWithFormat:@"%@?fields=supports_attribution,supports_implicit_sdk_logging,suppress_native_ios_gdp,name", appID, nil]; 
    FBRequest *pingRequest = [[[FBRequest alloc] initWithSession:nil graphPath:pingPath] autorelease]; 
    if ([pingRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 

     // Bad stuff 
     if (error) { 
      error = nil; 
      result = [NSDictionary dictionaryWithObjectsAndKeys:@"true", @"supports_attribution", 
                   @"true", @"supports_implicit_sdk_logging", 
                   @"0", @"suppress_native_ios_gdp", 
                   @"Your_App_Display_Name", @"name", nil]; 
     } 

     if (error) { 
      g_fetchedAppSettingsError = error; 
      [g_fetchedAppSettingsError retain]; 
     } else { 

      g_fetchedAppSettings = [[[FBFetchedAppSettings alloc] init] retain]; 

      if ([result respondsToSelector:@selector(objectForKey:)]) { 

       g_fetchedAppSettings.serverAppName = [result objectForKey:@"name"]; 
       g_fetchedAppSettings.supportsAttribution = [[result objectForKey:@"supports_attribution"] boolValue]; 
       g_fetchedAppSettings.supportsImplicitSdkLogging = [[result objectForKey:@"supports_implicit_sdk_logging"] boolValue]; 
       g_fetchedAppSettings.suppressNativeGdp = [[result objectForKey:@"suppress_native_ios_gdp"] boolValue]; 
      } 
     } 
     [FBUtility callTheFetchAppSettingsCallback:callback]; 
    } 
     ] 
     ); 
} else { 
    [FBUtility callTheFetchAppSettingsCallback:callback]; 
} 

}

+0

Интересно, где находится схема URL, о которой вы говорите? Будет интересно посмотреть, как это разрешено в веб-представлении. Я предполагаю, что вы потеряете разрешение на использование Facebook. – Mackey18

+0

Что касается вашей проблемы. Попробуйте сравнить код с HelloFacebookSample, а затем отчитаться. – Mackey18

+2

Привет, нет ничего плохого в моем коде. После отладки MUCH я пришел к выводу, что проблема связана с отсутствием доступа к моему приложению. Я отредактирую свой пост, предоставив всю информацию, которую я нашел. – asendra

1

Кто-то нашел ответ в другой теме. В Центре разработчиков Facebook приложение было настроено на режим Sandboxing, что и вызвало эту ошибку. Кажется, это не проблема с кодом в конце концов.

1

Facebook зафиксировал ошибку сервера, который был причиной этого для многих разработчиков. Тем не менее, исправление сервера только делает проблему с бесконечным циклом менее вероятной. Он все еще там. Я создал новую ошибку для отслеживания проблемы бесконечного цикла.

https://developers.facebook.com/bugs/446010282155033

1

Это ошибка доступа к памяти, потому что LoginView находится в __block пространстве.

Просто переместите свой контроллер (делегат loginView) в этой зоне, и он должен работать.

FBLoginView *loginview = [[FBLoginView alloc] init]; 
static id staticDelegateInstance = self; 

loginview.frame = CGRectOffset(loginview.frame, 5, 5); 
loginview.delegate = staticDelegateInstance; 

[self.view addSubview:loginview]; 

[loginview sizeToFit]; 
+0

Не могли бы вы подробнее рассказать об этом решении? Не ясно. – Houman

+0

Привет @Hooman, я просканировал код в facebook, я увидел, что loginview объявлен в пространстве памяти __block. Это соответствует распределению статической памяти. Объявление статичного делегата Loginview позволяет избежать ошибки доступа к памяти. Это было два месяца назад, поэтому мне нужно будет снова осмотреть мой код, если вы хотите получить более подробную информацию. По крайней мере, это отлично сработало для меня. – Moose

+0

, который сделал трюк для меня! благодаря –

 Смежные вопросы

  • Нет связанных вопросов^_^