├── .gitignore ├── Default-568h@2x.png ├── LICENSE ├── Podfile ├── README.md ├── iosapp ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-57x57@1x.png │ │ ├── Icon-App-57x57@2x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ ├── Contents.json │ ├── Default-568h.imageset │ │ ├── Contents.json │ │ └── Default-568h@2x.png │ ├── avatar_small.imageset │ │ ├── Contents.json │ │ ├── avatar.png │ │ ├── avatar@2x.png │ │ └── avatar@3x.png │ ├── conversation_image.dataset │ │ ├── Contents.json │ │ └── conversation_image.svg │ └── watson_avatar.imageset │ │ ├── Contents.json │ │ ├── watsonCopy4.png │ │ ├── watsonCopy4@2x.png │ │ └── watsonCopy4@3x.png ├── AssistantError.swift ├── AssistantMessages.swift ├── BMSCredentials.plist ├── Base.lproj │ └── Main.storyboard ├── Info.plist ├── ViewController.swift └── training │ └── car_training.json ├── iosappTests ├── Info.plist └── iosappTests.swift ├── iosappUITests ├── Info.plist └── iosappUITests.swift └── iosvirtualassistantapp.xcodeproj ├── .xcodesamplecode.plist └── project.pbxproj /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X Finder 2 | .DS_Store 3 | 4 | # Xcode per-user config 5 | *.mode1 6 | *.mode1v3 7 | *.mode2v3 8 | *.perspective 9 | *.perspectivev3 10 | *.pbxuser 11 | *.xcworkspace 12 | xcuserdata 13 | 14 | # CocoaPods 15 | Pods/ 16 | 17 | # Build products 18 | build/ 19 | *.o 20 | *.LinkFileList 21 | *.hmap 22 | 23 | # Automatic backup files 24 | *~.nib/ 25 | *.swp 26 | *~ 27 | *.dat 28 | *.dep 29 | 30 | # IBM Cloud Mobile Services 31 | iosapp-Swift/iosapp/BMSCredentials.plist 32 | ios_swift/iosapp/BMSCredentials.plist 33 | -------------------------------------------------------------------------------- /Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/Default-568h@2x.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 IBM Corporation 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '10.0' 2 | 3 | target 'iosvirtualassistantapp' do 4 | pod 'BMSCore', '~> 2.6.0' 5 | 6 | 7 | # Comment this line if you're not using Swift and don't want to use dynamic frameworks 8 | 9 | use_frameworks! 10 | 11 | pod 'MessageKit', '~> 0.13' 12 | pod 'IBMWatsonAssistantV1', '~> 3.5.0' 13 | pod 'NVActivityIndicatorView', '~> 4.8.0' 14 | 15 | post_install do |installer| 16 | installer.pods_project.targets.each do |target| 17 | if ['SwiftCloudant'].include? target.name 18 | target.build_configurations.each do |config| 19 | config.build_settings['SWIFT_VERSION'] = '3.2' 20 | end 21 | end 22 | end 23 | end 24 | # Pods for iosapp 25 | target 'iosvirtualassistantappTests' do 26 | inherit! :search_paths 27 | # Pods for testing 28 | end 29 | 30 | target 'iosvirtualassistantappUITests' do 31 | inherit! :search_paths 32 | # Pods for testing 33 | end 34 | 35 | end 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WARNING: This repository is no longer maintained :warning: 2 | 3 | > This repository will not be updated. The repository will be kept available in read-only mode. 4 | 5 | ## Create a virtual assistant for iOS using Watson Assistant 6 | 7 | [![](https://img.shields.io/badge/IBM%20Cloud-powered-blue.svg)](https://cloud.ibm.com) 8 | [![Platform](https://img.shields.io/badge/platform-ios_swift-lightgrey.svg?style=flat)](https://developer.apple.com/swift/) 9 | 10 | ### Table of Contents 11 | 12 | * [Summary](#summary) 13 | * [Flow](#flow) 14 | * [Components](#included-components) 15 | * [Technologies](#featured-technologies) 16 | * [Requirements](#requirements) 17 | * [Steps](#steps) 18 | * [Sample Output](#sample-output) 19 | * [License](#license) 20 | * [Links](#links) 21 | * [Learn more](#learn-more) 22 | 23 | ### Summary 24 | 25 | This IBM Cloud Starter Kit will showcase the Watson Assistant service on iOS. We'll walk through setting up Xcode, installing dependencies, and running the application. 26 | 27 | By running this code, you'll understand how to: 28 | 29 | * Interact with the Watson Assistant service 30 | * Use the Watson Swift SDK 31 | * Integrate Watson Assistant and Swift to create a virtual assistant 32 | 33 | ![](https://raw.githubusercontent.com/IBM/pattern-utils/master/virtual-assistant-for-ios/architecture.png) 34 | 35 | ## Flow 36 | 37 | 1. The user enters a message with an iOS device. 38 | 2. The message is sent to the IBM Watson Assistant service, the sent message is displayed on the iOS device. 39 | 3. Watson Assistant responds and sends a message back to be displayed on the iOS device. 40 | 41 | ## Included Components 42 | 43 | * [IBM Watson Assistant](https://www.ibm.com/watson/developercloud/assistant.html): Build, test and deploy a bot or virtual agent across mobile devices, messaging platforms, or even on a physical robot. 44 | 45 | ## Featured technologies 46 | 47 | * [Swift](https://www.ibm.com/cloud/swift): Swift is a general-purpose, multi-paradigm, compiled programming language developed by Apple Inc. for iOS, macOS, watchOS, tvOS, and Linux. 48 | 49 | ## Requirements 50 | 51 | * iOS 10.0+ 52 | * Xcode 10+ 53 | * Swift 5+ 54 | * [CocoaPods](https://cocoapods.org/) 55 | * If not installed, run: `sudo gem install cocoapods` 56 | 57 | ## Steps 58 | 59 | 1. [Use CocoaPods to create an Xcode workspace](#1-use-cocoapods-to-create-an-xcode-workspace) 60 | 2. [Configure Watson Assistant](#3-configure-watson-assistant) 61 | 62 | ### 1. Use CocoaPods to create an Xcode workspace 63 | 64 | For this starter, a pre-configured `Podfile` has been provided, which includes the [Watson SDK](https://github.com/watson-developer-cloud/swift-sdk). To download and install the required dependencies, run the following command in your project directory: 65 | 66 | ```bash 67 | $ cd {APP_Name} 68 | $ pod install 69 | ``` 70 | 71 | > NOTE: If the CocoaPods repository was not configured, we'd have to run `pod setup` first. 72 | 73 | Now open the Xcode workspace to see what the project looks like. We can also use Xcode to run the application with Xcode's simulator, which we'll do in a few steps. 74 | 75 | ```bash 76 | $ open {APP_Name}.xcworkspace 77 | ``` 78 | 79 | > NOTE: If you run into any issues during the pod install, it is recommended to run a pod update by running: `pod update; pod install` 80 | 81 | 82 | ### 2. Configure Watson Assistant 83 | 84 | Ensure you have a running Watson Assistant service, if you do not, create one by going to the link below: 85 | 86 | * [**Watson Assistant**](https://cloud.ibm.com/catalog/services/assistant) 87 | 88 | Every chatbot needs a dialog, right? To make things easier we've coded this application to look at the available conversations for a specified Watson Assistant service and use the first workspace it finds. 89 | 90 | To easily obtain a conversation dialog we can simply launch the Watson Assistant Tool and view the sample conversation that is provided by Watson Assistant. This is enough to get your application running locally. 91 | 92 | #### (Optional) 2.1 Specify your own assistant 93 | 94 | If you prefer to specify your own conversation you can import or create a new dialog with the Watson Assistant Tool. To do that, follow the [documentation online](https://cloud.ibm.com/docs/services/assistant/dialog-build.html). Once created we need to find the workspace ID. See the image below as a guide to finding the workspace ID. 95 | 96 | ![](https://raw.githubusercontent.com/IBM/pattern-utils/master/watson-assistant/assistant-workspace-id.gif) 97 | 98 | Once we have the workspace ID we'll need to let our application know about it. We need to update `BMSCredentials.plist` by adding a `workspaceID` entry, like below: 99 | 100 | ![](https://raw.githubusercontent.com/IBM/pattern-utils/master/virtual-assistant-for-ios/workspaceID.png) 101 | 102 | ## Sample Output 103 | 104 | You can now run the application on a simulator or physical device. Try a few queries for yourself: 105 | 106 | * _Where are you located?_ 107 | * _What are your hours?_ 108 | * _I'd like to book an appointment?_ 109 | 110 | > A quick snapshot of a conversation. 111 | 112 | ![](https://raw.githubusercontent.com/IBM/pattern-utils/master/virtual-assistant-for-ios/output11.png) 113 | 114 | > A full walkthrough of a sample conversation. 115 | 116 | ![](https://raw.githubusercontent.com/IBM/pattern-utils/master/virtual-assistant-for-ios/output.gif) 117 | 118 | # License 119 | 120 | [Apache 2.0](LICENSE) 121 | 122 | # Links 123 | 124 | * [Swift Programming Guide](https://cloud.ibm.com/docs/swift/index.html#set_up): Tutorial on Swift app development. 125 | * [Add a Service to Your App](https://cloud.ibm.com/docs/apps/reqnsi.html#add_service): Learn how to add a resource to your cloud-native app. 126 | 127 | ## Learn More 128 | 129 | * [Other Starter Kits](https://cloud.ibm.com/developer/appservice/starter-kits/): Enjoyed this Starter Kit? Check out our other Starter Kits. 130 | * [Architecture Center](https://cloud.ibm.com/cloud/garage/architectures): Explore Architectures that provide flexible infrastructure solutions. 131 | * [IBM Watson Assistant Docs](https://cloud.ibm.com/docs/services/assistant/getting-started.html#gettingstarted) 132 | -------------------------------------------------------------------------------- /iosapp/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright IBM Corporation 2018 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | **/ 16 | 17 | import UIKit 18 | import BMSCore 19 | 20 | 21 | 22 | 23 | 24 | @UIApplicationMain 25 | class AppDelegate: UIResponder, UIApplicationDelegate { 26 | 27 | var window: UIWindow? 28 | 29 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 30 | 31 | let myBMSClient = BMSClient.sharedInstance 32 | myBMSClient.initialize(bluemixRegion: BMSClient.Region.usSouth) 33 | myBMSClient.requestTimeout = 10.0 // seconds 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | return true 42 | } 43 | 44 | 45 | 46 | 47 | func applicationWillResignActive(_ application: UIApplication) { 48 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 49 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 50 | } 51 | 52 | func applicationDidEnterBackground(_ application: UIApplication) { 53 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 54 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 55 | } 56 | 57 | func applicationWillEnterForeground(_ application: UIApplication) { 58 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 59 | } 60 | 61 | func applicationDidBecomeActive(_ application: UIApplication) { 62 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 63 | } 64 | 65 | func applicationWillTerminate(_ application: UIApplication) { 66 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 67 | } 68 | 69 | } 70 | 71 | 72 | -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "57x57", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-57x57@1x.png", 49 | "scale" : "1x" 50 | }, 51 | { 52 | "size" : "57x57", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-57x57@2x.png", 55 | "scale" : "2x" 56 | }, 57 | { 58 | "size" : "60x60", 59 | "idiom" : "iphone", 60 | "filename" : "Icon-App-60x60@2x.png", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "size" : "60x60", 65 | "idiom" : "iphone", 66 | "filename" : "Icon-App-60x60@3x.png", 67 | "scale" : "3x" 68 | }, 69 | { 70 | "size" : "20x20", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-20x20@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "20x20", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-20x20@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "29x29", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-29x29@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "29x29", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-29x29@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "40x40", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-40x40@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "40x40", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-40x40@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "76x76", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-76x76@1x.png", 109 | "scale" : "1x" 110 | }, 111 | { 112 | "size" : "76x76", 113 | "idiom" : "ipad", 114 | "filename" : "Icon-App-76x76@2x.png", 115 | "scale" : "2x" 116 | }, 117 | { 118 | "size" : "83.5x83.5", 119 | "idiom" : "ipad", 120 | "filename" : "Icon-App-83.5x83.5@2x.png", 121 | "scale" : "2x" 122 | }, 123 | { 124 | "idiom" : "ios-marketing", 125 | "size" : "1024x1024", 126 | "scale" : "1x" 127 | } 128 | ], 129 | "info" : { 130 | "version" : 1, 131 | "author" : "xcode" 132 | } 133 | } -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/Default-568h.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Default-568h@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/Default-568h.imageset/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/Default-568h.imageset/Default-568h@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/avatar_small.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "avatar.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "avatar@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "avatar@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/avatar_small.imageset/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/avatar_small.imageset/avatar.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/avatar_small.imageset/avatar@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/avatar_small.imageset/avatar@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/avatar_small.imageset/avatar@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/avatar_small.imageset/avatar@3x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/conversation_image.dataset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "data" : [ 7 | { 8 | "idiom" : "universal", 9 | "filename" : "conversation_image.svg" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/conversation_image.dataset/conversation_image.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/watson_avatar.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "watsonCopy4.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "watsonCopy4@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "watsonCopy4@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/watson_avatar.imageset/watsonCopy4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/watson_avatar.imageset/watsonCopy4.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/watson_avatar.imageset/watsonCopy4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/watson_avatar.imageset/watsonCopy4@2x.png -------------------------------------------------------------------------------- /iosapp/Assets.xcassets/watson_avatar.imageset/watsonCopy4@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IBM/ios-virtual-assistant-app/88b3fc4f0e85325dc09fe8b1966e1e0561d95242/iosapp/Assets.xcassets/watson_avatar.imageset/watsonCopy4@3x.png -------------------------------------------------------------------------------- /iosapp/AssistantError.swift: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright IBM Corporation 2018 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | **/ 16 | 17 | import Foundation 18 | 19 | // Custom error set 20 | enum AssistantError: Error, CustomStringConvertible { 21 | 22 | case invalidCredentials 23 | 24 | case missingCredentialsPlist 25 | 26 | case missingAssistantCredentials 27 | 28 | case noWorkspacesAvailable 29 | 30 | case noData 31 | 32 | case error(String) 33 | 34 | case noWorkspaceId 35 | 36 | var alertTitle: String { 37 | switch self { 38 | case .invalidCredentials: return "Invalid Credentials" 39 | case .missingCredentialsPlist: return "Missing BMSCredentials.plist" 40 | case .missingAssistantCredentials: return "Missing Watson Assistant Credentials" 41 | case .noWorkspacesAvailable: return "No Workspaces Available" 42 | case .noWorkspaceId: return "No Workspaces Id Provided" 43 | case .noData: return "Bad Response" 44 | case .error: return "An Error Occurred" 45 | } 46 | } 47 | 48 | var alertMessage: String { 49 | switch self { 50 | case .invalidCredentials: return "The provided credentials are invalid." 51 | case .missingCredentialsPlist: return "Make sure to follow the steps in the README to create the credentials file." 52 | case .missingAssistantCredentials: return "Make sure to follow the steps in the README to create the credentials file." 53 | case .noWorkspacesAvailable: return "Be sure to set up a Watson Assistant workspace from the IBM Cloud dashboard." 54 | case .noWorkspaceId: return "Be sure to set up a Watson Assistant workspace from the IBM Cloud dashboard." 55 | case .noData: return "No Watson Assistant data was received." 56 | case .error(let msg): return msg 57 | } 58 | } 59 | 60 | var description: String { 61 | return self.alertTitle + ": " + self.alertMessage 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /iosapp/AssistantMessages.swift: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright IBM Corporation 2018 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | **/ 16 | 17 | import Foundation 18 | import MessageKit 19 | import CoreLocation 20 | 21 | struct AssistantMessages: MessageType { 22 | 23 | var messageId: String 24 | var sender: Sender 25 | var sentDate: Date 26 | var data: MessageData 27 | 28 | init(data: MessageData, sender: Sender, messageId: String, date: Date) { 29 | self.data = data 30 | self.sender = sender 31 | self.messageId = messageId 32 | self.sentDate = date 33 | } 34 | 35 | init(text: String, sender: Sender, messageId: String, date: Date) { 36 | self.init(data: .text(text), sender: sender, messageId: messageId, date: date) 37 | } 38 | 39 | init(attributedText: NSAttributedString, sender: Sender, messageId: String, date: Date) { 40 | self.init(data: .attributedText(attributedText), sender: sender, messageId: messageId, date: date) 41 | } 42 | 43 | init(image: UIImage, sender: Sender, messageId: String, date: Date) { 44 | self.init(data: .photo(image), sender: sender, messageId: messageId, date: date) 45 | } 46 | 47 | init(thumbnail: UIImage, sender: Sender, messageId: String, date: Date) { 48 | let url = URL(fileURLWithPath: "") 49 | self.init(data: .video(file: url, thumbnail: thumbnail), sender: sender, messageId: messageId, date: date) 50 | } 51 | 52 | init(location: CLLocation, sender: Sender, messageId: String, date: Date) { 53 | self.init(data: .location(location), sender: sender, messageId: messageId, date: date) 54 | } 55 | 56 | init(emoji: String, sender: Sender, messageId: String, date: Date) { 57 | self.init(data: .emoji(emoji), sender: sender, messageId: messageId, date: date) 58 | } 59 | 60 | } 61 | 62 | extension Sender { 63 | var initials: String { 64 | return self.displayName.split(separator: " ").reduce("") { return $0 + String(describing: $1.first)} 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /iosapp/BMSCredentials.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | conversation 6 | 7 | apikey 8 | REPLACEME.conversationServiceName.apikey 9 | url 10 | REPLACEME.conversationServiceName.url 11 | 12 | workspaceID 13 | REPLACEME.workspaceID 14 | appName 15 | iosvirtualassistantapp 16 | 17 | 18 | -------------------------------------------------------------------------------- /iosapp/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /iosapp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | iosvirtualassistantapp 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleURLTypes 24 | 25 | 26 | CFBundleTypeRole 27 | Editor 28 | CFBundleURLName 29 | $(PRODUCT_BUNDLE_IDENTIFIER) 30 | CFBundleURLSchemes 31 | 32 | $(PRODUCT_BUNDLE_IDENTIFIER) 33 | 34 | 35 | 36 | CFBundleVersion 37 | 1 38 | LSRequiresIPhoneOS 39 | 40 | NSAppTransportSecurity 41 | 42 | NSExceptionDomains 43 | 44 | watsonplatform.net 45 | 46 | NSIncludesSubdomains 47 | 48 | NSTemporaryExceptionAllowsInsecureHTTPLoads 49 | 50 | NSTemporaryExceptionMinimumTLSVersion 51 | TLSv1.0 52 | NSTemporaryExceptionRequiresForwardSecrecy 53 | 54 | 55 | 56 | 57 | NSCameraUsageDescription 58 | This application uses the camera to allow Watson to analyze photos using Visual Recognition 59 | NSPhotoLibraryUsageDescription 60 | This application uses photos in the Photo Library to allow Watson to analyze them using Visual Recognition 61 | UILaunchStoryboardName 62 | LaunchScreen 63 | UIMainStoryboardFile 64 | Main 65 | UIRequiredDeviceCapabilities 66 | 67 | armv7 68 | 69 | UISupportedInterfaceOrientations 70 | 71 | UIInterfaceOrientationPortrait 72 | 73 | UISupportedInterfaceOrientations~ipad 74 | 75 | UIInterfaceOrientationPortrait 76 | UIInterfaceOrientationPortraitUpsideDown 77 | UIInterfaceOrientationLandscapeLeft 78 | UIInterfaceOrientationLandscapeRight 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /iosapp/ViewController.swift: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright IBM Corporation 2018 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | **/ 16 | 17 | import UIKit 18 | import NVActivityIndicatorView 19 | import Assistant 20 | import MessageKit 21 | import MapKit 22 | import BMSCore 23 | 24 | class ViewController: MessagesViewController, NVActivityIndicatorViewable { 25 | 26 | fileprivate let kCollectionViewCellHeight: CGFloat = 12.5 27 | 28 | // Messages State 29 | var messageList: [AssistantMessages] = [] 30 | 31 | var now = Date() 32 | 33 | // Conersation SDK 34 | var assistant: Assistant? 35 | var context: Context? 36 | 37 | // Watson Assistant Workspace 38 | var workspaceID: String? 39 | 40 | // Users 41 | var current = Sender(id: "123456", displayName: "Ginni") 42 | let watson = Sender(id: "654321", displayName: "Watson") 43 | 44 | 45 | 46 | // UIButton to initiate login 47 | @IBOutlet weak var logoutButton: UIButton! 48 | 49 | override func viewDidLoad() { 50 | 51 | super.viewDidLoad() 52 | 53 | // Instantiate Assistant Instance 54 | self.instantiateAssistant() 55 | 56 | // Instantiate activity indicator 57 | self.instantiateActivityIndicator() 58 | 59 | // Registers data sources and delegates + setup views 60 | self.setupMessagesKit() 61 | 62 | // Register observer 63 | NotificationCenter.default.addObserver(self, 64 | selector: #selector(didBecomeActive), 65 | name: Notification.Name("didBecomeActiveNotification"), 66 | object: nil) 67 | 68 | 69 | 70 | 71 | 72 | } 73 | 74 | override func viewDidAppear(_ animated: Bool) { 75 | super.viewDidAppear(animated) 76 | } 77 | 78 | override func didReceiveMemoryWarning() { 79 | super.didReceiveMemoryWarning() 80 | // Dispose of any resources that can be recreated. 81 | } 82 | 83 | @objc func didBecomeActive(_ notification: Notification) { 84 | 85 | 86 | } 87 | 88 | // MARK: - Setup Methods 89 | 90 | // Method to instantiate assistant service 91 | func instantiateAssistant() { 92 | 93 | // Start activity indicator 94 | startAnimating( message: "Connecting to Watson", type: NVActivityIndicatorType.ballScaleRipple) 95 | 96 | // Create a configuration path for the BMSCredentials.plist file then read in the Watson credentials 97 | // from the plist configuration dictionary 98 | guard let configurationPath = Bundle.main.path(forResource: "BMSCredentials", ofType: "plist"), 99 | let configuration = NSDictionary(contentsOfFile: configurationPath) else { 100 | 101 | showAlert(.missingCredentialsPlist) 102 | return 103 | } 104 | 105 | // API Version Date to initialize the Assistant API 106 | let date = "2018-02-01" 107 | 108 | // Set the Watson credentials for Assistant service from the BMSCredentials.plist 109 | // If using IAM authentication 110 | if let apikey = (configuration["conversation"] as? NSDictionary)?["apikey"] as? String, 111 | let url = (configuration["conversation"] as? NSDictionary)?["url"] as? String { 112 | 113 | // Initialize Watson Assistant object 114 | let authenticator = WatsonIAMAuthenticator(apiKey: apikey) 115 | let assistant = Assistant(version: date, authenticator: authenticator) 116 | 117 | // Set the URL for the Assistant Service 118 | assistant.serviceURL = url 119 | 120 | self.assistant = assistant 121 | 122 | } else { 123 | showAlert(.missingAssistantCredentials) 124 | } 125 | 126 | // Lets Handle the Workspace creation or selection from here. 127 | // If a workspace is found in the plist then use that WorkspaceID that is provided , otherwise 128 | // look up one from the service directly, Watson provides a sample so this should work directly 129 | if let workspaceID = configuration["workspaceID"] as? String { 130 | 131 | print("Workspace ID:", workspaceID) 132 | 133 | // Set the workspace ID Globally 134 | self.workspaceID = workspaceID 135 | 136 | // Ask Watson for its first message 137 | retrieveFirstMessage() 138 | 139 | } else { 140 | 141 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.5) { 142 | NVActivityIndicatorPresenter.sharedInstance.setMessage("Checking for Training...") 143 | } 144 | 145 | // Retrieve a list of Workspaces that have been trained and default to the first one 146 | // You can define your own WorkspaceID if you have a specific Assistant model you want to work with 147 | guard let assistant = assistant else { 148 | return 149 | } 150 | 151 | assistant.listWorkspaces { response, error in 152 | if let error = error { 153 | self.failAssistantWithError(error) 154 | return 155 | } 156 | 157 | guard let workspaces = response?.result else { 158 | self.showAlert(.noWorkspacesAvailable) 159 | return 160 | } 161 | 162 | self.workspaceList(workspaces) 163 | } 164 | } 165 | } 166 | 167 | // Method to start convesation from workspace list 168 | func workspaceList(_ list: WorkspaceCollection) { 169 | 170 | // Lets see if the service has any training model deployed 171 | guard let workspace = list.workspaces.first else { 172 | showAlert(.noWorkspacesAvailable) 173 | return 174 | } 175 | 176 | // Check if we have a workspace ID 177 | guard !workspace.workspaceID.isEmpty else { 178 | showAlert(.noWorkspaceId) 179 | return 180 | } 181 | 182 | // Now we have an WorkspaceID we can ask Watson Assisant for its first message 183 | self.workspaceID = workspace.workspaceID 184 | 185 | // Ask Watson for its first message 186 | retrieveFirstMessage() 187 | 188 | } 189 | 190 | // Method to handle errors with Watson Assistant 191 | func failAssistantWithError(_ error: Error) { 192 | showAlert(.error(error.localizedDescription)) 193 | } 194 | 195 | // Method to set up the activity progress indicator view 196 | func instantiateActivityIndicator() { 197 | let size: CGFloat = 50 198 | let x = self.view.frame.width/2 - size 199 | let y = self.view.frame.height/2 - size 200 | 201 | let frame = CGRect(x: x, y: y, width: size, height: size) 202 | 203 | _ = NVActivityIndicatorView(frame: frame, type: NVActivityIndicatorType.ballScaleRipple) 204 | } 205 | 206 | // Method to set up messages kit data sources and delegates + configure 207 | func setupMessagesKit() { 208 | 209 | // Register datasources and delegates 210 | messagesCollectionView.messagesDataSource = self 211 | messagesCollectionView.messagesLayoutDelegate = self 212 | messagesCollectionView.messagesDisplayDelegate = self 213 | messagesCollectionView.messageCellDelegate = self 214 | messageInputBar.delegate = self 215 | 216 | // Configure views 217 | messageInputBar.sendButton.tintColor = UIColor(red: 69/255, green: 193/255, blue: 89/255, alpha: 1) 218 | scrollsToBottomOnKeybordBeginsEditing = true // default false 219 | maintainPositionOnKeyboardFrameChanged = true // default false 220 | } 221 | 222 | // Retrieves the first message from Watson 223 | func retrieveFirstMessage() { 224 | 225 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.5) { 226 | NVActivityIndicatorPresenter.sharedInstance.setMessage("Talking to Watson...") 227 | } 228 | 229 | guard let assistant = self.assistant else { 230 | showAlert(.missingAssistantCredentials) 231 | return 232 | } 233 | 234 | guard let workspace = workspaceID else { 235 | showAlert(.noWorkspaceId) 236 | return 237 | } 238 | 239 | // Initial assistant message from Watson 240 | assistant.message(workspaceID: workspace) { response, error in 241 | if let error = error { 242 | self.failAssistantWithError(error) 243 | return 244 | } 245 | guard let watsonMessages = response?.result else { 246 | self.showAlert(.noWorkspaceId) 247 | return 248 | } 249 | 250 | for watsonMessage in watsonMessages.output.text { 251 | // Set current context 252 | self.context = watsonMessages.context 253 | 254 | DispatchQueue.main.async { 255 | 256 | // Add message to assistant message array 257 | let uniqueID = UUID().uuidString 258 | let date = self.dateAddingRandomTime() 259 | 260 | let attributedText = NSAttributedString(string: watsonMessage, 261 | attributes: [.font: UIFont.systemFont(ofSize: 14), 262 | .foregroundColor: UIColor.blue]) 263 | 264 | // Create a Message for adding to the Message View 265 | let message = AssistantMessages(attributedText: attributedText, sender: self.watson, messageId: uniqueID, date: date) 266 | 267 | // Add the response to the Message View 268 | self.messageList.insert(message, at: 0) 269 | self.messagesCollectionView.reloadData() 270 | self.messagesCollectionView.scrollToBottom() 271 | self.stopAnimating() 272 | } 273 | } 274 | } 275 | } 276 | 277 | // Method to create a random date 278 | func dateAddingRandomTime() -> Date { 279 | let randomNumber = Int(arc4random_uniform(UInt32(10))) 280 | var date: Date? 281 | if randomNumber % 2 == 0 { 282 | date = Calendar.current.date(byAdding: .hour, value: randomNumber, to: now) ?? Date() 283 | } else { 284 | let randomMinute = Int(arc4random_uniform(UInt32(59))) 285 | date = Calendar.current.date(byAdding: .minute, value: randomMinute, to: now) ?? Date() 286 | } 287 | now = date ?? Date() 288 | return now 289 | } 290 | 291 | // Method to show an alert with an alertTitle String and alertMessage String 292 | func showAlert(_ error: AssistantError) { 293 | // Log the error to the console 294 | print(error) 295 | 296 | DispatchQueue.main.async { 297 | 298 | // Stop animating if necessary 299 | self.stopAnimating() 300 | 301 | // If an alert is not currently being displayed 302 | if self.presentedViewController == nil { 303 | // Set alert properties 304 | let alert = UIAlertController(title: error.alertTitle, 305 | message: error.alertMessage, 306 | preferredStyle: .alert) 307 | // Add an action to the alert 308 | alert.addAction(UIAlertAction(title: "Dismiss", style: UIAlertAction.Style.default, handler: nil)) 309 | // Show the alert 310 | self.present(alert, animated: true, completion: nil) 311 | } 312 | } 313 | } 314 | 315 | // Method to retrieve assistant avatar 316 | func getAvatarFor(sender: Sender) -> Avatar { 317 | switch sender { 318 | case current: 319 | return Avatar(image: UIImage(named: "avatar_small"), initials: "GR") 320 | case watson: 321 | return Avatar(image: UIImage(named: "watson_avatar"), initials: "WAT") 322 | default: 323 | return Avatar() 324 | } 325 | } 326 | } 327 | 328 | // MARK: - MessagesDataSource 329 | extension ViewController: MessagesDataSource { 330 | 331 | func currentSender() -> Sender { 332 | return current 333 | } 334 | 335 | func numberOfMessages(in messagesCollectionView: MessagesCollectionView) -> Int { 336 | return messageList.count 337 | } 338 | 339 | func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType { 340 | return messageList[indexPath.section] 341 | } 342 | 343 | func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? { 344 | let name = message.sender.displayName 345 | return NSAttributedString(string: name, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption1)]) 346 | } 347 | 348 | func cellBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? { 349 | 350 | struct AssistantDateFormatter { 351 | static let formatter: DateFormatter = { 352 | let formatter = DateFormatter() 353 | formatter.dateStyle = .medium 354 | return formatter 355 | }() 356 | } 357 | let formatter = AssistantDateFormatter.formatter 358 | let dateString = formatter.string(from: message.sentDate) 359 | return NSAttributedString(string: dateString, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)]) 360 | } 361 | 362 | } 363 | 364 | // MARK: - MessagesDisplayDelegate 365 | extension ViewController: MessagesDisplayDelegate { 366 | 367 | // MARK: - Text Messages 368 | 369 | func textColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor { 370 | return isFromCurrentSender(message: message) ? .white : .darkText 371 | } 372 | 373 | func detectorAttributes(for detector: DetectorType, and message: MessageType, at indexPath: IndexPath) -> [NSAttributedString.Key: Any] { 374 | return MessageLabel.defaultAttributes 375 | } 376 | 377 | func enabledDetectors(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> [DetectorType] { 378 | return [.url, .address, .phoneNumber, .date] 379 | } 380 | 381 | // MARK: - All Messages 382 | 383 | func backgroundColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor { 384 | return isFromCurrentSender(message: message) ? UIColor(red: 69/255, green: 193/255, blue: 89/255, alpha: 1) : UIColor(red: 230/255, green: 230/255, blue: 230/255, alpha: 1) 385 | } 386 | 387 | func messageStyle(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageStyle { 388 | let corner: MessageStyle.TailCorner = isFromCurrentSender(message: message) ? .bottomRight : .bottomLeft 389 | return .bubbleTail(corner, .curved) 390 | } 391 | 392 | func configureAvatarView(_ avatarView: AvatarView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) { 393 | 394 | let avatar = getAvatarFor(sender: message.sender) 395 | avatarView.set(avatar: avatar) 396 | } 397 | 398 | // MARK: - Location Messages 399 | func annotationViewForLocation(message: MessageType, at indexPath: IndexPath, in messageCollectionView: MessagesCollectionView) -> MKAnnotationView? { 400 | let annotationView = MKAnnotationView(annotation: nil, reuseIdentifier: nil) 401 | let pinImage = #imageLiteral(resourceName: "pin") 402 | annotationView.image = pinImage 403 | annotationView.centerOffset = CGPoint(x: 0, y: -pinImage.size.height / 2) 404 | return annotationView 405 | } 406 | 407 | func animationBlockForLocation(message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> ((UIImageView) -> Void)? { 408 | return { view in 409 | view.layer.transform = CATransform3DMakeScale(0, 0, 0) 410 | view.alpha = 0.0 411 | UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0, options: [], animations: { 412 | view.layer.transform = CATransform3DIdentity 413 | view.alpha = 1.0 414 | }, completion: nil) 415 | } 416 | } 417 | } 418 | 419 | // MARK: - MessagesLayoutDelegate 420 | extension ViewController: MessagesLayoutDelegate { 421 | 422 | func avatarPosition(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> AvatarPosition { 423 | return AvatarPosition(horizontal: .natural, vertical: .messageBottom) 424 | } 425 | 426 | func messagePadding(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIEdgeInsets { 427 | if isFromCurrentSender(message: message) { 428 | return UIEdgeInsets(top: 0, left: 30, bottom: 0, right: 4) 429 | } else { 430 | return UIEdgeInsets(top: 0, left: 4, bottom: 0, right: 30) 431 | } 432 | } 433 | 434 | func cellTopLabelAlignment(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> LabelAlignment { 435 | if isFromCurrentSender(message: message) { 436 | return .messageTrailing(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10)) 437 | } else { 438 | return .messageLeading(UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)) 439 | } 440 | } 441 | 442 | func cellBottomLabelAlignment(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> LabelAlignment { 443 | if isFromCurrentSender(message: message) { 444 | return .messageLeading(UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)) 445 | } else { 446 | return .messageTrailing(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10)) 447 | } 448 | } 449 | 450 | func footerViewSize(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGSize { 451 | 452 | return CGSize(width: messagesCollectionView.bounds.width, height: 10) 453 | } 454 | 455 | // MARK: - Location Messages 456 | 457 | func heightForLocation(message: MessageType, at indexPath: IndexPath, with maxWidth: CGFloat, in messagesCollectionView: MessagesCollectionView) -> CGFloat { 458 | return 200 459 | } 460 | 461 | } 462 | 463 | // MARK: - MessageCellDelegate 464 | 465 | extension ViewController: MessageCellDelegate { 466 | 467 | func didTapAvatar(in cell: MessageCollectionViewCell) { 468 | print("Avatar tapped") 469 | } 470 | 471 | func didTapMessage(in cell: MessageCollectionViewCell) { 472 | print("Message tapped") 473 | } 474 | 475 | func didTapTopLabel(in cell: MessageCollectionViewCell) { 476 | print("Top label tapped") 477 | } 478 | 479 | func didTapBottomLabel(in cell: MessageCollectionViewCell) { 480 | print("Bottom label tapped") 481 | } 482 | 483 | } 484 | 485 | // MARK: - MessageLabelDelegate 486 | 487 | extension ViewController: MessageLabelDelegate { 488 | 489 | func didSelectAddress(_ addressComponents: [String: String]) { 490 | print("Address Selected: \(addressComponents)") 491 | } 492 | 493 | func didSelectDate(_ date: Date) { 494 | print("Date Selected: \(date)") 495 | } 496 | 497 | func didSelectPhoneNumber(_ phoneNumber: String) { 498 | print("Phone Number Selected: \(phoneNumber)") 499 | } 500 | 501 | func didSelectURL(_ url: URL) { 502 | print("URL Selected: \(url)") 503 | } 504 | 505 | } 506 | 507 | // MARK: - MessageInputBarDelegate 508 | 509 | extension ViewController: MessageInputBarDelegate { 510 | 511 | func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) { 512 | 513 | guard let assist = assistant else { 514 | showAlert(.missingAssistantCredentials) 515 | return 516 | } 517 | 518 | guard let workspace = workspaceID else { 519 | showAlert(.noWorkspaceId) 520 | return 521 | } 522 | 523 | let attributedText = NSAttributedString(string: text, attributes: [.font: UIFont.systemFont(ofSize: 14), .foregroundColor: UIColor.blue]) 524 | let id = UUID().uuidString 525 | let message = AssistantMessages(attributedText: attributedText, sender: currentSender(), messageId: id, date: Date()) 526 | messageList.append(message) 527 | inputBar.inputTextView.text = String() 528 | messagesCollectionView.insertSections([messageList.count - 1]) 529 | messagesCollectionView.scrollToBottom() 530 | 531 | // cleanup text that gets sent to Watson, which doesn't care about whitespace or newline characters 532 | let cleanText = text 533 | .trimmingCharacters(in: .whitespacesAndNewlines) 534 | .replacingOccurrences(of: "\n", with: ". ") 535 | 536 | // Pass the intent to Watson Assistant and get the response based on user text create a message 537 | // Call the Assistant API 538 | let input = MessageInput(text: cleanText) 539 | assist.message(workspaceID: workspace, input: input, context: context) { response, error in 540 | 541 | if let error = error { 542 | self.failAssistantWithError(error) 543 | return 544 | } 545 | 546 | guard let message = response?.result else { 547 | self.showAlert(.noData) 548 | return 549 | } 550 | 551 | for watsonMessage in message.output.text { 552 | guard !watsonMessage.isEmpty else { 553 | continue 554 | } 555 | 556 | // Set current context 557 | self.context = message.context 558 | DispatchQueue.main.async { 559 | 560 | let attributedText = NSAttributedString(string: watsonMessage, attributes: [.font: UIFont.systemFont(ofSize: 14), .foregroundColor: UIColor.blue]) 561 | let id = UUID().uuidString 562 | let message = AssistantMessages(attributedText: attributedText, sender: self.watson, messageId: id, date: Date()) 563 | self.messageList.append(message) 564 | inputBar.inputTextView.text = String() 565 | self.messagesCollectionView.insertSections([self.messageList.count - 1]) 566 | self.messagesCollectionView.scrollToBottom() 567 | 568 | } 569 | 570 | } 571 | 572 | } 573 | 574 | } 575 | 576 | } 577 | 578 | 579 | -------------------------------------------------------------------------------- /iosappTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleDisplayName 10 | iosvirtualassistantapp 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | 26 | 27 | -------------------------------------------------------------------------------- /iosappTests/iosappTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MySampleAppTests.swift 3 | // MySampleAppTests 4 | // 5 | 6 | import XCTest 7 | 8 | class iosappTests: XCTestCase { 9 | 10 | override func setUp() { 11 | super.setUp() 12 | // Put setup code here. This method is called before the invocation of each test method in the class. 13 | } 14 | 15 | override func tearDown() { 16 | // Put teardown code here. This method is called after the invocation of each test method in the class. 17 | super.tearDown() 18 | } 19 | 20 | func testExample() { 21 | // This is an example of a functional test case. 22 | // Use XCTAssert and related functions to verify your tests produce the correct results. 23 | } 24 | 25 | func testPerformanceExample() { 26 | // This is an example of a performance test case. 27 | self.measure { 28 | // Put the code you want to measure the time of here. 29 | } 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /iosappUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleDisplayName 10 | iosvirtualassistantapp 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | 26 | 27 | -------------------------------------------------------------------------------- /iosappUITests/iosappUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MySampleAppUITests.swift 3 | // MySampleAppUITests 4 | // 5 | 6 | import XCTest 7 | 8 | class iosappUITests: XCTestCase { 9 | 10 | override func setUp() { 11 | super.setUp() 12 | 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 18 | XCUIApplication().launch() 19 | 20 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 21 | } 22 | 23 | override func tearDown() { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | super.tearDown() 26 | } 27 | 28 | func testExample() { 29 | // Use recording to get started writing UI tests. 30 | // Use XCTAssert and related functions to verify your tests produce the correct results. 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /iosvirtualassistantapp.xcodeproj/.xcodesamplecode.plist: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /iosvirtualassistantapp.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 07C6E30A0262C44460254B36 /* Pods_iosvirtualassistantappTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3047C685855ACC000463682B /* Pods_iosvirtualassistantappTests.framework */; }; 11 | 2A16113070E49BB945B5F129 /* Pods_iosvirtualassistantappUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C34BB7507787333DD11EAFB /* Pods_iosvirtualassistantappUITests.framework */; }; 12 | 555C91AC1D0F0731003E84E3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 555C91AB1D0F0731003E84E3 /* AppDelegate.swift */; }; 13 | 555C91AE1D0F0731003E84E3 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 555C91AD1D0F0731003E84E3 /* ViewController.swift */; }; 14 | 555C91B11D0F0731003E84E3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 555C91AF1D0F0731003E84E3 /* Main.storyboard */; }; 15 | 555C91B31D0F0731003E84E3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 555C91B21D0F0731003E84E3 /* Assets.xcassets */; }; 16 | 555C91C11D0F0731003E84E3 /* iosappTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 555C91C01D0F0731003E84E3 /* iosappTests.swift */; }; 17 | 555C91CC1D0F0731003E84E3 /* iosappUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 555C91CB1D0F0731003E84E3 /* iosappUITests.swift */; }; 18 | 5803AD91205CBE3C00CD3162 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5803AD90205CBE3C00CD3162 /* Default-568h@2x.png */; }; 19 | 5877770D1FF8402B00387021 /* car_training.json in Resources */ = {isa = PBXBuildFile; fileRef = 5877770B1FF8402B00387021 /* car_training.json */; }; 20 | 587777161FF8759500387021 /* AssistantMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587777151FF8759400387021 /* AssistantMessages.swift */; }; 21 | B5F2AA72EEE14CE9ABF399D7 /* BMSCredentials.plist in Resources */ = {isa = PBXBuildFile; fileRef = BFD5E760BB764E95BD095FBF /* BMSCredentials.plist */; }; 22 | CA3217F6194B51F525938BA7 /* Pods_iosvirtualassistantapp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49C12E35288EB16B0697C321 /* Pods_iosvirtualassistantapp.framework */; }; 23 | E3D862A1202B8ECC00B34DE6 /* AssistantError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D862A0202B8ECC00B34DE6 /* AssistantError.swift */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | 555C91BD1D0F0731003E84E3 /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = 555C91A01D0F0731003E84E3 /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = 555C91A71D0F0731003E84E3; 32 | remoteInfo = MySampleApp; 33 | }; 34 | 555C91C81D0F0731003E84E3 /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = 555C91A01D0F0731003E84E3 /* Project object */; 37 | proxyType = 1; 38 | remoteGlobalIDString = 555C91A71D0F0731003E84E3; 39 | remoteInfo = MySampleApp; 40 | }; 41 | /* End PBXContainerItemProxy section */ 42 | 43 | /* Begin PBXCopyFilesBuildPhase section */ 44 | 58327F27205CC1EF0024465B /* Embed Frameworks */ = { 45 | isa = PBXCopyFilesBuildPhase; 46 | buildActionMask = 2147483647; 47 | dstPath = ""; 48 | dstSubfolderSpec = 10; 49 | files = ( 50 | ); 51 | name = "Embed Frameworks"; 52 | runOnlyForDeploymentPostprocessing = 0; 53 | }; 54 | /* End PBXCopyFilesBuildPhase section */ 55 | 56 | /* Begin PBXFileReference section */ 57 | 1065AE6E382035A3AFC4529C /* Pods_StarterWatsonConversation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StarterWatsonConversation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | 18FB6B94BD7F5CF6B965945C /* Pods_MySampleAppUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MySampleAppUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | 2356DF2AEA52EC2A9A8C6B04 /* Pods_StarterWatsonConversationTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StarterWatsonConversationTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | 266A6F8C6132C0DCFD16A8CC /* Pods-iosvirtualassistantappUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosvirtualassistantappUITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iosvirtualassistantappUITests/Pods-iosvirtualassistantappUITests.debug.xcconfig"; sourceTree = ""; }; 61 | 3047C685855ACC000463682B /* Pods_iosvirtualassistantappTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosvirtualassistantappTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 34A3ABE8B34C7CE0E49EFC73 /* Pods-iosvirtualassistantapp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosvirtualassistantapp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iosvirtualassistantapp/Pods-iosvirtualassistantapp.debug.xcconfig"; sourceTree = ""; }; 63 | 40C440CD45E797A604FD27B8 /* Pods-iosapp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosapp.release.xcconfig"; path = "Pods/Target Support Files/Pods-iosapp/Pods-iosapp.release.xcconfig"; sourceTree = ""; }; 64 | 49C12E35288EB16B0697C321 /* Pods_iosvirtualassistantapp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosvirtualassistantapp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | 555C91A81D0F0731003E84E3 /* iosvirtualassistantapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosvirtualassistantapp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | 555C91AB1D0F0731003E84E3 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 67 | 555C91AD1D0F0731003E84E3 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 68 | 555C91B01D0F0731003E84E3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 69 | 555C91B21D0F0731003E84E3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 70 | 555C91B71D0F0731003E84E3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 71 | 555C91BC1D0F0731003E84E3 /* iosvirtualassistantappTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosvirtualassistantappTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | 555C91C01D0F0731003E84E3 /* iosappTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosappTests.swift; sourceTree = ""; }; 73 | 555C91C21D0F0731003E84E3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 74 | 555C91C71D0F0731003E84E3 /* iosvirtualassistantappUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosvirtualassistantappUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 75 | 555C91CB1D0F0731003E84E3 /* iosappUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosappUITests.swift; sourceTree = ""; }; 76 | 555C91CD1D0F0731003E84E3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 77 | 5803AD90205CBE3C00CD3162 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 78 | 5877770B1FF8402B00387021 /* car_training.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = car_training.json; sourceTree = ""; }; 79 | 587777151FF8759400387021 /* AssistantMessages.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssistantMessages.swift; sourceTree = ""; }; 80 | 64C328CA7DE32720C77B0EBE /* Pods-StarterWatsonConversationTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarterWatsonConversationTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-StarterWatsonConversationTests/Pods-StarterWatsonConversationTests.release.xcconfig"; sourceTree = ""; }; 81 | 6B979C8A3C4008F48CEE9634 /* Pods-iosvirtualassistantappUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosvirtualassistantappUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-iosvirtualassistantappUITests/Pods-iosvirtualassistantappUITests.release.xcconfig"; sourceTree = ""; }; 82 | 7B7706B3C7326C807BABCB5A /* Pods-iosappTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosappTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iosappTests/Pods-iosappTests.debug.xcconfig"; sourceTree = ""; }; 83 | 8C34BB7507787333DD11EAFB /* Pods_iosvirtualassistantappUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosvirtualassistantappUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 84 | 8C5E72ACFA90549DFA5528EB /* Pods-StarterWatsonConversation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarterWatsonConversation.release.xcconfig"; path = "Pods/Target Support Files/Pods-StarterWatsonConversation/Pods-StarterWatsonConversation.release.xcconfig"; sourceTree = ""; }; 85 | 906827E5B21E5719286E9DB1 /* Pods_StarterWatsonConversationUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StarterWatsonConversationUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 86 | 93B8E135EBE1BBD3FBD5032F /* Pods-iosvirtualassistantapp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosvirtualassistantapp.release.xcconfig"; path = "Pods/Target Support Files/Pods-iosvirtualassistantapp/Pods-iosvirtualassistantapp.release.xcconfig"; sourceTree = ""; }; 87 | 9707D44DA3A698E5C2FA56D5 /* Pods-iosappUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosappUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-iosappUITests/Pods-iosappUITests.release.xcconfig"; sourceTree = ""; }; 88 | A7C7331B4CAD8B9956414854 /* Pods-StarterWatsonConversation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarterWatsonConversation.debug.xcconfig"; path = "Pods/Target Support Files/Pods-StarterWatsonConversation/Pods-StarterWatsonConversation.debug.xcconfig"; sourceTree = ""; }; 89 | ACEA392A2E3080911FA5B2A6 /* Pods-iosvirtualassistantappTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosvirtualassistantappTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iosvirtualassistantappTests/Pods-iosvirtualassistantappTests.debug.xcconfig"; sourceTree = ""; }; 90 | BB4E67865CDD18C0A341FEFE /* Pods-iosappTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosappTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-iosappTests/Pods-iosappTests.release.xcconfig"; sourceTree = ""; }; 91 | BF73245EA5A55B928020E94B /* Pods-StarterWatsonConversationUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarterWatsonConversationUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-StarterWatsonConversationUITests/Pods-StarterWatsonConversationUITests.release.xcconfig"; sourceTree = ""; }; 92 | BFD5E760BB764E95BD095FBF /* BMSCredentials.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = BMSCredentials.plist; sourceTree = ""; }; 93 | C4A3027B4A500CADC2236A43 /* Pods-iosappUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosappUITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iosappUITests/Pods-iosappUITests.debug.xcconfig"; sourceTree = ""; }; 94 | C588E03443573F2DDF2BE953 /* Pods_MySampleApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MySampleApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 95 | C5F2362AFA834C538C87F504 /* Pods-iosapp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosapp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iosapp/Pods-iosapp.debug.xcconfig"; sourceTree = ""; }; 96 | D2B373158808AA846CD105B0 /* Pods-StarterWatsonConversationUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarterWatsonConversationUITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-StarterWatsonConversationUITests/Pods-StarterWatsonConversationUITests.debug.xcconfig"; sourceTree = ""; }; 97 | DC07D8870FA641AC2946190A /* Pods-iosvirtualassistantappTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosvirtualassistantappTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-iosvirtualassistantappTests/Pods-iosvirtualassistantappTests.release.xcconfig"; sourceTree = ""; }; 98 | E2245D77536DEA72D17C06CA /* Pods-StarterWatsonConversationTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarterWatsonConversationTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-StarterWatsonConversationTests/Pods-StarterWatsonConversationTests.debug.xcconfig"; sourceTree = ""; }; 99 | E3D862A0202B8ECC00B34DE6 /* AssistantError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssistantError.swift; sourceTree = ""; }; 100 | E544B14066F29C9013C2DBC8 /* Pods_MySampleAppTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MySampleAppTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 101 | /* End PBXFileReference section */ 102 | 103 | /* Begin PBXFrameworksBuildPhase section */ 104 | 555C91A51D0F0731003E84E3 /* Frameworks */ = { 105 | isa = PBXFrameworksBuildPhase; 106 | buildActionMask = 2147483647; 107 | files = ( 108 | CA3217F6194B51F525938BA7 /* Pods_iosvirtualassistantapp.framework in Frameworks */, 109 | ); 110 | runOnlyForDeploymentPostprocessing = 0; 111 | }; 112 | 555C91B91D0F0731003E84E3 /* Frameworks */ = { 113 | isa = PBXFrameworksBuildPhase; 114 | buildActionMask = 2147483647; 115 | files = ( 116 | 07C6E30A0262C44460254B36 /* Pods_iosvirtualassistantappTests.framework in Frameworks */, 117 | ); 118 | runOnlyForDeploymentPostprocessing = 0; 119 | }; 120 | 555C91C41D0F0731003E84E3 /* Frameworks */ = { 121 | isa = PBXFrameworksBuildPhase; 122 | buildActionMask = 2147483647; 123 | files = ( 124 | 2A16113070E49BB945B5F129 /* Pods_iosvirtualassistantappUITests.framework in Frameworks */, 125 | ); 126 | runOnlyForDeploymentPostprocessing = 0; 127 | }; 128 | /* End PBXFrameworksBuildPhase section */ 129 | 130 | /* Begin PBXGroup section */ 131 | 545C9DD4D3D79A706E9BC9CE /* Frameworks */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | C588E03443573F2DDF2BE953 /* Pods_MySampleApp.framework */, 135 | E544B14066F29C9013C2DBC8 /* Pods_MySampleAppTests.framework */, 136 | 18FB6B94BD7F5CF6B965945C /* Pods_MySampleAppUITests.framework */, 137 | 1065AE6E382035A3AFC4529C /* Pods_StarterWatsonConversation.framework */, 138 | 2356DF2AEA52EC2A9A8C6B04 /* Pods_StarterWatsonConversationTests.framework */, 139 | 906827E5B21E5719286E9DB1 /* Pods_StarterWatsonConversationUITests.framework */, 140 | 49C12E35288EB16B0697C321 /* Pods_iosvirtualassistantapp.framework */, 141 | 3047C685855ACC000463682B /* Pods_iosvirtualassistantappTests.framework */, 142 | 8C34BB7507787333DD11EAFB /* Pods_iosvirtualassistantappUITests.framework */, 143 | ); 144 | name = Frameworks; 145 | sourceTree = ""; 146 | }; 147 | 555C919F1D0F0731003E84E3 = { 148 | isa = PBXGroup; 149 | children = ( 150 | 5803AD90205CBE3C00CD3162 /* Default-568h@2x.png */, 151 | 555C91AA1D0F0731003E84E3 /* iosapp */, 152 | 555C91BF1D0F0731003E84E3 /* iosappTests */, 153 | 555C91CA1D0F0731003E84E3 /* iosappUITests */, 154 | 555C91A91D0F0731003E84E3 /* Products */, 155 | A4160B77D037FA5B9F790955 /* Pods */, 156 | 545C9DD4D3D79A706E9BC9CE /* Frameworks */, 157 | ); 158 | sourceTree = ""; 159 | }; 160 | 555C91A91D0F0731003E84E3 /* Products */ = { 161 | isa = PBXGroup; 162 | children = ( 163 | 555C91A81D0F0731003E84E3 /* iosvirtualassistantapp.app */, 164 | 555C91BC1D0F0731003E84E3 /* iosvirtualassistantappTests.xctest */, 165 | 555C91C71D0F0731003E84E3 /* iosvirtualassistantappUITests.xctest */, 166 | ); 167 | name = Products; 168 | sourceTree = ""; 169 | }; 170 | 555C91AA1D0F0731003E84E3 /* iosapp */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | BFD5E760BB764E95BD095FBF /* BMSCredentials.plist */, 174 | 5877770A1FF8402B00387021 /* training */, 175 | 555C91AB1D0F0731003E84E3 /* AppDelegate.swift */, 176 | 555C91B71D0F0731003E84E3 /* Info.plist */, 177 | 555C91AD1D0F0731003E84E3 /* ViewController.swift */, 178 | 587777151FF8759400387021 /* AssistantMessages.swift */, 179 | 555C91AF1D0F0731003E84E3 /* Main.storyboard */, 180 | 555C91B21D0F0731003E84E3 /* Assets.xcassets */, 181 | E3D862A0202B8ECC00B34DE6 /* AssistantError.swift */, 182 | ); 183 | path = iosapp; 184 | sourceTree = ""; 185 | }; 186 | 555C91BF1D0F0731003E84E3 /* iosappTests */ = { 187 | isa = PBXGroup; 188 | children = ( 189 | 555C91C01D0F0731003E84E3 /* iosappTests.swift */, 190 | 555C91C21D0F0731003E84E3 /* Info.plist */, 191 | ); 192 | path = iosappTests; 193 | sourceTree = ""; 194 | }; 195 | 555C91CA1D0F0731003E84E3 /* iosappUITests */ = { 196 | isa = PBXGroup; 197 | children = ( 198 | 555C91CB1D0F0731003E84E3 /* iosappUITests.swift */, 199 | 555C91CD1D0F0731003E84E3 /* Info.plist */, 200 | ); 201 | path = iosappUITests; 202 | sourceTree = ""; 203 | }; 204 | 5877770A1FF8402B00387021 /* training */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | 5877770B1FF8402B00387021 /* car_training.json */, 208 | ); 209 | path = training; 210 | sourceTree = ""; 211 | }; 212 | A4160B77D037FA5B9F790955 /* Pods */ = { 213 | isa = PBXGroup; 214 | children = ( 215 | A7C7331B4CAD8B9956414854 /* Pods-StarterWatsonConversation.debug.xcconfig */, 216 | 8C5E72ACFA90549DFA5528EB /* Pods-StarterWatsonConversation.release.xcconfig */, 217 | E2245D77536DEA72D17C06CA /* Pods-StarterWatsonConversationTests.debug.xcconfig */, 218 | 64C328CA7DE32720C77B0EBE /* Pods-StarterWatsonConversationTests.release.xcconfig */, 219 | D2B373158808AA846CD105B0 /* Pods-StarterWatsonConversationUITests.debug.xcconfig */, 220 | BF73245EA5A55B928020E94B /* Pods-StarterWatsonConversationUITests.release.xcconfig */, 221 | C5F2362AFA834C538C87F504 /* Pods-iosapp.debug.xcconfig */, 222 | 40C440CD45E797A604FD27B8 /* Pods-iosapp.release.xcconfig */, 223 | 7B7706B3C7326C807BABCB5A /* Pods-iosappTests.debug.xcconfig */, 224 | BB4E67865CDD18C0A341FEFE /* Pods-iosappTests.release.xcconfig */, 225 | C4A3027B4A500CADC2236A43 /* Pods-iosappUITests.debug.xcconfig */, 226 | 9707D44DA3A698E5C2FA56D5 /* Pods-iosappUITests.release.xcconfig */, 227 | 34A3ABE8B34C7CE0E49EFC73 /* Pods-iosvirtualassistantapp.debug.xcconfig */, 228 | 93B8E135EBE1BBD3FBD5032F /* Pods-iosvirtualassistantapp.release.xcconfig */, 229 | ACEA392A2E3080911FA5B2A6 /* Pods-iosvirtualassistantappTests.debug.xcconfig */, 230 | DC07D8870FA641AC2946190A /* Pods-iosvirtualassistantappTests.release.xcconfig */, 231 | 266A6F8C6132C0DCFD16A8CC /* Pods-iosvirtualassistantappUITests.debug.xcconfig */, 232 | 6B979C8A3C4008F48CEE9634 /* Pods-iosvirtualassistantappUITests.release.xcconfig */, 233 | ); 234 | name = Pods; 235 | sourceTree = ""; 236 | }; 237 | /* End PBXGroup section */ 238 | 239 | /* Begin PBXNativeTarget section */ 240 | 555C91A71D0F0731003E84E3 /* iosvirtualassistantapp */ = { 241 | isa = PBXNativeTarget; 242 | buildConfigurationList = 555C91D01D0F0731003E84E3 /* Build configuration list for PBXNativeTarget "iosvirtualassistantapp" */; 243 | buildPhases = ( 244 | E48551C04942F6AAA79A91F5 /* [CP] Check Pods Manifest.lock */, 245 | 555C91A41D0F0731003E84E3 /* Sources */, 246 | 555C91A51D0F0731003E84E3 /* Frameworks */, 247 | 555C91A61D0F0731003E84E3 /* Resources */, 248 | 7A8D7333F6565346A25DF969 /* [CP] Embed Pods Frameworks */, 249 | 58327F27205CC1EF0024465B /* Embed Frameworks */, 250 | ); 251 | buildRules = ( 252 | ); 253 | dependencies = ( 254 | ); 255 | name = iosvirtualassistantapp; 256 | productName = MySampleApp; 257 | productReference = 555C91A81D0F0731003E84E3 /* iosvirtualassistantapp.app */; 258 | productType = "com.apple.product-type.application"; 259 | }; 260 | 555C91BB1D0F0731003E84E3 /* iosvirtualassistantappTests */ = { 261 | isa = PBXNativeTarget; 262 | buildConfigurationList = 555C91D31D0F0731003E84E3 /* Build configuration list for PBXNativeTarget "iosvirtualassistantappTests" */; 263 | buildPhases = ( 264 | A9F8F9D069C5977EF9956A05 /* [CP] Check Pods Manifest.lock */, 265 | 555C91B81D0F0731003E84E3 /* Sources */, 266 | 555C91B91D0F0731003E84E3 /* Frameworks */, 267 | 555C91BA1D0F0731003E84E3 /* Resources */, 268 | ); 269 | buildRules = ( 270 | ); 271 | dependencies = ( 272 | 555C91BE1D0F0731003E84E3 /* PBXTargetDependency */, 273 | ); 274 | name = iosvirtualassistantappTests; 275 | productName = MySampleAppTests; 276 | productReference = 555C91BC1D0F0731003E84E3 /* iosvirtualassistantappTests.xctest */; 277 | productType = "com.apple.product-type.bundle.unit-test"; 278 | }; 279 | 555C91C61D0F0731003E84E3 /* iosvirtualassistantappUITests */ = { 280 | isa = PBXNativeTarget; 281 | buildConfigurationList = 555C91D61D0F0731003E84E3 /* Build configuration list for PBXNativeTarget "iosvirtualassistantappUITests" */; 282 | buildPhases = ( 283 | 2AE1C0064C94D16713FCF8D0 /* [CP] Check Pods Manifest.lock */, 284 | 555C91C31D0F0731003E84E3 /* Sources */, 285 | 555C91C41D0F0731003E84E3 /* Frameworks */, 286 | 555C91C51D0F0731003E84E3 /* Resources */, 287 | ); 288 | buildRules = ( 289 | ); 290 | dependencies = ( 291 | 555C91C91D0F0731003E84E3 /* PBXTargetDependency */, 292 | ); 293 | name = iosvirtualassistantappUITests; 294 | productName = MySampleAppUITests; 295 | productReference = 555C91C71D0F0731003E84E3 /* iosvirtualassistantappUITests.xctest */; 296 | productType = "com.apple.product-type.bundle.ui-testing"; 297 | }; 298 | /* End PBXNativeTarget section */ 299 | 300 | /* Begin PBXProject section */ 301 | 555C91A01D0F0731003E84E3 /* Project object */ = { 302 | isa = PBXProject; 303 | attributes = { 304 | LastSwiftUpdateCheck = 0730; 305 | LastUpgradeCheck = 1110; 306 | ORGANIZATIONNAME = IBM; 307 | TargetAttributes = { 308 | 555C91A71D0F0731003E84E3 = { 309 | CreatedOnToolsVersion = 7.3.1; 310 | LastSwiftMigration = 1110; 311 | }; 312 | 555C91BB1D0F0731003E84E3 = { 313 | CreatedOnToolsVersion = 7.3.1; 314 | LastSwiftMigration = 1110; 315 | }; 316 | 555C91C61D0F0731003E84E3 = { 317 | CreatedOnToolsVersion = 7.3.1; 318 | LastSwiftMigration = 1110; 319 | TestTargetID = 555C91A71D0F0731003E84E3; 320 | }; 321 | }; 322 | }; 323 | buildConfigurationList = 555C91A31D0F0731003E84E3 /* Build configuration list for PBXProject "iosvirtualassistantapp" */; 324 | compatibilityVersion = "Xcode 3.2"; 325 | developmentRegion = en; 326 | hasScannedForEncodings = 0; 327 | knownRegions = ( 328 | en, 329 | Base, 330 | ); 331 | mainGroup = 555C919F1D0F0731003E84E3; 332 | productRefGroup = 555C91A91D0F0731003E84E3 /* Products */; 333 | projectDirPath = ""; 334 | projectRoot = ""; 335 | targets = ( 336 | 555C91A71D0F0731003E84E3 /* iosvirtualassistantapp */, 337 | 555C91BB1D0F0731003E84E3 /* iosvirtualassistantappTests */, 338 | 555C91C61D0F0731003E84E3 /* iosvirtualassistantappUITests */, 339 | ); 340 | }; 341 | /* End PBXProject section */ 342 | 343 | /* Begin PBXResourcesBuildPhase section */ 344 | 555C91A61D0F0731003E84E3 /* Resources */ = { 345 | isa = PBXResourcesBuildPhase; 346 | buildActionMask = 2147483647; 347 | files = ( 348 | B5F2AA72EEE14CE9ABF399D7 /* BMSCredentials.plist in Resources */, 349 | 555C91B31D0F0731003E84E3 /* Assets.xcassets in Resources */, 350 | 5803AD91205CBE3C00CD3162 /* Default-568h@2x.png in Resources */, 351 | 555C91B11D0F0731003E84E3 /* Main.storyboard in Resources */, 352 | 5877770D1FF8402B00387021 /* car_training.json in Resources */, 353 | ); 354 | runOnlyForDeploymentPostprocessing = 0; 355 | }; 356 | 555C91BA1D0F0731003E84E3 /* Resources */ = { 357 | isa = PBXResourcesBuildPhase; 358 | buildActionMask = 2147483647; 359 | files = ( 360 | ); 361 | runOnlyForDeploymentPostprocessing = 0; 362 | }; 363 | 555C91C51D0F0731003E84E3 /* Resources */ = { 364 | isa = PBXResourcesBuildPhase; 365 | buildActionMask = 2147483647; 366 | files = ( 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | }; 370 | /* End PBXResourcesBuildPhase section */ 371 | 372 | /* Begin PBXShellScriptBuildPhase section */ 373 | 2AE1C0064C94D16713FCF8D0 /* [CP] Check Pods Manifest.lock */ = { 374 | isa = PBXShellScriptBuildPhase; 375 | buildActionMask = 2147483647; 376 | files = ( 377 | ); 378 | inputPaths = ( 379 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 380 | "${PODS_ROOT}/Manifest.lock", 381 | ); 382 | name = "[CP] Check Pods Manifest.lock"; 383 | outputPaths = ( 384 | "$(DERIVED_FILE_DIR)/Pods-iosvirtualassistantappUITests-checkManifestLockResult.txt", 385 | ); 386 | runOnlyForDeploymentPostprocessing = 0; 387 | shellPath = /bin/sh; 388 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 389 | showEnvVarsInLog = 0; 390 | }; 391 | 7A8D7333F6565346A25DF969 /* [CP] Embed Pods Frameworks */ = { 392 | isa = PBXShellScriptBuildPhase; 393 | buildActionMask = 2147483647; 394 | files = ( 395 | ); 396 | inputPaths = ( 397 | "${PODS_ROOT}/Target Support Files/Pods-iosvirtualassistantapp/Pods-iosvirtualassistantapp-frameworks.sh", 398 | "${BUILT_PRODUCTS_DIR}/BMSAnalyticsAPI/BMSAnalyticsAPI.framework", 399 | "${BUILT_PRODUCTS_DIR}/BMSCore/BMSCore.framework", 400 | "${BUILT_PRODUCTS_DIR}/IBMSwiftSDKCore/IBMSwiftSDKCore.framework", 401 | "${BUILT_PRODUCTS_DIR}/IBMWatsonAssistantV1/Assistant.framework", 402 | "${BUILT_PRODUCTS_DIR}/MessageKit/MessageKit.framework", 403 | "${BUILT_PRODUCTS_DIR}/NVActivityIndicatorView/NVActivityIndicatorView.framework", 404 | ); 405 | name = "[CP] Embed Pods Frameworks"; 406 | outputPaths = ( 407 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BMSAnalyticsAPI.framework", 408 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BMSCore.framework", 409 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IBMSwiftSDKCore.framework", 410 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Assistant.framework", 411 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MessageKit.framework", 412 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NVActivityIndicatorView.framework", 413 | ); 414 | runOnlyForDeploymentPostprocessing = 0; 415 | shellPath = /bin/sh; 416 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosvirtualassistantapp/Pods-iosvirtualassistantapp-frameworks.sh\"\n"; 417 | showEnvVarsInLog = 0; 418 | }; 419 | A9F8F9D069C5977EF9956A05 /* [CP] Check Pods Manifest.lock */ = { 420 | isa = PBXShellScriptBuildPhase; 421 | buildActionMask = 2147483647; 422 | files = ( 423 | ); 424 | inputPaths = ( 425 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 426 | "${PODS_ROOT}/Manifest.lock", 427 | ); 428 | name = "[CP] Check Pods Manifest.lock"; 429 | outputPaths = ( 430 | "$(DERIVED_FILE_DIR)/Pods-iosvirtualassistantappTests-checkManifestLockResult.txt", 431 | ); 432 | runOnlyForDeploymentPostprocessing = 0; 433 | shellPath = /bin/sh; 434 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 435 | showEnvVarsInLog = 0; 436 | }; 437 | E48551C04942F6AAA79A91F5 /* [CP] Check Pods Manifest.lock */ = { 438 | isa = PBXShellScriptBuildPhase; 439 | buildActionMask = 2147483647; 440 | files = ( 441 | ); 442 | inputPaths = ( 443 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 444 | "${PODS_ROOT}/Manifest.lock", 445 | ); 446 | name = "[CP] Check Pods Manifest.lock"; 447 | outputPaths = ( 448 | "$(DERIVED_FILE_DIR)/Pods-iosvirtualassistantapp-checkManifestLockResult.txt", 449 | ); 450 | runOnlyForDeploymentPostprocessing = 0; 451 | shellPath = /bin/sh; 452 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 453 | showEnvVarsInLog = 0; 454 | }; 455 | /* End PBXShellScriptBuildPhase section */ 456 | 457 | /* Begin PBXSourcesBuildPhase section */ 458 | 555C91A41D0F0731003E84E3 /* Sources */ = { 459 | isa = PBXSourcesBuildPhase; 460 | buildActionMask = 2147483647; 461 | files = ( 462 | E3D862A1202B8ECC00B34DE6 /* AssistantError.swift in Sources */, 463 | 555C91AE1D0F0731003E84E3 /* ViewController.swift in Sources */, 464 | 555C91AC1D0F0731003E84E3 /* AppDelegate.swift in Sources */, 465 | 587777161FF8759500387021 /* AssistantMessages.swift in Sources */, 466 | ); 467 | runOnlyForDeploymentPostprocessing = 0; 468 | }; 469 | 555C91B81D0F0731003E84E3 /* Sources */ = { 470 | isa = PBXSourcesBuildPhase; 471 | buildActionMask = 2147483647; 472 | files = ( 473 | 555C91C11D0F0731003E84E3 /* iosappTests.swift in Sources */, 474 | ); 475 | runOnlyForDeploymentPostprocessing = 0; 476 | }; 477 | 555C91C31D0F0731003E84E3 /* Sources */ = { 478 | isa = PBXSourcesBuildPhase; 479 | buildActionMask = 2147483647; 480 | files = ( 481 | 555C91CC1D0F0731003E84E3 /* iosappUITests.swift in Sources */, 482 | ); 483 | runOnlyForDeploymentPostprocessing = 0; 484 | }; 485 | /* End PBXSourcesBuildPhase section */ 486 | 487 | /* Begin PBXTargetDependency section */ 488 | 555C91BE1D0F0731003E84E3 /* PBXTargetDependency */ = { 489 | isa = PBXTargetDependency; 490 | target = 555C91A71D0F0731003E84E3 /* iosvirtualassistantapp */; 491 | targetProxy = 555C91BD1D0F0731003E84E3 /* PBXContainerItemProxy */; 492 | }; 493 | 555C91C91D0F0731003E84E3 /* PBXTargetDependency */ = { 494 | isa = PBXTargetDependency; 495 | target = 555C91A71D0F0731003E84E3 /* iosvirtualassistantapp */; 496 | targetProxy = 555C91C81D0F0731003E84E3 /* PBXContainerItemProxy */; 497 | }; 498 | /* End PBXTargetDependency section */ 499 | 500 | /* Begin PBXVariantGroup section */ 501 | 555C91AF1D0F0731003E84E3 /* Main.storyboard */ = { 502 | isa = PBXVariantGroup; 503 | children = ( 504 | 555C91B01D0F0731003E84E3 /* Base */, 505 | ); 506 | name = Main.storyboard; 507 | sourceTree = ""; 508 | }; 509 | /* End PBXVariantGroup section */ 510 | 511 | /* Begin XCBuildConfiguration section */ 512 | 555C91CE1D0F0731003E84E3 /* Debug */ = { 513 | isa = XCBuildConfiguration; 514 | buildSettings = { 515 | ALWAYS_SEARCH_USER_PATHS = NO; 516 | CLANG_ANALYZER_NONNULL = YES; 517 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 518 | CLANG_CXX_LIBRARY = "libc++"; 519 | CLANG_ENABLE_MODULES = YES; 520 | CLANG_ENABLE_OBJC_ARC = YES; 521 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 522 | CLANG_WARN_BOOL_CONVERSION = YES; 523 | CLANG_WARN_COMMA = YES; 524 | CLANG_WARN_CONSTANT_CONVERSION = YES; 525 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 526 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 527 | CLANG_WARN_EMPTY_BODY = YES; 528 | CLANG_WARN_ENUM_CONVERSION = YES; 529 | CLANG_WARN_INFINITE_RECURSION = YES; 530 | CLANG_WARN_INT_CONVERSION = YES; 531 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 532 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 533 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 534 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 535 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 536 | CLANG_WARN_STRICT_PROTOTYPES = YES; 537 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 538 | CLANG_WARN_UNREACHABLE_CODE = YES; 539 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 540 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 541 | COPY_PHASE_STRIP = NO; 542 | DEBUG_INFORMATION_FORMAT = dwarf; 543 | ENABLE_STRICT_OBJC_MSGSEND = YES; 544 | ENABLE_TESTABILITY = YES; 545 | GCC_C_LANGUAGE_STANDARD = gnu99; 546 | GCC_DYNAMIC_NO_PIC = NO; 547 | GCC_NO_COMMON_BLOCKS = YES; 548 | GCC_OPTIMIZATION_LEVEL = 0; 549 | GCC_PREPROCESSOR_DEFINITIONS = ( 550 | "DEBUG=1", 551 | "$(inherited)", 552 | ); 553 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 554 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 555 | GCC_WARN_UNDECLARED_SELECTOR = YES; 556 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 557 | GCC_WARN_UNUSED_FUNCTION = YES; 558 | GCC_WARN_UNUSED_VARIABLE = YES; 559 | IPHONEOS_DEPLOYMENT_TARGET = 11.2; 560 | MTL_ENABLE_DEBUG_INFO = YES; 561 | ONLY_ACTIVE_ARCH = YES; 562 | SDKROOT = iphoneos; 563 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 564 | SWIFT_VERSION = ""; 565 | TARGETED_DEVICE_FAMILY = "1,2"; 566 | }; 567 | name = Debug; 568 | }; 569 | 555C91CF1D0F0731003E84E3 /* Release */ = { 570 | isa = XCBuildConfiguration; 571 | buildSettings = { 572 | ALWAYS_SEARCH_USER_PATHS = NO; 573 | CLANG_ANALYZER_NONNULL = YES; 574 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 575 | CLANG_CXX_LIBRARY = "libc++"; 576 | CLANG_ENABLE_MODULES = YES; 577 | CLANG_ENABLE_OBJC_ARC = YES; 578 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 579 | CLANG_WARN_BOOL_CONVERSION = YES; 580 | CLANG_WARN_COMMA = YES; 581 | CLANG_WARN_CONSTANT_CONVERSION = YES; 582 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 583 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 584 | CLANG_WARN_EMPTY_BODY = YES; 585 | CLANG_WARN_ENUM_CONVERSION = YES; 586 | CLANG_WARN_INFINITE_RECURSION = YES; 587 | CLANG_WARN_INT_CONVERSION = YES; 588 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 589 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 590 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 591 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 592 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 593 | CLANG_WARN_STRICT_PROTOTYPES = YES; 594 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 595 | CLANG_WARN_UNREACHABLE_CODE = YES; 596 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 597 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 598 | COPY_PHASE_STRIP = NO; 599 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 600 | ENABLE_NS_ASSERTIONS = NO; 601 | ENABLE_STRICT_OBJC_MSGSEND = YES; 602 | GCC_C_LANGUAGE_STANDARD = gnu99; 603 | GCC_NO_COMMON_BLOCKS = YES; 604 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 605 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 606 | GCC_WARN_UNDECLARED_SELECTOR = YES; 607 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 608 | GCC_WARN_UNUSED_FUNCTION = YES; 609 | GCC_WARN_UNUSED_VARIABLE = YES; 610 | IPHONEOS_DEPLOYMENT_TARGET = 11.2; 611 | MTL_ENABLE_DEBUG_INFO = NO; 612 | SDKROOT = iphoneos; 613 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 614 | SWIFT_VERSION = ""; 615 | TARGETED_DEVICE_FAMILY = "1,2"; 616 | VALIDATE_PRODUCT = YES; 617 | }; 618 | name = Release; 619 | }; 620 | 555C91D11D0F0731003E84E3 /* Debug */ = { 621 | isa = XCBuildConfiguration; 622 | baseConfigurationReference = 34A3ABE8B34C7CE0E49EFC73 /* Pods-iosvirtualassistantapp.debug.xcconfig */; 623 | buildSettings = { 624 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 625 | FRAMEWORK_SEARCH_PATHS = ( 626 | "$(inherited)", 627 | "$(PROJECT_DIR)", 628 | ); 629 | INFOPLIST_FILE = iosapp/Info.plist; 630 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 631 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 632 | PRODUCT_BUNDLE_IDENTIFIER = com.ibm.iosvirtualassistantapp; 633 | PRODUCT_NAME = "$(TARGET_NAME)"; 634 | SWIFT_VERSION = 5.0; 635 | }; 636 | name = Debug; 637 | }; 638 | 555C91D21D0F0731003E84E3 /* Release */ = { 639 | isa = XCBuildConfiguration; 640 | baseConfigurationReference = 93B8E135EBE1BBD3FBD5032F /* Pods-iosvirtualassistantapp.release.xcconfig */; 641 | buildSettings = { 642 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 643 | FRAMEWORK_SEARCH_PATHS = ( 644 | "$(inherited)", 645 | "$(PROJECT_DIR)", 646 | ); 647 | INFOPLIST_FILE = iosapp/Info.plist; 648 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 649 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 650 | PRODUCT_BUNDLE_IDENTIFIER = com.ibm.iosvirtualassistantapp; 651 | PRODUCT_NAME = "$(TARGET_NAME)"; 652 | SWIFT_VERSION = 5.0; 653 | }; 654 | name = Release; 655 | }; 656 | 555C91D41D0F0731003E84E3 /* Debug */ = { 657 | isa = XCBuildConfiguration; 658 | baseConfigurationReference = ACEA392A2E3080911FA5B2A6 /* Pods-iosvirtualassistantappTests.debug.xcconfig */; 659 | buildSettings = { 660 | INFOPLIST_FILE = iosappTests/Info.plist; 661 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 662 | PRODUCT_BUNDLE_IDENTIFIER = com.ibm.iosappTests; 663 | PRODUCT_NAME = "$(TARGET_NAME)"; 664 | SWIFT_VERSION = 5.0; 665 | }; 666 | name = Debug; 667 | }; 668 | 555C91D51D0F0731003E84E3 /* Release */ = { 669 | isa = XCBuildConfiguration; 670 | baseConfigurationReference = DC07D8870FA641AC2946190A /* Pods-iosvirtualassistantappTests.release.xcconfig */; 671 | buildSettings = { 672 | INFOPLIST_FILE = iosappTests/Info.plist; 673 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 674 | PRODUCT_BUNDLE_IDENTIFIER = com.ibm.iosappTests; 675 | PRODUCT_NAME = "$(TARGET_NAME)"; 676 | SWIFT_VERSION = 5.0; 677 | }; 678 | name = Release; 679 | }; 680 | 555C91D71D0F0731003E84E3 /* Debug */ = { 681 | isa = XCBuildConfiguration; 682 | baseConfigurationReference = 266A6F8C6132C0DCFD16A8CC /* Pods-iosvirtualassistantappUITests.debug.xcconfig */; 683 | buildSettings = { 684 | INFOPLIST_FILE = iosappUITests/Info.plist; 685 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 686 | PRODUCT_BUNDLE_IDENTIFIER = com.ibm.iosappUITests; 687 | PRODUCT_NAME = "$(TARGET_NAME)"; 688 | PROVISIONING_PROFILE = ""; 689 | SWIFT_VERSION = 5.0; 690 | TEST_TARGET_NAME = iosapp; 691 | }; 692 | name = Debug; 693 | }; 694 | 555C91D81D0F0731003E84E3 /* Release */ = { 695 | isa = XCBuildConfiguration; 696 | baseConfigurationReference = 6B979C8A3C4008F48CEE9634 /* Pods-iosvirtualassistantappUITests.release.xcconfig */; 697 | buildSettings = { 698 | INFOPLIST_FILE = iosappUITests/Info.plist; 699 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 700 | PRODUCT_BUNDLE_IDENTIFIER = com.ibm.iosappUITests; 701 | PRODUCT_NAME = "$(TARGET_NAME)"; 702 | PROVISIONING_PROFILE = ""; 703 | SWIFT_VERSION = 5.0; 704 | TEST_TARGET_NAME = iosapp; 705 | }; 706 | name = Release; 707 | }; 708 | /* End XCBuildConfiguration section */ 709 | 710 | /* Begin XCConfigurationList section */ 711 | 555C91A31D0F0731003E84E3 /* Build configuration list for PBXProject "iosvirtualassistantapp" */ = { 712 | isa = XCConfigurationList; 713 | buildConfigurations = ( 714 | 555C91CE1D0F0731003E84E3 /* Debug */, 715 | 555C91CF1D0F0731003E84E3 /* Release */, 716 | ); 717 | defaultConfigurationIsVisible = 0; 718 | defaultConfigurationName = Release; 719 | }; 720 | 555C91D01D0F0731003E84E3 /* Build configuration list for PBXNativeTarget "iosvirtualassistantapp" */ = { 721 | isa = XCConfigurationList; 722 | buildConfigurations = ( 723 | 555C91D11D0F0731003E84E3 /* Debug */, 724 | 555C91D21D0F0731003E84E3 /* Release */, 725 | ); 726 | defaultConfigurationIsVisible = 0; 727 | defaultConfigurationName = Release; 728 | }; 729 | 555C91D31D0F0731003E84E3 /* Build configuration list for PBXNativeTarget "iosvirtualassistantappTests" */ = { 730 | isa = XCConfigurationList; 731 | buildConfigurations = ( 732 | 555C91D41D0F0731003E84E3 /* Debug */, 733 | 555C91D51D0F0731003E84E3 /* Release */, 734 | ); 735 | defaultConfigurationIsVisible = 0; 736 | defaultConfigurationName = Release; 737 | }; 738 | 555C91D61D0F0731003E84E3 /* Build configuration list for PBXNativeTarget "iosvirtualassistantappUITests" */ = { 739 | isa = XCConfigurationList; 740 | buildConfigurations = ( 741 | 555C91D71D0F0731003E84E3 /* Debug */, 742 | 555C91D81D0F0731003E84E3 /* Release */, 743 | ); 744 | defaultConfigurationIsVisible = 0; 745 | defaultConfigurationName = Release; 746 | }; 747 | /* End XCConfigurationList section */ 748 | }; 749 | rootObject = 555C91A01D0F0731003E84E3 /* Project object */; 750 | } 751 | --------------------------------------------------------------------------------