Получить непрочитанный счет Gmail с помощью PubSub - PullRequest
1 голос
/ 13 ноября 2011

Я пытаюсь подсчитать количество непрочитанных писем в Gmail, используя Cocoa (Mac) и платформу PubSub.Я видел одну или две ссылки, показывающие использование PubSub и Gmail, вот мой код.

PSClient *client = [PSClient applicationClient];
NSURL    *url    = [NSURL URLWithString:@"https://mail.google.com/mail/feed/atom/inbox"];
PSFeed   *feed   = [client addFeedWithURL:url];

[feed setLogin: @"myemailhere"];
[feed setPassword: @"mypasswordhere"];

NSLog(@"Error: %@", feed.lastError);

Кто-нибудь знает, как я могу получить количество непрочитанных?

Спасибо:)

1 Ответ

3 голосов
/ 19 ноября 2011

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

Первое: обновление подачи происходит асинхронно.Поэтому вам необходимо прослушать уведомления PSFeedRefreshingNotification и PSFeedEntriesChangedNotification, чтобы увидеть, когда фид обновляется и обновляется.Объектом уведомления будет PSFeed, о котором идет речь.

В качестве примера:

-(void)feedRefreshing:(NSNotification*)n
{
    PSFeed *f = [n object];
    NSLog(@"Is Refreshing: %@", [f isRefreshing] ? @"Yes" : @"No");
    NSLog(@"Feed: %@", f);
    NSLog(@"XML: %@", [f XMLRepresentation]);
    NSLog(@"Last Error: %@", [f lastError]);


    if(![f isRefreshing])
    {
        NSInteger emailCount = 0;
        NSEnumerator *e = [f entryEnumeratorSortedBy:nil];
        id entry = nil;

        while(entry = [e nextObject])
        {
            emailCount++;
            NSLog(@"Entry: %@", entry);
        }
        NSLog(@"Email Count: %ld", emailCount);
    }
}

-(void)feedUpdated:(NSNotification*)n
{
    NSLog(@"Updated");
}

-(void)pubSubTest
{
    PSClient *client = [PSClient applicationClient];
    NSURL    *url    = [NSURL URLWithString:@"https://mail.google.com/mail/feed/atom/inbox"];
    PSFeed   *feed   = [client addFeedWithURL:url];

    [feed setLogin: @"correctUserName@gmail.com"];
    [feed setPassword: @"correctPassword"];
    NSError *error = nil;

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(feedUpdated:) name:PSFeedEntriesChangedNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(feedRefreshing:) name:PSFeedRefreshingNotification object:nil];

    [feed refresh:&error];
    if(error)
        NSLog(@"Error: %@", error);
}

Вторая (и гораздо хуже) проблема заключается в том, что PubSub неправильно обрабатывает проверенные каналы.Я видел это в http://www.dizzey.com/development/fetching-emails-from-gmail-using-cocoa/, и я воспроизвел такое же поведение в моей собственной системе.Я не знаю, является ли эта ошибка специфичной для 10.7 или она затрагивает предыдущие версии OS X.

«Обходной путь» - использовать NSURLConnection для выполнения аутентифицированного извлечения необработанного фида XML.Затем вы можете вставить это в PSFeed, используя его initWithData: URL: метод.Весьма серьезными недостатками этого является то, что вы больше не являетесь PubSubing.Вам нужно будет запустить таймер и вручную обновить канал, когда это необходимо.

Лучшее, что я смог сделать, чтобы помочь вам, это сообщить об ошибке: rdar: // problem / 10475065 (OpenRadar: 1430409 ).

Возможно, вам следует подать повторяющуюся ошибку, чтобы попытаться увеличить вероятность того, что Apple исправит это.

Удачи.

...