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

Posted

技术标签:

【中文标题】PhoneGap / iOS LocalNotification 应用程序在点击“查看”时崩溃【英文标题】:PhoneGap / iOS LocalNotification App Crashes on tapping "View" 【发布时间】:2011-07-29 17:04:34 【问题描述】:

我在这里遇到了麻烦:我将应用程序设置为不在后台运行,并且我正在使用我在 github 上找到的 localNotification 插件设置 dailyInterval 本地通知:https://github.com/phonegap/phonegap-plugins/tree/master/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'

【问题讨论】:

+1,我也有同样的问题。你找到解决办法了吗? 当我将应用程序设置为在后台运行时它没有崩溃(应用程序不在后台运行=否)。但是如果应用程序不再在内存中,它仍然会因为这个属性而崩溃:-/ @SamuelMichelot 我无法让这个插件正常工作(没有崩溃,没有通知)。也许我设置正确。你能帮帮我吗? 插件最近更新了... 这个好像在最新版的Cordova中已经解决了。-application:didFinishLaunchingWithOptions:中的代码已经更新了。 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果有人感兴趣,我已经重新编写了 localNotification 插件 - 您现在可以添加回调和声音。我喜欢这个问题的修复,因为我遇到了同样的事情。我也将它包含在 GIT 项目中。

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

还有一篇解释变化的博文 http://www.drewdahlman.com/meusLabs/?p=117

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我在本地通知方面遇到了类似的问题。我选择的解决方案有点不同(尽管非常相似)。我正在检查本地通知启动选项(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];

苹果文档: http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html

【讨论】:

以上是关于PhoneGap / iOS LocalNotification 应用程序在点击“查看”时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UILocalNotification.applicationIconBadgeNumber 在 iOS 5 中不起作用!!!

推送通知 IOS 反应原生 NSDictionary 错误

IOS - Phonegap - 条码扫描仪

Phonegap中ios的蓝牙插件

Phonegap 3.0 iOS7 ApplicationPreferences 插件

Socket.io + PhoneGap