将今天通知(今天扩展)中显示的数据发送到 appdelegate 方法

send data displayed in today notification(Today extension) to appdelegate method

我正在使用今天的扩展程序

我已经在 tableview 今天通知中显示了事件列表。

点击 selected 行事件时我想在 appdelegate 方法中发送

当单击 select 行时,我正在我的应用程序中导航并调用方法 openurl 但我无法通过此方法获得 selected 事件或 selected 行号。

那么我们能否从 today 扩展程序中获取数据到我们的应用程序

我在 todayviewcotroller 中的当前代码是

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

点击事件时将行号发送到 appdelegate 方法 (openurl)。

求助

您可以使用 NSUserDefaults 来存储应用程序和扩展程序之间的数据。但首先您需要启用应用程序组。

To enable data sharing, use Xcode or the Developer portal to enable app groups for the containing app and its contained app extensions. Next, register the app group in the portal and specify the app group to use in the containing app. To learn about working with app groups, see Adding an App to an App Group in Entitlement Key Reference.

启用应用组后,应用扩展及其包含的应用都可以使用 NSUserDefaults API 共享对用户首选项的访问权限。要启用此共享,请使用 initWithSuiteName: 方法实例化一个新的 NSUserDefaults 对象,并传入共享组的标识符。例如,共享扩展可能会更新用户最近使用的共享帐户,使用如下代码:

// 创建并共享对 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];

您可以使用 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;
}

这样您的应用就会知道用户点击了哪一行,并且可以以对您的应用有意义的任何方式做出响应。有一个 project on Github 可以证明这一点。

如果您需要传递不同的数据,请在 URL 中包含您需要的任何数据,并修改您的应用委托来处理该数据。