Настройка плагина push-уведомлений phonegap 2.0 для iOS (одна ошибка за другой)

Последние пару недель пытался настроить PushNotification с базовым приложением Phonegap 2.

Вот шаги, которые я сделал.

  1. Перетащите папку PushNotification в папку с плагинами:


    (источник: joelchu.com)

  2. Следуйте следующей инструкции в документации


    (источник: joelchu.com)

  3. Добавьте PushNotifcation/PushNotification в раздел Cordova.plist плагинов

  4. Измените AppDelegate.m:

    - (void) dealloc
    {
        [super dealloc];
    }
    
    /* START PUSH MODIFCATION */
    
    #pragma PushNotification delegation
    
    - (void)application:(UIApplication*)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
    {
        PushNotification* pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
        [pushHandler didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
    }
    
    - (void)application:(UIApplication*)app didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
    {
        PushNotification* pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
        [pushHandler didFailToRegisterForRemoteNotificationsWithError:error];
    }
    
    - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
    {
        PushNotification* pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
        NSMutableDictionary* mutableUserInfo = [userInfo mutableCopy];
    
        // Get application state for iOS4.x+ devices, otherwise assume active
        UIApplicationState appState = UIApplicationStateActive;
        if ([application respondsToSelector:@selector(applicationState)]) {
            appState = application.applicationState;
        }
    
        [mutableUserInfo setValue:@"0" forKey:@"applicationLaunchNotification"];
        if (appState == UIApplicationStateActive) {
            [mutableUserInfo setValue:@"1" forKey:@"applicationStateActive"];
            [pushHandler didReceiveRemoteNotification:mutableUserInfo];
        } else {
            [mutableUserInfo setValue:@"0" forKey:@"applicationStateActive"];
            [mutableUserInfo setValue:[NSNumber numberWithDouble: [[NSDate date] timeIntervalSince1970]] forKey:@"timestamp"];
            [pushHandler.pendingNotifications addObject:mutableUserInfo];
        }
    }
    
    /* END PUSH MODIFICATION */
    
    @end
    

ПЕРВАЯ ОШИБКА

Неизвестное имя типа PushNotification

Поэтому я добавляю эту строку сразу после последнего импорта:

#import "PushNotification.h"

Это решает проблему.

СЛЕДУЮЩАЯ ПРОБЛЕМА

Файл CDVPlugin.h не найден

Поэтому я добавляю следующее в User Header Search Paths — ко всем настройкам сборки:

$(CORDOVALIB)/Classes (recursive)

СЛЕДУЮЩАЯ ПРОБЛЕМА

Затем выдает более 20 ошибок!


(источник: joelchu.com)

Что я сделал не так?

Искал везде вверх и вниз. К моему удивлению, кажется, что ни у кого нет проблем.

Подробнее о моей настройке:

  • Телефонная щель 2.0
  • XCode 4.5 (предварительная версия 4)
  • База iOS 6 (сборка приложения для iOS 5 и выше)

Надеюсь, что кто-то там получил ответ. Спасибо.

(P.S. если плагин Phonegap PushNotification сломан - они уже 4 месяца не обновляются. Есть ли бесплатная альтернатива? Еще раз спасибо)

Я описал ту же проблему на мой блог.

ИСПРАВЛЕНО (ПОКА)

ИСПРАВЛЕНО

/* START BLOCK */

#pragma PushNotification delegation

- (void) application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    PushNotification* pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
    [pushHandler didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}

- (void) application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
    PushNotification* pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
    [pushHandler didFailToRegisterForRemoteNotificationsWithError:error];
}

- (void) application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{
    PushNotification* pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
    NSMutableDictionary* mutableUserInfo = [userInfo mutableCopy];

    // Get application state for iOS4.x+ devices, otherwise assume active
    UIApplicationState appState = UIApplicationStateActive;
    if ([application respondsToSelector:@selector(applicationState)]) {
        appState = application.applicationState;
    }

    [mutableUserInfo setValue:@"0" forKey:@"applicationLaunchNotification"];
    if (appState == UIApplicationStateActive) {
        [mutableUserInfo setValue:@"1" forKey:@"applicationStateActive"];
        [pushHandler didReceiveRemoteNotification:mutableUserInfo];
    } else {
        [mutableUserInfo setValue:@"0" forKey:@"applicationStateActive"];
        [mutableUserInfo setValue:[NSNumber numberWithDouble: [[NSDate date] timeIntervalSince1970]] forKey:@"timestamp"];
        [pushHandler.pendingNotifications addObject:mutableUserInfo];
    }
}

/* STOP BLOCK */

Что я сделал - первые два

- (void)application:(UIApplication*)app

изменился на

- (void) application:(UIApplication*)application

и я перемещаю

#import "PushNotification.h"

в заголовок блока (вместо непосредственно перед кодом изменения - это вызывает проблему @end не в контексте).

Я еще не запускал интерфейс javascript. Но все ошибки ушли.

Спасибо.


person Joel Chu    schedule 11.09.2012    source источник


Ответы (1)


Пожалуйста, попробуйте отменить ваши изменения в импорте, а затем замените этот блок

#ifdef CORDOVA_FRAMEWORK
    #import <Cordova/CDVPlugin.h>
#else
    #import "CDVPlugin.h"
#endif

по этой линии

#import <Cordova/CDVPlugin.h>

Если это все еще не работает, возможно, у вас нет проекта PhoneGap 2.0 или вы установили неправильную или несколько версий фреймворка.

Вы можете сделать то же самое в файле «PushNotification.m»: просто замените второй импорт на #import <Cordova/JSONKit.h>.

Обратите внимание, что я еще не использовал этот плагин, это только из моего опыта переноса на 2.0 (я являюсь автором плагинов панели вкладок/навигации).

person AndiDog    schedule 11.09.2012
comment
Спасибо за ответы. Сделал то, что вы сказали здесь, и ошибка уменьшилась с 20 до 5. Я сообщу об ошибке позже. - person Joel Chu; 11.09.2012