SiriKit INPayBillIntentHandling - Siri говорит, что я бы хотел, но ‹App› еще не настроил это со мной.

Я интегрирую 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]);
}

person Imad Ali    schedule 28.03.2017    source источник
comment
Вы нашли решение?   -  person João Nunes    schedule 05.07.2017
comment
[INPreferences requestSiriAuthorization: ^ (INSiriAuthorizationStatus status) {NSLog (@Siri Authorization status ...% ld, status); }]; Разрешена ли эта печать?   -  person Cherry_thia    schedule 12.08.2017
comment
@Cherry_thia Да, это напечатано.   -  person Imad Ali    schedule 12.08.2017


Ответы (3)


Я нашел проблему, и она находится в следующей строке:

INCurrencyAmount *currencyAmt = [[INCurrencyAmount alloc] initWithAmount:[NSDecimalNumber decimalNumberWithString:@"100"] currencyCode:@"784"];

to

INCurrencyAmount *currencyAmt = [[INCurrencyAmount alloc] initWithAmount:[NSDecimalNumber decimalNumberWithString:@"100"] currencyCode:@"USD"]; 

Swift 3.0

let currencyAmmount = INCurrencyAmount(amount: NSDecimalNumber(string: "100"), currencyCode: "USD")

Вы используете неправильный формат валюты, из-за чего Siri выдает это сообщение.

person Michael Ortiz    schedule 03.04.2017
comment
Я не понимаю этого решения. Как это решит проблему? - person João Nunes; 05.07.2017
comment
Взгляните на следующие строки кода выше: currencyCode: @ 784]; Код валюты неверный, он должен быть currencyCode: @USD]; 784 - это не код валюты. - person Michael Ortiz; 08.07.2017
comment
да, но это исправление не решает вопрос OP - person João Nunes; 09.07.2017

Попробуйте на бета-версии iOS 11. Я пытаюсь использовать Swift на iOS 11 beta 5, он намного стабильнее.

person Cherry_thia    schedule 12.08.2017

Убедитесь, что функция обработчика (для намерения: INIntent), информация о приложении и список расширений намерений имеют правильные поддерживаемые намерения.

person rockdaswift    schedule 22.05.2018