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

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

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

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

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

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

мой текущий код в сегодняшнем просмотре котроллера

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

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

благодарю за помощь


person Vinod Jadhav    schedule 26.02.2015    source источник


Ответы (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#//apple_ref/doc/uid/TP40014214-CH21-SW1

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

 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
           selector:@selector(defaultsChanged:)  
               name:NSUserDefaultsDidChangeNotification
             object:nil];
person Ashraf Tawfeeq    schedule 26.02.2015
comment
Я включил группу приложений из своего приложения, и расширение также использует nsuserdefault с методом initwithsuitname и попытался запустить приложение в обычном режиме, но когда событие щелчка в уведомлении не вызывает метод в TodayViewController всякий раз, когда я удаляю этот метод кода nsuserdefault, вызываемый, я не знаю, почему ? @Ашраф Тауфик - person Vinod Jadhav; 26.02.2015
comment
Добавьте себя наблюдателем в уведомление UserdefaultsDidChange - person Ashraf Tawfeeq; 26.02.2015

Вы можете сделать это с помощью URL-адреса, если вы обязательно включите важные данные в 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-адрес и измените делегат приложения для обработки этих данных.

person Tom Harrington    schedule 26.02.2015