Предположим, я создаю приложение, в которое пользователь может установить несколько небольших интерактивных приложений ( медитаций ).
Для удобства я бы хотел, чтобы мои пользователи могли запускать один из них: «Эй, Сири, начни Пляжный закат в Медитации».
В силу причин, по которым пользователям имеет смысл выполнять это действие голосом, без когда-либо впервые взаимодействовал с Beach Sunset в приложении iOS. (Они могут, например, уже «владеть» им через веб-приложение моей службы.)
То есть: я хочу голосовое действие типа «Привет, Сири, запусти Beach Sunset in Meditations» работать даже без , когда пользователь сначала создал для него ярлык, или я «жертвовал» действия для него.
Возможно ли это? (Мне кажется, что многие приложения по умолчанию демонстрируют похожее поведение, но, может быть, они особенные.) Если нет, то что я могу сделать лучше всего?
Нужны ли "пожертвования", чтобы Сири была в курсе? голосовых действий моего приложения, или они являются просто механизмом для намека и предсказания поведения пользователя?
Нужны ли «быстрые клавиши», чтобы Сири знал о голосовых действиях моего приложения, или они просто механизм для пользовательской фразы? настройка?
Я никогда не добавлял поддержку Siri в приложение iOS, но кажется, что «параметры» стали намного мощнее в iOS 13. Этот ответ предполагает, что нечто подобное было невозможно в iOS 12, но я думаю, что это также делает что-то несколько иное (я хочу запустить приложение; они хотят «создать объект», предположительно, просто с помощью Intent UI. Я не знаю если это имеет значение.)
Что я сделал
Я определил пользовательское намерение в категории Start (LaunchMeditation
) с одним параметр (meditationName
).
Я рассмотрел стандартные Медиа намерения, но медиа здесь интерактивные, а не только аудио / видео, и я не хочу попадать в неприятности.
Я добавил расширение Intents в свое приложение и написал элементарный тестовый «обработчик», который просто пытается передать имя медитации в приложение:
@interface IntentHandler () <LaunchMeditationIntentHandling>
@end
@implementation IntentHandler
- (id)handlerForIntent:(INIntent *)intent { return self; }
- (void)handleLaunchMeditation:(nonnull LaunchMeditationIntent *)intent
completion:(nonnull void (^)(LaunchMeditationIntentResponse * _Nonnull))completion {
// XXX: Maybe activity can just be nil?
NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"com.example.meditations.activity.launch"];
activity.title = [NSString stringWithFormat:@"Launch %@ in Meditations", intent.meditationName]; // Do I need this?
activity.userInfo = @{@"meditationName": intent.meditationName};
completion([[LaunchMeditationIntentResponse alloc] initWithCode:LaunchMeditationIntentResponseCodeContinueInApp
userActivity:activity]);
}
- (void)resolveMeditationNameForLaunchMeditation:(nonnull LaunchMeditationIntent *)intent
withCompletion:(nonnull void (^)(INStringResolutionResult * _Nonnull))completion {
completion([INStringResolutionResult successWithResolvedString:intent.meditationName]);
}
@end
Когда я тестирую расширение Intents, Теперь я могу создать для него ярлык в «Ярлыках», установить его параметр, дать ему имя (например, «время на пляже») и запустить его, сказав Siri это имя - это все, что я не хочу пользователи должны сделать.
Кроме этого, Siri отвечает:
Медитации не добавили поддержку этого с Siri.
… нет Независимо от того, как я формулирую свою просьбу начать Beach Sunset . То, что «не добавил поддержку» звучит мучительно, как будто я просто чего-то упускаю.