PhoneGap / iOS LocalNotification应用程序在点击“查看”时崩溃

我在这里遇到麻烦:我将应用程序设置为不在后台运行,并且我使用我在github上找到的localNotification插件设置dailyInterval本地通知: https : //github.com/phonegap/phonegap-plugins /树/主/ iPhone / LocalNotification

当通知弹出时应用程序崩溃,我点击“查看”…看起来正在发送的东西,它不知道发生了什么。 我,也不知道是什么,因为Objective C对我来说是一门外语。 有人有主意吗?

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

7/29/11 11:05:48 AM Afternoon Affirmations [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' 

好的,我发现了问题,它位于文件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]; } 

如果有人有兴趣,我会重新编写localNotification插件 – 你现在可以添加回调和声音。 我喜欢这个问题,因为我遇到了同样的问题。 我也把它包含在GIT项目中。

GIT项目https://github.com/DrewDahlman/Phonegap-LocalNotification

以及解释变化的博客文章http://www.drewdahlman.com/meusLabs/?p=117

一个更好的解决方案是这样的:

 - (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]部分会更好。

我在本地通知时遇到了类似的问题。 我选择的解决方案有点不同(尽管非常相似)。 我正在使用检查本地通知启动选项(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 Docs: http : //developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html