的XCode:为什么在didFinishLaunchingWithOptions launchOpt

2019-07-03 20:40发布

我想,当应用程序通过在通知点击启动我的应用程序做具体的事情。 我想要做的这些具体的事情,当应用程序已经通过的通知点击运行到后台,而且当应用程序被启动从头开始(不运行到后台)。

当应用从后台通过在通知点击开始,我获得通过的通知:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

=>没问题!

当应用程序是从头开始通过在通知点击开始,我想通过得到通知:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

     UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

}

但是launchOptions始终是零! 当应用程序是从头开始通过应用程序图标(正常),而且当应用程序是从头开始通过点击开始通知(不正常),点击开始是零。

任何人都知道如何解决这个问题?

谢谢 !!!

编辑1

下面是如何我的通知创建(乔的问题):

  NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:
[NSArray arrayWithObjects:notifText,latitudeString,longitudeString,nil]
forKeys:[NSArray arrayWithObjects:@"notifText",@"latitude",@"longitude", nil]];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    localNotif.fireDate = itemDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];
    localNotif.alertBody =msg;
    localNotif.alertAction = @"Ok";
    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;
    localNotif.userInfo = userInfo;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
    [localNotif release];

编辑2(回答我的问题!:))

下面是我用来调试我的应用程序,但...这个程序是错误的!

  1. 我建立了我的调试器中的“编辑计划”菜单中的“等待MyApp.app启动”选项
  2. 我开始了我与XCode的应用程序第一时间(从头开始推出)的XCode显示“等待我的MyApp的推出” =>我点击我的应用程序图标来启动应用程序
  3. 应用启动=>我按了home键=>显示通知
  4. 我点击Xcode中停止按钮再次关闭我的XCode =>的XCode显示重新启动它的应用程序中的“等待我的MyApp的推出”的消息=>我点击状态栏来启动应用程序通知
  5. => launchOptions是零!

launchOptions等于零是由于这样的事实,重振与Xcode中的应用程序(在这种情况下,与“等待我的MyApp的启动”选项)删除通知,即使是在状态栏仍显示...

为了能够调试检查什么是launchOptions的通过的通知点击从头开始应用的重新开张后的内容,似乎唯一的办法就是通过Tammo福瑞斯在答复中提到,以显示在UIAlert此内容。 所以,请使用下在这种特殊情况下进行调试:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
    return YES;
}

感谢你的帮助 !!!!

Answer 1:

我找不到你共享代码中的错误。 通常情况下本应在模拟器上都工作,并在设备上。 这里是为我工作的例子:首先生成一个新的单一视图的iPhone应用程序(ARC和故事上)。 然后改变这两种方法AppDelegate如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    localNotif.fireDate = [NSDate dateWithTimeInterval:10.0 sinceDate:[NSDate date]];
    localNotif.timeZone = [NSTimeZone defaultTimeZone];
    localNotif.alertBody = @"Just some text";
    localNotif.alertAction = @"OK";
    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;
    localNotif.userInfo = @{@"test": @YES};

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
}

然后启动这个程序,按home键,然后停止应用程序。 如果您对其中谈到在10秒内按下home键后,本地通知挖掘,你会看到这样的事情,这说明本地通知已传递到-application:didFinishLaunchingWithOptions:

我的建议是:首先让我上面贴的工作,以确保一切都没有用你的设置出错了,然后检查你在你的代码做什么不同的例子。

编辑

这适用于编辑的问题2:本地通知似乎也为我工作,等待时的应用程序启动(在模拟器,而不是设备上)。 试试这个:

  1. 安装上述的示例应用程序,并与启动它“等待MyApp.app推出”禁用。
  2. 点击主页按钮,然后通过Xcode中或通过任务栏停止应用程序。
  3. 启用“等待MyApp.app推出”。
  4. 如果你现在挖掘的通知中心的通知,它显示在警报视图。


Answer 2:

不知道这是否是你寻找什么,但是否缺少“返回YES;”? 因为我用这个来执行SEGUE从一个通知一个新的观点,它工作正常

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navigation = (UINavigationController *) self.window.rootViewController;

    [navigation.visibleViewController performSegueWithIdentifier:@"Ident" sender:nil];

    return YES;
}


Answer 3:

我的结论,如果它能够HEP任何建议,请参考下面

你有新的版本来测试您的应用程序时,你都必须测试通过最新的应用程序生成的通知的通知点击动作。 如果你继续与年长构建生成然后它会表现得出乎意料的旧通知点击动作检测(指以某种方式其能够启动应用程序,但它不会回报你在didFinishLaunchingWithOptions任何有效信息:)



Answer 4:

请原谅我,我还是新的,当涉及到苹果的推送通知服务,但我做了一些读通过他们的文件和我的猜测是,有可能是一些在创建导致该问题的本地通知。

我会仔细检查你是如何与苹果的实例创建本地通知如这里清单2-1只是为了排除这种可能性。 由于一些用于创建本地通知在该线程没有显示我们的代码,这使得它很难评估,如果您的本地通知的实例确实是正确的。 这可能最终会被看成是简单是错用大火日期或别的东西没有被正确设置的通知。



文章来源: XCode : why launchOptions in didFinishLaunchingWithOptions always nil?