Отправить данные, отображаемые в уведомлении за сегодняшний день (расширение за сегодня), в метод appdelegate

Я использую сегодня расширение

Я отображал список событий в табличном виде сегодня уведомления.

при нажатии на выбранное событие строки, которое я хочу отправить в методе appdelegate

Когда я нажимаю "Выбрать строку", я перемещаюсь в своем приложении и вызываю метод openurl, но не могу получить выбранное событие в этом методе или номер выбранной строки.

так что мы можем получить данные от сегодняшнего расширения нашего приложения

мой текущий код в сегодня viewcotroller

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  {
      NSLog(@"%s",__PRETTY_FUNCTION__);
     [self.extensionContext openURL:[NSURL URLWithString:@"TestIt://"]
             completionHandler:^(BOOL success) {
     }];
}

при нажатии на событие отправьте номер строки в метод appdelegate (openurl).

жаждать помощи

2 ответа

Решение

Вы можете использовать NSUserDefaults для хранения данных между приложением и расширениями. Но сначала вам нужно включить группы приложений.

Чтобы включить общий доступ к данным, используйте XCode или портал разработчика, чтобы включить группы приложений для содержащего приложения и его расширений. Затем зарегистрируйте группу приложений на портале и укажите группу приложений для использования в содержащем приложении. Чтобы узнать о работе с группами приложений, см. Раздел Добавление приложения в группу приложений в справочнике ключей прав.

После включения групп приложений расширение приложения и содержащее его приложение могут использовать API NSUserDefaults для совместного доступа к пользовательским настройкам. Чтобы включить этот общий доступ, используйте initWithSuiteName: метод для создания нового объекта NSUserDefaults, передавая идентификатор общей группы. Например, расширение Share может обновить последнюю использованную учетную запись пользователя, используя код, подобный следующему:

// Создать и поделиться доступом к объекту NSUserDefaults.

NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.example.domain.MyShareExtension"];

// Используем объект по умолчанию для общего пользователя, чтобы обновить учетную запись пользователя.

[mySharedDefaults setObject:theAccountName forKey:@"lastAccountName"];

Вот ссылка: https://developer.apple.com/library/mac/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

Изменить: Как зарегистрироваться в уведомлении пользователя по умолчанию

 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
           selector:@selector(defaultsChanged:)  
               name:NSUserDefaultsDidChangeNotification
             object:nil];

Это можно сделать с помощью URL-адреса, если только вы обязательно включите в него важные данные. Например, вы можете изменить свой код так:

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"TestIt://%d", indexPath.row];
[self.extensionContext openURL:url] completionHandler:nil];

Теперь URL включает в себя индекс строки, по которой пользователь нажал.

Затем убедитесь, что ваше приложение отвечает на этот URL (что вы делаете в настройках цели), и вы получите этот URL в делегате приложения. Вы бы сделали что-то вроде этого:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSString *tableIndexRow = [url resourceSpecifier];

    // tableIndexRow is a string that contains the tapped row number

    // Do something to handle the tap

    return YES;
}

Таким образом, ваше приложение будет знать, в какую строку нажал пользователь, и оно может ответить любым удобным для вас способом. На Github есть проект, который демонстрирует это.

Если вам нужно передать разные данные, включите в URL все, что вам нужно, и измените делегат приложения для обработки этих данных.

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