尽早制作-Siri快捷方式入门| Byteout博客

让我们通过引用WWDC 2018中的Apple来开始这篇文章

Siri快捷方式是iOS 12中强大的新功能,可让您的应用向Siri公开其功能。 这使Siri可以根据各种上下文在相关时间建议您的快捷方式。

有了这项新功能,应用程序便有了新的面貌-语音。 而且,它们会在您可能想到的时候立即出现在Spotlight上,从而自动“变得更聪明”。

因此,在本教程中,我将向您展示使用NSUserActivity在应用中实现快捷方式的速度—包含2个代码块

我将指导您完成一些步骤,向Siri展示我们喜欢的应用程序的一些最有价值的功能。

注意:您可以 Byteout Software博客 找到带有 更好格式的代码 的原始帖子

简短介绍-我们示例的背景故事

早期游戏警报是一款闹钟应用,在用户赢得简单游戏之前,它不会停止响铃。 用户也可以随时随地玩游戏,即使没有警报也是如此。 为此,在没有新的快捷方式的情况下,他们必须:

  1. 启动应用
  2. 转到列出所有游戏的屏幕
  3. 滚动到他们最喜欢的一个
  4. 按“播放”

但是有了快捷方式,他们将只能使用自己的声音,或者在搜索中键入游戏名称。 因此,让我们深入研究代码!

第一步是进行用户活动并在适当的时间捐赠。

// GamesSelectionViewController.m // 1. Make activity - (void)donateActivity { NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"com.your_appname.game_activity"]; // A activity.title = [NSString stringWithFormat:@”Play %@”, self.selectedGame.name]; // B activity.eligibleForSearch = YES; // C activity.eligibleForHandoff = NO; // C if (@available(iOS 12.0, *)) { activity.eligibleForPrediction = YES; // C } [activity addUserInfoEntriesFromDictionary:@{ @”gameID”: self.selectedGame.id }]; // D self.userActivity = activity; // E [self.userActivity becomeCurrent]; // E } // 2. Donate it at the appropriate time - when play button is pressed, before we actually start playing the game. - (IBAction)playButtonTapped:(UIButton *)sender { [self donateActivity]; // F [self playGame:self.selectedGameID]; } 

让我简要解释一下代码。

  1. 创建新的用户活动时,给它一个唯一的标识符很重要-这样您以后就可以以不同的方式响应不同的快捷方式。
  2. 我们还应该为其设置一个漂亮的用户友好标题,以便用户在看到它与我们的应用程序分开时能够理解它的功能-在这种情况下为“ Play GAME_NAME”(例如,Play Memory,Play Tennis等)。 )就可以了。
  3. 接下来的几行很简单:我们设置我们希望我们的快捷方式符合条件的内容。 例如,我们的应用程序不支持切换,因此我们将其设置为NO。
  4. 我们使用UserInfo字典传递快捷方式正常工作所需的数据。 在我们的例子中,系统中有很多游戏,我们需要知道用户开始了哪一个游戏,因此我们要传递gameID。
  5. 将用户活动“捐赠”给系统。 我们将该活动标记为用户当前正在使用。 为什么? 想象一下,就像记录和跟踪统计信息一样。 因此,系统知道您通常在什么时候玩哪个游戏。
  6. 我们在适当的时间调用此函数-每次用户启动游戏时。

让我们看看它是如何工作的!

为了测试这一点,我们要做的就是几次启动几次游戏(多次调用我们的活动)。 正如您可能已经猜到的那样,应用程序中没有任何变化。

但是,如果您转到Spotlight或尝试搜索活动,则应该在建议和搜索结果中看到它。

如果建议中没有立即显示该活动-请尝试多次启动该活动。 请记住,您的iPhone会根据您的手机使用情况在相关时间向您建议。 由于这是它第一次参加您的活动,因此它可能暂时还不认为它有意义。

如果仍然无法在Siri设置中找到快捷方式,请转到开发人员设置(当您的手机连接到Mac时,它们会显示在“设置”中)并启用“显示最近的快捷方式”。

您也可以转到Siri设置并尝试记录自己的快捷方式短语。

第二部分是关于处理用户点击快捷方式时发生的情况。

 // AppDelegate.m - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id> * _Nullable))restorationHandler { // A if ([userActivity.activityType isEqualToString:@"com.your_appname.game_activity"]) { // B NSNumber *gameID = [userActivity.userInfo valueForKey:@"gameID"]; // C UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; GameViewController *viewController = (GameViewController *)[storyboard instantiateViewControllerWithIdentifier:@"GamesViewControler"]; viewController.gameId = gameID; // D [self.window.rootViewController presentViewController:viewController animated:YES completion:nil]; return YES; // E } } 

让我再次简单地解释一下代码。

  1. 我们使用AppDelegate的application:continueUserActivity:restorationHandler:函数在用户点击快捷方式时做出反应-继续执行我们应用中的指定活动
  2. 首先,我们需要检查活动类型。
  3. 然后,我们读取存储在UserInfo词典中的数据。
  4. 我们实例化适当的View Controller并将其传递给数据。
  5. 我们返回YES-表示应用程序已响应快捷方式。

剩下要做的就是在Info.plist文件中声明我们的应用程序支持的活动类型。

 NSUserActivityTypes  com.your_appname.game_activity  

完成此操作后,我们可以激活Siri,说出我们的短语,瞧! 游戏开始了。

这绝对是为应用程序制作Siri快捷方式的最简单方法。 很棒是因为它轻巧,简单,并允许您非常快地在应用程序中实现超酷的iOS新功能。 但是,这是非常有限的-它所要做的就是在特定的上下文中启动您的应用程序。 它不能在后台运行

对于后台更改,更复杂的功能以及Siri中丰富的用户体验,不能使用NSUserActivity。 为此,我们有SiriKit和Intent Extensions。

关于这两个主题,都有很多很棒的循序渐进教程,这些只是我(现在可以想到)推荐的其中一些: