Концепция RideBooking с использованием sirikit xcode 8

ios iphone xcode8 ios10 sirikit

928 просмотра

1 ответ

257 Репутация автора

Как мы знаем, xcode 8 включает все новые функции. Я начал работать над приложениями siri kit. Принимая концепцию поездки Ride. Я выполнил все шаги и завершил часть кодирования. К сожалению, я не могу запустить приложение в Сири. Пожалуйста, исправьте меня, что я пропустил или какие изменения я должен сделать, чтобы продолжить.

Процесс последовал: -

  1. Добавлены новые цели с намерениями вместе с включенной опцией пользовательского интерфейса.

  2. Добавлено "NSSiriUsageDescription" в информационном листе проекта.

  3. Добавление Intain Booking Intents в информационный список обработчика намерений

  4. Индивидуально разработанная схема Intent с кнопками и картой.

Ошибка получения при запуске приложения: -

Извините, имя, что-то пошло не так. ты можешь попробовать это снова?

Заранее спасибо за помощь. Выложите, пожалуйста, пример или как работать с бронированием поездки?

Автор: Samurai Warrior Источник Размещён: 18.07.2016 06:47

Ответы (1)


1 плюс

1434 Репутация автора

Я также делаю то же самое, что и вы. Но я решил свои проблемы и здесь я делюсь своим кодом:

Шаг 1: AppDelegate:

INPreferences.requestSiriAuthorization {
        switch $0 {
        case .authorized:
            print("authorized")
            break

        case .notDetermined:
            print("notDetermined")
            break

        case .restricted:
            print("restricted")
            break

        case .denied:
            print("denied")
            break
        }
    }

Шаг 2: Создайте plistфайл, который будет хранить все ваши намерения и словарь в главном проекте (AppIntentVocabulary.plist):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ParameterVocabularies</key>
<array>
    <dict>
        <key>ParameterNames</key>
        <array>
            <string>INRequestRideIntent.SlideToOpen</string>
        </array>
        <key>ParameterVocabulary</key>
        <array>
            <dict>
                <key>VocabularyItemIdentifier</key>
                <string>slide_to_open</string>
                <key>VocabularyItemSynonyms</key>
                <array>
                    <dict>
                        <key>VocabularyItemExamples</key>
                        <array>
                            <string>Book ride in MyApp</string>
                        </array>
                    </dict>
                </array>
            </dict>
        </array>
    </dict>
</array>
<key>IntentPhrases</key>
<array>
    <dict>
        <key>IntentName</key>
        <string>INRequestRideIntent</string>
        <key>IntentExamples</key>
        <array>
            <string>Book smart parking</string>
            <string>Get ETA Way</string>
            <string>Go Online in Way</string>
            <string>Book ride in Way</string>
            <string>Book table in way</string>
        </array>
    </dict>
</array>

Шаг 3: В вашем классе IntentHandler расширьте свой класс делегатами INRequestRideIntentHandling, INGetRideStatusIntentHandling, INListRideOptionsIntentHandling.

Stpe 4: Добавьте метод handle для обработки вашего запроса на поездку:

func handle(requestRide intent: INRequestRideIntent, completion: @escaping (INRequestRideIntentResponse) -> Void) {
}

func handle(getRideStatus intent: INGetRideStatusIntent, completion: @escaping (INGetRideStatusIntentResponse) -> Void) {

}

func handle(listRideOptions intent: INListRideOptionsIntent, completion: @escaping (INListRideOptionsIntentResponse) -> Void) {
    let response = INListRideOptionsIntentResponse(code: .success, userActivity: nil)
    let smallCarOption = INRideOption(name: "Small Car", estimatedPickupDate: Date(timeIntervalSinceNow: 3 * 60)) // You must provide a name and estimated pickup date.

    smallCarOption.priceRange = INPriceRange(firstPrice: NSDecimalNumber(string: "5.60") , secondPrice: NSDecimalNumber(string: "10.78"), currencyCode: "USD") // There are different ways to define a price range and depending on which initializer you use, Maps may change the formatting of the price.

    smallCarOption.disclaimerMessage = "This is a very small car, tall passengers may not fit." // A message that is specific to this ride option.
    smallCarOption.availablePartySizeOptions =  [
        INRidePartySizeOption(partySizeRange: NSRange(location: 0, length: 1), sizeDescription: "One person", priceRange: nil),
        INRidePartySizeOption(partySizeRange: NSRange(location: 0, length: 2), sizeDescription: "Two people", priceRange: INPriceRange(firstPrice: NSDecimalNumber(string: "6.60") , secondPrice: NSDecimalNumber(string: "11.78"), currencyCode: "USD"))
    ]
    smallCarOption.availablePartySizeOptionsSelectionPrompt = "Choose a party size"
    smallCarOption.specialPricing = "High demand. 50% extra will be added to your fare."
    smallCarOption.specialPricingBadgeImage = INImage(named: "specialPricingBadge")
    let base = INRideFareLineItem(title: "Base fare", price: NSDecimalNumber(string: "4.76"), currencyCode: "USD" )!
    let airport = INRideFareLineItem(title: "Airport fee", price: NSDecimalNumber(string: "3.00"), currencyCode: "USD" )!
    let discount = INRideFareLineItem(title: "Promo code (3fs8sdx)", price: NSDecimalNumber(string: "-4.00"), currencyCode: "USD" )!
    smallCarOption.fareLineItems = [ base, airport, discount ]
    smallCarOption.userActivityForBookingInApplication = NSUserActivity(activityType: "bookInApp");

    response.rideOptions = [ smallCarOption ]
    let paymentMethod = INPaymentMethod(type: .credit, name: "Visa Platinum", identificationHint: "•••• •••• •••• 1234", icon: INImage(named: "creditCardImage"))
    let applePay = INPaymentMethod.applePay()  // If you support Pay and the user has an Pay payment method set in your parent app
    response.paymentMethods = [ paymentMethod, applePay ]
    response.expirationDate = Date(timeIntervalSinceNow: 5 * 60)
}

func confirm(requestRide intent: INRequestRideIntent, completion: @escaping (INRequestRideIntentResponse) -> Void) {
    let rideOption = INRideOption(name: "Small car", estimatedPickupDate: Date(timeIntervalSinceNow: 5 * 60))

    let rideStatus = INRideStatus()
    rideStatus.rideOption = rideOption
    rideStatus.estimatedPickupDate = Date(timeIntervalSinceNow: 5 * 60)
    rideStatus.rideIdentifier = NSUUID().uuidString

    let response = INRequestRideIntentResponse(code: .success, userActivity: nil)
    response.rideStatus = rideStatus

    completion(response)

}

func startSendingUpdates(forGetRideStatus intent: INGetRideStatusIntent, to observer: INGetRideStatusIntentResponseObserver) {
}

func stopSendingUpdates(forGetRideStatus intent: INGetRideStatusIntent) {
}

Шаг 5: Добавьте INRequestRideIntent в NSExtension в Info.plist в обоих расширениях Intent.

Шаг 6: Сначала соберите и запустите приложение на своем устройстве и запустите расширение на своем устройстве.

Если он возвращает ошибку, которую вы описываете, просто добавьте CoreLocation.framework в ваш проект и снова запустите приложение.

Автор: Pratik Patel Размещён: 22.09.2016 10:39
Вопросы из категории :
32x32