PhoneGap / iOS LocalNotification App Crashes on tapping "View"
Asked Answered
C

4

6

I'm having trouble here: I have the app set to not run in the background, and I'm setting a dailyInterval localnotification using a localNotification plugin I found on github here: https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/LocalNotification

The app crashes when the notification pops up, and I tap "View"... looks like something is being sent along and it doesn't know what's going on. I, also don't know what's going on since Objective C is a foreign language to me. Anyone have any ideas?

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

7/29/11 11:05:48 AM Afternoon Affirmations[12004] -[UIConcreteLocalNotification absoluteString]: unrecognized selector sent to instance 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'
Chill answered 29/7, 2011 at 17:4 Comment(4)
It's not crashing when I set the app to run in the background (Application does not run in background = NO). But it's still crashing with this property if the app is no longer in the memory :-/Rimple
@SamuelMichelot I'm having trouble getting this plugin to work at all (no crashes, no notifications). Maybe I'm setting it up right. Could you help me out?April
The plugin has been updated recently...Rimple
This seems to have been resolved in the latest version of Cordova.. The code in -application: didFinishLaunchingWithOptions: has been updated.Sibilla
R
3

OK, I found the problem, it's in the file AppDelegate.m and more precisely in the method : didFinishLaunchingWithOptions. The method assumes that the first option parameters is an url (but it's not when we launch the app via a Local Notification. The quick and dirty fix is to comment the code :

- (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];
}
Rimple answered 13/12, 2011 at 20:8 Comment(0)
I
2

I've re-writen the localNotification plugin if anyone is interested - you can now add callbacks as well as sound. I like this fix for this problem as I have faced the same thing. I've also included it in the GIT project.

the GIT project https://github.com/DrewDahlman/Phonegap-LocalNotification

and a blog post explaining changes http://www.drewdahlman.com/meusLabs/?p=117

Improbity answered 28/1, 2012 at 16:58 Comment(0)
P
0

A little bit better solution is something like this:

- (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];
}

If somebody knows what key PhoneGap expects to have for URL it's better to replace [keyArray objectAtIndex:0] part with actual key.

Painless answered 27/12, 2011 at 21:44 Comment(0)
C
0

I had a similar issue with local notifications. The solution that I chose is a bit different (though quite similar). I'm using a check for a local notification launch option (UIApplicationLaunchOptionsLocalNotificationKey).

Here is a short example:

- (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 Docs: http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html

Cherub answered 28/1, 2012 at 4:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.