Ontvang het aantal ongelezen Gmail-berichten met PubSub

Ik probeer mijn ongelezen aantal e-mails van Gmail te krijgen met behulp van Cocoa (Mac) en het PubSub-framework. Ik heb een paar links gezien die PubSub en Gmail gebruiken, hier is mijn code tot nu toe.

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);

Weet iemand hoe ik de ongelezen telling kan krijgen?

Bedankt :)

1

1 antwoord

Je hebt twee problemen: een waarvoor een oplossing bestaat en een die een eeuwigdurend probleem lijkt te zijn.

De eerste: Feedvernieuwingen gebeuren asynchroon. U moet dus luisteren naar de PSFeedRefreshingNotification- en PSFeedEntriesChangedNotification-meldingen om te zien wanneer de feed wordt vernieuwd en bijgewerkt. Het object van de melding is de PSFeed in kwestie.

Als voorbeeld:

-(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: @"[email protected]"];
    [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);
}

Het tweede (en veel erger) probleem is dat PubSub de geverifieerde feeds niet correct verwerkt. Ik zag dit op http://www.dizzey.com/ ontwikkeling/ophalen-e-mails van gmail-gebruik-cacao/ en ik heb hetzelfde gedrag gereproduceerd op mijn eigen systeem. Ik weet niet of deze bug 10.7 specifiek is of dat deze van invloed is op eerdere versies van OS X.

De "workaround" is om NSURLConnection te gebruiken om een ​​geverifieerde ophaling van de onbewerkte feed-XML uit te voeren. U kunt dat dan in een PSFeed schuiven met behulp van de methode initWithData: URL:. De erg serieuze nadelen hiervan zijn dat je eigenlijk geen PubSubing meer bent. U moet een timer uitvoeren en de feed indien nodig handmatig vernieuwen.

Het beste wat ik kon doen om je te helpen was om een ​​bug op te lossen: rdar://problem/10475065 (OpenRadar: 1430409 ).

U moet waarschijnlijk een dubbele bug indienen om de kans te vergroten dat Apple het probleem zal oplossen.

Succes.

3
toegevoegd
Heel erg bedankt voor uw hulp en uw antwoord. Ik heb een dubbele bug ingediend.
toegevoegd de auteur Seb Jachec, de bron