Я интегрирую Sirikit, оплату счетов, используя следующие цели:
INPayBillIntentHandling
(который недавно был выпущен в iOS 10.3+, 27 марта 2017 г.).
Документация Apple находится здесь.
Примечание. Я использую язык Obj-C, XCode 8.3, устройство iPhone 6S с iOS 10.3 и демонстрационный проект. Целью развертывания iOS является iOS 10.3. Я также включил Siri при первом запросе разрешения и подтвердил, что In Настройки, Siri включен.
Когда я запускаю приложение на устройстве и говорю «Оплата счетов с помощью DemoApp», Сири отвечает «Хотел бы я, но DemoApp еще не настроил это со мной»
Помогите, пожалуйста. Заранее спасибо!
Пока что я сделал следующие шаги:
1) Создайте демонстрационный проект Xcode
2) В основных возможностях приложения включите Siri.
3) Добавлено расширение Sirikit с использованием
Файл -> Создать -> Добавить цель -> Расширение намерения -> Далее -> Добавить имя продукта и сказать «Готово»
Примечание. Я отключил расширение пользовательского интерфейса Sirikit.
4) В Main AppDelegate добавлено следующее:
#import <Intents/Intents.h>
[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
NSLog(@"Siri Authorization status...%ld", status);
}];
5) В главном приложении Info.plist добавлен ключ NSSiriUsageDescription
с описанием использования
6) В IntentExtension, Info.plist, NSExtension->IntentsSupported->added key INPayBillIntent
7) В IntentHandler.m добавлены все методы делегата для INPayBillIntentHandling
@interface IntentHandler () <INPayBillIntentHandling>
@end
@implementation IntentHandler
- (id)handlerForIntent:(INIntent *)intent {
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return self;
}
- (void)confirmPayBill:(INPayBillIntent *)intent
completion:(void (^)(INPayBillIntentResponse *response))completion NS_SWIFT_NAME(confirm(payBill:completion:)) {
NSLog(@"\n%s", __func__);
INPayBillIntentResponse *response = [[INPayBillIntentResponse alloc] initWithCode:INPayBillIntentResponseCodeSuccess userActivity:nil];
completion(response);
}
- (void)handlePayBill:(INPayBillIntent *)intent
completion:(void (^)(INPayBillIntentResponse *response))completion NS_SWIFT_NAME(handle(payBill:completion:)) {
NSLog(@"\n%s", __func__);
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INPayBillIntent class])];
INPayBillIntentResponse *response = [[INPayBillIntentResponse alloc] initWithCode:INPayBillIntentResponseCodeReady userActivity:userActivity];
completion(response);
}
- (void)resolveBillPayeeForPayBill:(INPayBillIntent *)intent
withCompletion:(void (^)(INBillPayeeResolutionResult *resolutionResult))completion NS_SWIFT_NAME(resolveBillPayee(forPayBill:with:)) {
NSLog(@"\n%s", __func__);
INSpeakableString *speakableStr = [[INSpeakableString alloc] initWithIdentifier:@"XYZ Bill" spokenPhrase:@"XYZ Bill" pronunciationHint:@"XYZ Bill"];
INSpeakableString *speakableStr1 = [[INSpeakableString alloc] initWithIdentifier:@"XYZ Bill Payments" spokenPhrase:@"XYZ Payments" pronunciationHint:@"XYZ Bills"];
INBillPayee *billPayee = [[INBillPayee alloc] initWithNickname:speakableStr number:@"10112122112" organizationName:speakableStr1];
INBillPayeeResolutionResult *finalResult = [INBillPayeeResolutionResult successWithResolvedBillPayee:billPayee];
completion(finalResult);
}
- (void)resolveFromAccountForPayBill:(INPayBillIntent *)intent
withCompletion:(void (^)(INPaymentAccountResolutionResult *resolutionResult))completion NS_SWIFT_NAME(resolveFromAccount(forPayBill:with:)) {
NSLog(@"\n%s", __func__);
INSpeakableString *speakableStr2 = [[INSpeakableString alloc] initWithIdentifier:@"john.smith" spokenPhrase:@"john.smith" pronunciationHint:@"john.smith"];
INSpeakableString *speakableStr3 = [[INSpeakableString alloc] initWithIdentifier:@"" spokenPhrase:@"" pronunciationHint:@"organisation"];
INPaymentAccount *fromAccount = [[INPaymentAccount alloc] initWithNickname:speakableStr2 number:@"10112122112" accountType:INAccountTypeCredit organizationName:speakableStr3];
INPaymentAccountResolutionResult *finalResult = [INPaymentAccountResolutionResult successWithResolvedPaymentAccount:fromAccount];
completion(finalResult);
}
- (void)resolveTransactionAmountForPayBill:(INPayBillIntent *)intent
withCompletion:(void (^)(INPaymentAmountResolutionResult *resolutionResult))completion NS_SWIFT_NAME(resolveTransactionAmount(forPayBill:with:)) {
NSLog(@"\n%s", __func__);
INCurrencyAmount *currencyAmt = [[INCurrencyAmount alloc] initWithAmount:[NSDecimalNumber decimalNumberWithString:@"100"] currencyCode:@"784"];
INPaymentAmount *transactionAmt = [[INPaymentAmount alloc] initWithAmountType:INAmountTypeAmountDue amount:currencyAmt];
INPaymentAmountResolutionResult *finalResult = [INPaymentAmountResolutionResult successWithResolvedPaymentAmount:transactionAmt];
completion(finalResult);
}
- (void)resolveTransactionScheduledDateForPayBill:(INPayBillIntent *)intent
withCompletion:(void (^)(INDateComponentsRangeResolutionResult *resolutionResult))completion NS_SWIFT_NAME(resolveTransactionScheduledDate(forPayBill:with:)) {
completion([INDateComponentsRangeResolutionResult notRequired]);
}
- (void)resolveTransactionNoteForPayBill:(INPayBillIntent *)intent
withCompletion:(void (^)(INStringResolutionResult *resolutionResult))completion NS_SWIFT_NAME(resolveTransactionNote(forPayBill:with:)) {
NSLog(@"\n%s", __func__);
INStringResolutionResult *finalResult = [INStringResolutionResult successWithResolvedString:@"Bill Payment"];
completion(finalResult);
}
- (void)resolveBillTypeForPayBill:(INPayBillIntent *)intent
withCompletion:(void (^)(INBillTypeResolutionResult *resolutionResult))completion NS_SWIFT_NAME(resolveBillType(forPayBill:with:)) {
NSLog(@"\n%s", __func__);
INBillTypeResolutionResult *finalResult = [INBillTypeResolutionResult successWithResolvedValue:INBillTypeElectricity];
completion(finalResult);
}
- (void)resolveDueDateForPayBill:(INPayBillIntent *)intent
withCompletion:(void (^)(INDateComponentsRangeResolutionResult *resolutionResult))completion NS_SWIFT_NAME(resolveDueDate(forPayBill:with:)) {
NSLog(@"%s", __func__);
completion([INDateComponentsRangeResolutionResult notRequired]);
}