As we know that xcode 8 is ingrates with all new features. I started working on the siri kit apps. Taking concept of Ride booking. I followed all the steps and completed coding part. Unfortunately i'm unable to run app in siri. Please correct me what i miss or what change should i do to proceed further.
Process followed :-
Added new targets with intents along with UI option enabled.
Added " NSSiriUsageDescription " in project info plist.
Adding Ride Booking Intents in the info plist of intent handler
Custom designed Intent layout with buttons and map.
Error Receiving while running the app :-
Sorry, name, somethings gone wrong. can you try that again ?
Thanks in advance for helping me out. please post any example or how to work with ride booking ?
I am also doing the same thing as you are doing. But I resolved my issues and here I share my code:
Step 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
}
}
Step 2: Create a plist file which will store all your intents and vocabulary in Main project (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>
Step 3: In your IntentHandler class, extend your class by INRequestRideIntentHandling, INGetRideStatusIntentHandling, INListRideOptionsIntentHandling delegates.
Stpe 4: Add handle method for handling your ride request:
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) {
}
Step 5: Add INRequestRideIntent in NSExtension in Info.plist in both Intent extensions.
Step 6: First build & run app in your device and run your extension in your device.
If it returns an error like you are describing then just add CoreLocation.framework in your project and run the app again.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With