Медленно открывайте приложение карты под didReceiveLocalNotification

Я хочу сделать простое действие, получить локальное уведомление и открыть приложение карты Apple. Когда я получаю уведомление, а затем перемещаю его, сначала открывается мое приложение, и это нормально. Но мне нужно подождать около 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];
}

3 ответа

Решение

Вы можете попробовать обернуть ваш код следующим образом:

dispatch_async(dispatch_get_main_queue(), ^{
    // Your code here
});

Я только что столкнулся с этой проблемой сам, не с картами, а с использованием пользовательских схем URL для создания ссылок на другие приложения. Проблема в том, что ваше приложение не завершило возобновление, когда вы предлагаете ему переключиться на Карты. Это вызывает 10-секундную задержку. Если вы выполните отладку, вы, вероятно, обнаружите, что didReceiveLocalNotification выполняется и на некоторое время зависает при вызове в Maps. Затем, после завершения этого вызова, он все равно должен выполнить applicationDidBecomeActive внутри вашего AppDelegate.

Как предлагает @Yazid, оберните его асинхронным вызовом, чтобы ваше приложение могло запустить интеграцию с Картами в отдельном потоке, одновременно быстро возобновляя работу в основном потоке. Как только это завершится (что будет намного быстрее), вы увидите Карты открытыми. Однако я бы посоветовал использовать очередь по умолчанию, а не основную (вы можете получить тупик, используя основную очередь).

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

Вы можете добавить что-то вроде индикатора или MBProgressHUD, когда приложение получит местоположение. Если вы не хотите, чтобы на экране ничего не отображалось, вы можете добавить вид, отображаемый на карте, а при загрузке все скрыть этот вид с анимацией.

Другие вопросы по тегам