├── .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://cloud.ibm.com)
8 | [](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 | 
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 | 
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 | 
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 | 
113 |
114 | > A full walkthrough of a sample conversation.
115 |
116 | 
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 |
--------------------------------------------------------------------------------