iosswiftiphonesirisirikit

Internationalisation issue with Sirikit Custom Intents & iOS 13.4.1


I implemented two Custom Intents with Sirikit in my iOS app. When I was developing them I had iOS 13.3 installed in my iphone and one of my intents has a Siri Dialog prompt asking for the value of one parameter. All the app is translated to english and spanish and the custom intent worked nicely in both languages.

When I updated my iphone to iOS 13.4.1 my custom intent started to have the following issues (I saw both issues depending on the installation/test/device):

I find this issue very strange and annoying. I tried to recreate the translation files for Intent.intentdefinition: Intent.strings (Base), Intent.strings (English), Intent.strings (Spanish) and I even tried to recreate the whole Custom Intent definition and I'm still having the issue.

I also tried to change the iOS language and Siri language on my phone, restart, reinstall the app, intents, etc...

This is the Info.plist of my Sirikit extension:

<?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>CFBundleDevelopmentRegion</key>  
  <string>$(DEVELOPMENT_LANGUAGE)</string>  
  <key>CFBundleDisplayName</key>  
  <string>InventorySearchIntent</string>  
  <key>CFBundleExecutable</key>  
  <string>$(EXECUTABLE_NAME)</string>  
  <key>CFBundleIdentifier</key>  
  <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>  
  <key>CFBundleInfoDictionaryVersion</key>  
  <string>6.0</string>  
  <key>CFBundleName</key>  
  <string>$(PRODUCT_NAME)</string>  
  <key>CFBundlePackageType</key>  
  <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>  
  <key>CFBundleShortVersionString</key>  
  <string>$(MARKETING_VERSION)</string>  
  <key>CFBundleVersion</key>  
  <string>$(CURRENT_PROJECT_VERSION)</string>  
  <key>NSExtension</key>  
  <dict>  
  <key>NSExtensionAttributes</key>  
  <dict>  
  <key>IntentsRestrictedWhileLocked</key>  
  <array/>  
  <key>IntentsRestrictedWhileProtectedDataUnavailable</key>  
  <array/>  
  <key>IntentsSupported</key>  
  <array>  
  <string>NumTotalItemsIntent</string>  
  <string>SearchItemIntent</string>  
  </array>  
  </dict>  
  <key>NSExtensionPointIdentifier</key>  
  <string>com.apple.intents-service</string>  
  <key>NSExtensionPrincipalClass</key>  
  <string>$(PRODUCT_MODULE_NAME).IntentHandler</string>  
  </dict>  
</dict>  
</plist>  

Any solution for this? Is it a bug from iOS 13.4? Siri integration is very important for the app that I'm developing and this is a blocker for me.

Thanks in advance!


Solution

  • In my own experience, this issue is fixed in iOS 13.5 beta 4. I just tested it in an iPhone 6s Plus with Xcode 11.5 beta 2 (11N605f).

    However, there are other issues still. For example, in Shortcuts, all operation strings in my test project are shown in English, not the localized language.

    Also, INStringResolutionResult.confirmationRequired(with:) doesn't work as expected.

    I have a function gets the words user says and looks them up in database then uses INStringResolutionResult.confirmationRequired(with:) to check with the user. SiriKit currently only uses the words the user says, not the result that I check with the user, which leads the final code crashes.

    UPDATES

    I just got the reply from Apple's bug report team. Here are the conclusions I make for now.

    1. When switching languages, Siri some times, if not all the times, has an issue of using the default sentences to replace the sentences that a developer provides.
    2. Installing Siri profile and reboot may fixed above issue on Siri of current setting. But if you change the language of Siri, the issue is still there.
    3. There were regressions on APIs of INStringResolutionResult. For single result, both open class func disambiguation(with stringsToDisambiguate: [String]) -> Self and open class func confirmationRequired(with stringToConfirm: String?) -> Self wouldn't work on iOS later than iOS 13.3. Siri used a placeholder called "name" instead of the actual value.