Удаление учетной записи Twitter из настроек приводит к сбою приложения с использованием платформы twitter iOS5

#iphone #objective-c #ios5

#iPhone #objective-c #ios5

Вопрос:

Я использую платформу Twitter iOS 5 и сохраняю объект ACAccount. Если пользователь заходит и удаляет конкретную учетную запись из настроек, приложение (очевидно) выходит из строя. Мой текущий обходной путь сохраняет только имя пользователя и повторно извлекает массив учетных записей Twitter и сопоставляет имена пользователей, чтобы получить правильную учетную запись. Есть ли какая-нибудь лучшая работа. Я знаю, что есть уведомление от ACAccountStore

ACAccountStoreDidChangeNotification

но я его не получаю.

Приведенный ниже код является исправленной версией. Здесь я сравниваю предыдущее имя пользователя учетной записи. Если я удалю это и использую AccountObject, выбранный пользователем ранее, и если пользователь изменил эту учетную запись, приложение выйдет из строя.

if([TWTweetComposeViewController canSendTweet]) {

         ACAccountStore *store = [[ACAccountStore alloc] init];
        ACAccountType *twitterType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
        [store requestAccessToAccountsWithType:twitterType withCompletionHandler:^(BOOL granted, NSError *error) 
         {

             if(granted)
             {
                NSArray *arrayOfAccounts =  [store accountsWithAccountType:twitterType];
                 if (arrayOfAccounts != nil amp;amp; [arrayOfAccounts count]>0) {
                     for(ACAccount *anAccount in arrayOfAccounts)
                     {
                         if ([anAccount.username isEqualToString:previousAccount.username] ) {
                             [self setPhoneTwitterAccount:anAccount]; //alwAYS SET the new Account.
                             break;
                         }
                     }
                     //previous account was deleted if a userName match was not found
                     //show the picker or just pick the first account.
                     //TODO: provide a picker from here as well.
                     if (self.phoneTwitterAccount == nil) {
                         self.phoneTwitterAccount = [arrayOfAccounts objectAtIndex:0];
                     }

                 }
             }
         }];
    }
  

Сбой происходит при использовании старой учетной записи:

  TWRequest* twitterRequest_5 = [[[TWRequest alloc] initWithURL:profileURL 
                                                          parameters:parameters
                                                       requestMethod:TWRequestMethodGET]autorelease];

        [twitterRequest_5 setAccount:phoneTwitterAccount];    

        [twitterRequest_5 performRequestWithHandler:^(NSData *responseData,NSHTTPURLResponse *urlResponse, NSError *error);
  

Комментарии:

1. Пожалуйста, опубликуйте свой исходный код, если это возможно, чтобы мы могли отследить проблему…

2. Спасибо за ответ, Дженнис, я обновил свой пост кодом. Главный вопрос заключается в том, как отслеживать изменения, происходящие в учетных записях за пределами нашего приложения.

Ответ №1:

У меня была аналогичная проблема с ACAccounts, мое приложение зависало, и отладчик выдавал мне EXC_BAD_ACCESS каждый раз, когда выполнялся следующий блок:

 performRequestWithHandler:^(NSData *responseData,NSHTTPURLResponse *urlResponse, NSError *error) 
  

Проблема была решена, когда я сохранил ACAccountStore в качестве переменной экземпляра в моем делегате приложения. Может быть, вы могли бы попробовать выделить и инициализировать ACAccountStore один раз в делегате вашего приложения, а затем ссылаться на этот экземпляр каждый раз, когда вам нужно получить от него данные учетной записи, а не выделять и инициализировать новые экземпляры всякий раз, когда вам нужно получить данные учетной записи Twitter.

 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
ACAccountStore *store = appDelegate._accountStore;
  

Не очень понятно, какова связь между ACAccountStore и ACAccount, но в документации говорится, что «Каждый объект ACAccount принадлежит одному объекту ACAccountStore».. Я полагаю, это означает, что если я не сохраню экземпляр ACAccountStore, из которого получен мой экземпляр ACAccount, в какой-то момент могут возникнуть проблемы.

Дайте мне знать, если это поможет, это совершенно неправильно, или, может быть, кто-нибудь может объяснить, что здесь происходит на самом деле.

Комментарии:

1. Спасибо за ответ Cdo, это не проблема в моем коде. Я решил проблему, но лучший способ решения по-прежнему остается неизвестным. Проблема в том, что если я сохраню объект ACAccount в настройках, а пользователь удалит эту учетную запись из настроек, то, очевидно, приложение выйдет из строя при попытке использовать сохраненную учетную запись. Нам нужен способ получения уведомления приложением всякий раз, когда учетная запись удаляется из настроек.

2. Я только что создал пустой проект для проверки ACAccountStoreDidChangeNotification, но мне не удалось получить уведомление в симуляторе. Вы пробовали тестировать уведомление как на симуляторе, так и на устройстве?

3. Каждый ACAccount объект представляет собой объект Core Data, связанный со NSManagedObjectContext встроенным в ACAccountStore . Как вы, возможно, знакомы с Core Data, отделение NSManagedObject s от их контекстов никогда не является хорошей идеей. У меня были похожие проблемы, и я придерживался ссылки на ACAccountStore решаемые все мои проблемы (а также придерживался основного потока).