我想做一个简单的操作,获取本地通知并打开苹果地图应用。 当我收到通知然后滑动它时,我的应用程序首先打开,这很好。但我需要等待大约10秒钟才能打开地图应用程序。为什么会延迟?它应该是我的应用程序打开,然后地图直接。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
CLLocationCoordinate2D rdOfficeLocation = CLLocationCoordinate2DMake(latitude,longitude);
MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:rdOfficeLocation addressDictionary:nil];
MKMapItem *item = [[MKMapItem alloc] initWithPlacemark:placemark];
[item openInMapsWithLaunchOptions:nil];
}
答案 0 :(得分:1)
我自己一直遇到这个问题,不是使用地图,而是使用自定义网址方案深度链接到其他应用。问题是,当您告诉它切换到地图时,您的应用尚未完成恢复。这导致10秒延迟。如果您进行调试,您可能会发现didReceiveLocalNotification正在执行并在您调用Maps时挂起一段时间。然后在调用完成后,它仍然必须在AppDelegate中执行applicationDidBecomeActive。
正如@Yazid建议的那样,用异步调用将其包装起来,这样你的应用就可以在一个单独的线程中触发它的Maps集成,同时在主线程上快速恢复。一旦完成(速度会快得多),您将看到地图打开。但是我建议使用默认队列而不是主队列(你可以使用主队列获得死锁)。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CLLocationCoordinate2D rdOfficeLocation = CLLocationCoordinate2DMake(latitude,longitude);
MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:rdOfficeLocation addressDictionary:nil];
MKMapItem *item = [[MKMapItem alloc] initWithPlacemark:placemark];
[item openInMapsWithLaunchOptions:nil];
});
}
答案 1 :(得分:0)
当app获取位置时,您可以添加指标或MBProgressHUD等内容。如果您不想在屏幕上显示任何内容,您可以添加一个显示在地图中的视图,当您加载时,全部用动画隐藏此视图
答案 2 :(得分:0)
您可以尝试使用以下代码包装代码:
dispatch_async(dispatch_get_main_queue(), ^{
// Your code here
});