Приложение PhoneGap / iOS LocalNotification аварийно завершает работу при нажатии View

У меня возникли проблемы: приложение не работает в фоновом режиме, и я устанавливаю локальное уведомление dailyInterval с помощью плагина localNotification, который я нашел на github здесь: https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/LocalNotification

Приложение вылетает, когда всплывает уведомление, и я нажимаю «Просмотреть»… похоже, что что-то отправляется, и оно не знает, что происходит. Я также не знаю, что происходит, так как Objective C для меня иностранный язык. У кого-нибудь есть идеи?

--------- Console Log ----------

29.07.11 11:05:48 Подтверждения после полудня [12004] - [UIConcreteLocalNotification absoluteString]: нераспознанный селектор отправлен экземпляру 0x5c22240

7/29/11 11:05:48 AM Afternoon Affirmations[12004]   *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIConcreteLocalNotification absoluteString]: unrecognized selector sent to instance 0x5c22240'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x017f65a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0194a313 objc_exception_throw + 44
    2   CoreFoundation                      0x017f80bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x01767966 ___forwarding___ + 966
    4   CoreFoundation                      0x01767522 _CF_forwarding_prep_0 + 50
    5   Afternoon Affirmations              0x00002f21 -[AppDelegate application:didFinishLaunchingWithOptions:] + 257
    6   UIKit                               0x002f7c89 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
    7   UIKit                               0x002f9d88 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 439
    8   UIKit                               0x00304617 -[UIApplication handleEvent:withNewEvent:] + 1533
    9   UIKit                               0x002fcabf -[UIApplication sendEvent:] + 71
    10  UIKit                               0x00301f2e _UIApplicationHandleEvent + 7576
    11  GraphicsServices                    0x020e5992 PurpleEventCallback + 1550
    12  CoreFoundation                      0x017d7944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    13  CoreFoundation                      0x01737cf7 __CFRunLoopDoSource1 + 215
    14  CoreFoundation                      0x01734f83 __CFRunLoopRun + 979
    15  CoreFoundation                      0x01734840 CFRunLoopRunSpecific + 208
    16  CoreFoundation                      0x01734761 CFRunLoopRunInMode + 97
    17  UIKit                               0x002f97d2 -[UIApplication _run] + 623
    18  UIKit                               0x00305c93 UIApplicationMain + 1160
    19  Afternoon Affirmations              0x00002d7f main + 127
    20  Afternoon Affirmations              0x00002cf5 start + 53
)

7/29/11 11:05:48 AM UIKitApplication:com.InTheRooms.AfternoonAffirmations[0x9a52][12004]    terminate called after throwing an instance of 'NSException'

person Alex N.    schedule 29.07.2011    source источник
comment
+1, у меня такая же проблема. Вы нашли решение?   -  person Samuel    schedule 13.12.2011
comment
Это не сбой, когда я устанавливаю приложение для работы в фоновом режиме (приложение не работает в фоновом режиме = НЕТ). Но с этим свойством все еще происходит сбой, если приложение больше не находится в памяти: -/   -  person Samuel    schedule 13.12.2011
comment
@SamuelMichelot У меня вообще проблемы с работой этого плагина (ни сбоев, ни уведомлений). Может я правильно настраиваю. Вы не могли бы мне помочь?   -  person xdumaine    schedule 29.01.2012
comment
Плагин недавно обновился...   -  person Samuel    schedule 02.02.2012
comment
Кажется, это было решено в последней версии Cordova. Код в -application: didFinishLaunchingWithOptions: был обновлен.   -  person eliego    schedule 27.07.2012


Ответы (4)


Хорошо, я нашел проблему, она в файле AppDelegate.m, а точнее в методе: didFinishLaunchingWithOptions. Метод предполагает, что первым параметром параметра является URL-адрес (но это не так, когда мы запускаем приложение через локальное уведомление. Быстрое и грязное исправление заключается в том, чтобы прокомментировать код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //commented out because it makes the app crash at startup with local notification...
    /*NSArray *keyArray = [launchOptions allKeys];
    if ([launchOptions objectForKey:[keyArray objectAtIndex:0]]!=nil) 
    {
        NSURL *url = [launchOptions objectForKey:[keyArray objectAtIndex:0]];
        self.invokeString = [url absoluteString];
        NSLog(@"Mosa_fr_en-busi launchOptions = %@",url);
    }*/

    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
person Samuel    schedule 13.12.2011

Я переписал плагин localNotification, если кому интересно — теперь вы можете добавлять обратные вызовы, а также звук. Мне нравится это решение этой проблемы, так как я столкнулся с тем же. Я также включил его в проект GIT.

проект GIT https://github.com/DrewDahlman/Phonegap-LocalNotification

и сообщение в блоге с объяснением изменений http://www.drewdahlman.com/meusLabs/?p=117

person Drew Dahlman    schedule 28.01.2012

Немного лучшее решение выглядит примерно так:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSArray *keyArray = [launchOptions allKeys];
    if ([keyArray count] > 0) {
        id option = [launchOptions objectForKey:[keyArray objectAtIndex:0]];
        if ([option isKindOfClass:[NSURL class]]) {
            NSURL *url = (NSURL *)option;
            self.invokeString = [url absoluteString];
            NSLog(@"ContactInbox launchOptions = %@",url);
        }
    }

    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

Если кто-то знает, какой ключ PhoneGap ожидает получить для URL, лучше заменить часть [keyArray objectAtIndex:0] фактическим ключом.

person Mikayel Aghasyan    schedule 27.12.2011

У меня была аналогичная проблема с локальными уведомлениями. Решение, которое я выбрал, немного отличается (хотя и очень похоже). Я использую проверку локального запуска уведомлений (UIApplicationLaunchOptionsLocalNotificationKey).

Вот краткий пример:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    if( localNotif ) 
    {
        // Do whatever you need to do with that local notitication
    }
    else
    {
        NSArray *keyArray = [launchOptions allKeys];
        if ([launchOptions objectForKey:[keyArray objectAtIndex:0]]!=nil) 
        {
            NSURL *url = [launchOptions objectForKey:[keyArray objectAtIndex:0]];
            self.invokeString = [url absoluteString];
        }
    }
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

Документы Apple: http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html

person Dmitry F    schedule 28.01.2012