├── activity.png ├── xcode832.xcodeproj ├── xcuserdata │ └── pte05.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── xcode832.xcscheme ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── pte05.xcuserdatad │ │ ├── UserInterfaceState.xcuserstate │ │ └── IDEFindNavigatorScopes.plist └── project.pbxproj ├── xcode832UITests ├── Info.plist ├── helpers │ └── Helpers.swift └── xcode832UITests.swift ├── Service.swift ├── xcode832 ├── Info.plist ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── AppDelegate.swift └── ViewController.swift └── README.md /activity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mvemjsun/Xcode83/HEAD/activity.png -------------------------------------------------------------------------------- /xcode832.xcodeproj/xcuserdata/pte05.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /xcode832.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /xcode832.xcodeproj/project.xcworkspace/xcuserdata/pte05.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mvemjsun/Xcode83/HEAD/xcode832.xcodeproj/project.xcworkspace/xcuserdata/pte05.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /xcode832.xcodeproj/project.xcworkspace/xcuserdata/pte05.xcuserdatad/IDEFindNavigatorScopes.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /xcode832.xcodeproj/xcuserdata/pte05.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | xcode832.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D10FDE0B1ED82A860007A9E7 16 | 17 | primary 18 | 19 | 20 | D10FDE1F1ED82A860007A9E7 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /xcode832UITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSAppTransportSecurity 6 | 7 | NSAllowsArbitraryLoads 8 | 9 | 10 | CFBundleIdentifier 11 | $(PRODUCT_BUNDLE_IDENTIFIER) 12 | CFBundleShortVersionString 13 | 1.0 14 | CFBundleName 15 | $(PRODUCT_NAME) 16 | CFBundleInfoDictionaryVersion 17 | 6.0 18 | CFBundleDevelopmentRegion 19 | en 20 | CFBundleExecutable 21 | $(EXECUTABLE_NAME) 22 | CFBundlePackageType 23 | BNDL 24 | CFBundleVersion 25 | 1 26 | 27 | 28 | -------------------------------------------------------------------------------- /Service.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Service.swift 3 | // xcode832 4 | // 5 | // Created by mvemjsun on 31/05/2017. 6 | // Copyright © 2017 . All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct CountryData { 12 | var messages : Set = [] 13 | var name: String? 14 | var alpha2Code: String? 15 | var alpha3Code: String? 16 | } 17 | 18 | extension CountryData { 19 | 20 | init?(json: [String: Any]) { 21 | if let countryDataJson = json["RestResponse"] as? [String: Any] { 22 | let countryData = countryDataJson["result"] as? [String: Any] 23 | name = countryData?["name"] as? String 24 | alpha2Code = countryData?["alpha2_code"] as? String 25 | alpha3Code = countryData?["alpha3_code"] as? String 26 | for messageData in (countryDataJson["messages"] as? [String])! { 27 | messages.insert(messageData) 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /xcode832UITests/helpers/Helpers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Helpers.swift 3 | // xcode832UITests 4 | // 5 | // Created by mvemjsun on 12/06/2017. 6 | // Copyright © 2017 NowTV. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import XCTest 11 | 12 | extension XCTest { 13 | 14 | func Given(_ text: String, step: () -> Void ) { 15 | XCTContext.runActivity(named: #function + " " + text) { _ in 16 | step() 17 | } 18 | } 19 | 20 | func When(_ text: String, step: () -> Void ) { 21 | XCTContext.runActivity(named: #function + " " + text) { _ in 22 | step() 23 | } 24 | } 25 | 26 | func Then(_ text: String, step: () -> Void ) { 27 | XCTContext.runActivity(named: #function + " " + text) { _ in 28 | step() 29 | } 30 | } 31 | 32 | func And(_ text: String, step: () -> Void ) { 33 | XCTContext.runActivity(named: #function + " " + text) { _ in 34 | step() 35 | } 36 | } 37 | 38 | func But(_ text: String, step: () -> Void ) { 39 | XCTContext.runActivity(named: #function + " " + text) { _ in 40 | step() 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /xcode832/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | UILaunchStoryboardName 29 | LaunchScreen 30 | UIMainStoryboardFile 31 | Main 32 | UIRequiredDeviceCapabilities 33 | 34 | armv7 35 | 36 | UISupportedInterfaceOrientations 37 | 38 | UIInterfaceOrientationPortrait 39 | 40 | UISupportedInterfaceOrientations~ipad 41 | 42 | UIInterfaceOrientationPortrait 43 | UIInterfaceOrientationPortraitUpsideDown 44 | UIInterfaceOrientationLandscapeLeft 45 | UIInterfaceOrientationLandscapeRight 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /xcode832/Base.lproj/LaunchScreen.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 | -------------------------------------------------------------------------------- /xcode832/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /xcode832/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // xcode832 4 | // 5 | // Created by mvemjsun on 26/05/2017. 6 | // Copyright © 2017 . All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | static var resumedFromBackground = false 16 | 17 | 18 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 19 | // Override point for customization after application launch. 20 | return true 21 | } 22 | 23 | func applicationWillResignActive(_ application: UIApplication) { 24 | // 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. 25 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 26 | } 27 | 28 | func applicationDidEnterBackground(_ application: UIApplication) { 29 | // 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. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | AppDelegate.resumedFromBackground = true 32 | // print("applicationDidEnterBackground") 33 | } 34 | 35 | func applicationWillEnterForeground(_ application: UIApplication) { 36 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 37 | 38 | // print("applicationWillEnterForeground") 39 | } 40 | 41 | func applicationDidBecomeActive(_ application: UIApplication) { 42 | // 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. 43 | // print("applicationDidBecomeActive") 44 | } 45 | 46 | func applicationWillTerminate(_ application: UIApplication) { 47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 48 | } 49 | 50 | 51 | } 52 | 53 | -------------------------------------------------------------------------------- /xcode832/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // xcode832 4 | // 5 | // Created by mvemjsun on 26/05/2017. 6 | // Copyright © 2017. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | @IBOutlet weak var label: UILabel! 13 | 14 | @IBOutlet weak var textField: UITextField! 15 | 16 | @IBOutlet weak var buttonGetCountry: UIButton! 17 | 18 | @IBOutlet weak var countryInfo: UITextField! 19 | 20 | @IBOutlet weak var messages: UITextView! 21 | 22 | override func viewDidLoad() { 23 | super.viewDidLoad() 24 | // Do any additional setup after loading the view, typically from a nib. 25 | 26 | // Simulate a delay 27 | let when = DispatchTime.now() + 1 28 | DispatchQueue.main.asyncAfter(deadline: when) { 29 | self.label.text = "Country Name from ISO3 code" 30 | } 31 | 32 | // Simulate a delay 33 | let when2 = when + 1 34 | DispatchQueue.main.asyncAfter(deadline: when2) { 35 | self.textField.text = "Enter 3 letter Country Code" 36 | } 37 | } 38 | 39 | @IBAction func getCountryInfo(_ sender: UIButton) { 40 | if let cc = textField.text { 41 | getCountryDetails(country: cc.uppercased()) 42 | } else { 43 | countryInfo.text = "Please enter a 3 letter country code." 44 | } 45 | } 46 | 47 | @IBAction func editCountryCode(_ sender: Any) { 48 | textField.text = "" 49 | messages.text = "" 50 | countryInfo.text = "" 51 | } 52 | override func didReceiveMemoryWarning() { 53 | super.didReceiveMemoryWarning() 54 | // Dispose of any resources that can be recreated. 55 | } 56 | 57 | func getCountryDetails(country: String) { 58 | var url : URL 59 | 60 | if let safeUrl = URL(string: "http://services.groupkt.com/country/get/iso3code/" + country.uppercased()) { 61 | url = safeUrl 62 | 63 | let session = URLSession.shared 64 | let request = URLRequest(url: url) 65 | session.dataTask(with: request, completionHandler: completion).resume() 66 | } 67 | } 68 | 69 | func completion(data: Data?, response: URLResponse? , error: Error?) { 70 | if let data = data, 71 | let jsonData = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { 72 | let country = CountryData(json: jsonData!) 73 | let when = DispatchTime.now() + 1 74 | // Below done to simulate a delay 75 | DispatchQueue.main.asyncAfter(deadline: when) { 76 | self.countryInfo?.text = country?.name 77 | self.messages.text = country?.messages.first 78 | 79 | if let safeMessages = country?.messages { 80 | for message in safeMessages { 81 | self.messages.text = self.messages.text + " ," + message 82 | } 83 | } 84 | 85 | } 86 | 87 | print(String(describing: country)) 88 | } else { 89 | DispatchQueue.main.async { 90 | self.countryInfo.text = "Could not get data" 91 | } 92 | } 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /xcode832UITests/xcode832UITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // xcode832UITests.swift 3 | // xcode832UITests 4 | // 5 | // Created by mvemjsun on 26/05/2017. 6 | // Copyright © 2017 . All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class xcode832UITests: XCTestCase { 12 | 13 | override func setUp() { 14 | super.setUp() 15 | continueAfterFailure = false 16 | XCUIApplication().launch() 17 | } 18 | 19 | override func tearDown() { 20 | super.tearDown() 21 | } 22 | 23 | // Siri and Activities 24 | func testLaunchAndSendToBG() { 25 | let element1 = XCUIApplication().staticTexts["Country Name from ISO3 code"] 26 | let element2 = XCUIApplication().textFields["Enter 3 letter Country Code"] 27 | 28 | Given("I wait for the screen header to Appear") { _ in 29 | let result1 = waitForElementToExist(element: element1) 30 | XCTAssertTrue(result1) 31 | } 32 | 33 | When("I press the home button") { _ in 34 | XCUIDevice.shared().press(XCUIDeviceButton.home) 35 | } 36 | 37 | And("I ask Siri to open my App") { _ in 38 | XCUIDevice.shared().siriService.activate(voiceRecognitionText: "open xcode832") 39 | } 40 | 41 | Then("I should see the text Enter 3 letter Country Code") { _ in 42 | let result2 = waitForElementToExist(element: element2) 43 | XCTAssertTrue(result2) 44 | } 45 | } 46 | 47 | // Screen shots 48 | func testGetAValidCountryCode() { 49 | let countryCodeTextInputElement = XCUIApplication().textFields.matching(identifier: "countryCodeField").element(boundBy: 0) 50 | let countryDescription = XCUIApplication().textFields["Australia"] 51 | let getInfoButton = XCUIApplication().buttons.matching(identifier: "getCountryInfo").element(boundBy: 0) 52 | let readyToInput = XCUIApplication().staticTexts["Enter 3 letter Country Code"] 53 | 54 | _ = waitForElementToExist(element: readyToInput) 55 | countryCodeTextInputElement.tap() 56 | countryCodeTextInputElement.typeText("AUS") 57 | getInfoButton.tap() 58 | XCTAssertTrue(waitForElementToExist(element: countryDescription)) 59 | 60 | // Capture Screenshot 61 | XCTContext.runActivity(named: "Capture screenshot") { activity in 62 | let screen = XCUIScreen.main 63 | let screenShot = screen.screenshot() 64 | let attachment = XCTAttachment(screenshot: screenShot) 65 | attachment.lifetime = .keepAlways // Keep even if test fails, else xcode deletes it. 66 | activity.add(attachment) 67 | } 68 | } 69 | 70 | func testGetAnInvalidCountryCode() { 71 | let countryCodeTextInputElement = XCUIApplication().textFields.matching(identifier: "countryCodeField").element(boundBy: 0) 72 | let readyToInput = XCUIApplication().staticTexts["Enter 3 letter Country Code"] 73 | let getInfoButton = XCUIApplication().buttons.matching(identifier: "getCountryInfo").element(boundBy: 0) 74 | 75 | _ = waitForElementToExist(element: readyToInput) 76 | countryCodeTextInputElement.tap() 77 | countryCodeTextInputElement.typeText("XXX") 78 | getInfoButton.tap() 79 | } 80 | 81 | // Waiting for expectations 82 | func waitForElementToExist(element e: XCUIElement) -> Bool { 83 | let p = NSPredicate(format: "exists == true") 84 | let e1 = XCTNSPredicateExpectation(predicate: p, object: e) 85 | let result = XCTWaiter.wait(for: [e1], timeout: 10) 86 | return (result == .completed) 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /xcode832.xcodeproj/xcuserdata/pte05.xcuserdatad/xcschemes/xcode832.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sample XCode project demonstrating new UITesting features in XCode 8.3/9 2 | 3 | The sample app is a very simple app that demonstrates some of the interesting new features of the XCode 8.3 (and onwards) UI testing API. The app screen loads a lable whose text changes asynchronously to simulate a delay. There are 2 text fields , one to enter a 3 letter country code and another that displays its name from the API. There is a text view to display informational message and finally a button. The API http://services.groupkt.com/country/get/iso3code is used to retrieve country code info. 4 | 5 | ## Siri Service and Activities 6 | 7 | The Siri service API now helps to integrate the AI features of iOS for use to UI testing. One of the immidiate uses of this API is to bring the App to the foreground from background without needing to relaunch the app. App features that rely on backgrounding and foregrounding can now easily be tested. 8 | 9 | [Siri API] (https://developer.apple.com/reference/xctest/xcuisiriservice) 10 | 11 | ```swift 12 | 13 | func testLaunchAndSendToBG() { 14 | let element1 = XCUIApplication().staticTexts["Country Name from ISO3 code"] 15 | let element2 = XCUIApplication().textFields["Enter 3 letter Country Code"] 16 | 17 | Given("I wait for the screen header to Appear") { _ in 18 | let result1 = waitForElementToExist(element: element1) 19 | XCTAssertTrue(result1) 20 | } 21 | 22 | When("I press the home button") { _ in 23 | XCUIDevice.shared().press(XCUIDeviceButton.home) 24 | } 25 | 26 | And("I ask Siri to open my App") { _ in 27 | XCUIDevice.shared().siriService.activate(voiceRecognitionText: "open xcode832") 28 | } 29 | 30 | Then("I should see the text Enter 3 letter Country Code") { _ in 31 | let result2 = waitForElementToExist(element: element2) 32 | XCTAssertTrue(result2) 33 | } 34 | } 35 | 36 | // Gherkin style Wrapper around `XCTContext.runActivity` 37 | 38 | import Foundation 39 | import XCTest 40 | 41 | extension XCTest { 42 | 43 | func Given(_ text: String, step: () -> Void ) { 44 | XCTContext.runActivity(named: #function + " " + text) { _ in 45 | step() 46 | } 47 | } 48 | 49 | func When(_ text: String, step: () -> Void ) { 50 | XCTContext.runActivity(named: #function + " " + text) { _ in 51 | step() 52 | } 53 | } 54 | 55 | func Then(_ text: String, step: () -> Void ) { 56 | XCTContext.runActivity(named: #function + " " + text) { _ in 57 | step() 58 | } 59 | } 60 | 61 | func And(_ text: String, step: () -> Void ) { 62 | XCTContext.runActivity(named: #function + " " + text) { _ in 63 | step() 64 | } 65 | } 66 | 67 | func But(_ text: String, step: () -> Void ) { 68 | XCTContext.runActivity(named: #function + " " + text) { _ in 69 | step() 70 | } 71 | } 72 | } 73 | ``` 74 | 75 | ![](https://github.com/mvemjsun/Xcode83/blob/master/activity.png?raw=true) 76 | 77 | The above code also demonstrates the use of `Activities` that allow us to group a group of statements in a named block of code. This causes the test result report to be formatted in a more conscise way so that its more readable. 78 | 79 | ## Waiting APIs 80 | The new version of XCode and XCTest has introduced new waiting API's that let us wait for an array of expectations. Its also possible to use this so that the order in which the expectations are satistfied is also checked. 81 | 82 | [Waiting API] (https://developer.apple.com/reference/xctest/xctwaiter) 83 | 84 | ```swift 85 | func waitFor(element e: XCUIElement) -> Bool { 86 | let p = NSPredicate(format: "exists == true") 87 | let e1 = XCTNSPredicateExpectation(predicate: p, object: e) 88 | let result = XCTWaiter.wait(for: [e1], timeout: 10) 89 | return (result == .completed) 90 | } 91 | ``` 92 | 93 | ## Screenshots & Attachments 94 | Screenshots can now be taken using the new APIs. Xcode deletes screenshots if the tests are success bu default, how ever this can be overridded through APIs. The API offers to capture screenshots of the whole screen or of an individual UI element. 95 | 96 | [Screenshot API] (https://developer.apple.com/documentation/xctest/xcuiscreen) 97 | ``````swift 98 | func testGetAValidCountryCode() { 99 | let countryCodeTextInputElement = XCUIApplication().textFields.matching(identifier: "countryCodeField").element(boundBy: 0) 100 | let countryDescription = XCUIApplication().textFields["Australia"] 101 | let getInfoButton = XCUIApplication().buttons.matching(identifier: "getCountryInfo").element(boundBy: 0) 102 | let readyToInput = XCUIApplication().staticTexts["Enter 3 letter Country Code"] 103 | 104 | _ = waitForElementToExist(element: readyToInput) 105 | countryCodeTextInputElement.tap() 106 | countryCodeTextInputElement.typeText("AUS") 107 | getInfoButton.tap() 108 | XCTAssertTrue(waitForElementToExist(element: countryDescription)) 109 | 110 | // Capture Screenshot 111 | XCTContext.runActivity(named: "Capture screenshot") { activity in 112 | let screen = XCUIScreen.main 113 | let screenShot = screen.screenshot() 114 | let attachment = XCTAttachment(screenshot: screenShot) 115 | attachment.lifetime = .keepAlways // Keep even if test fails, else xcode deletes it. 116 | activity.add(attachment) 117 | } 118 | } 119 | `````` 120 | -------------------------------------------------------------------------------- /xcode832/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 | 45 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /xcode832.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D10FDE101ED82A860007A9E7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10FDE0F1ED82A860007A9E7 /* AppDelegate.swift */; }; 11 | D10FDE121ED82A860007A9E7 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10FDE111ED82A860007A9E7 /* ViewController.swift */; }; 12 | D10FDE151ED82A860007A9E7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D10FDE131ED82A860007A9E7 /* Main.storyboard */; }; 13 | D10FDE171ED82A860007A9E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D10FDE161ED82A860007A9E7 /* Assets.xcassets */; }; 14 | D10FDE1A1ED82A860007A9E7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D10FDE181ED82A860007A9E7 /* LaunchScreen.storyboard */; }; 15 | D10FDE251ED82A860007A9E7 /* xcode832UITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10FDE241ED82A860007A9E7 /* xcode832UITests.swift */; }; 16 | D11F31DB1EDEEAFE006C91AC /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = D11F31DA1EDEEAFE006C91AC /* Service.swift */; }; 17 | D1959F3F1EE19FC50063EF99 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = D1959F3E1EE19FC50063EF99 /* README.md */; }; 18 | D1B4AD461EEEF740001315C7 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1B4AD451EEEF740001315C7 /* Helpers.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | D10FDE211ED82A860007A9E7 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = D10FDE041ED82A860007A9E7 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = D10FDE0B1ED82A860007A9E7; 27 | remoteInfo = xcode832; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | D10FDE0C1ED82A860007A9E7 /* xcode832.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = xcode832.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | D10FDE0F1ED82A860007A9E7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 34 | D10FDE111ED82A860007A9E7 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 35 | D10FDE141ED82A860007A9E7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 36 | D10FDE161ED82A860007A9E7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 37 | D10FDE191ED82A860007A9E7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 38 | D10FDE1B1ED82A860007A9E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | D10FDE201ED82A860007A9E7 /* xcode832UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = xcode832UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | D10FDE241ED82A860007A9E7 /* xcode832UITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = xcode832UITests.swift; sourceTree = ""; }; 41 | D10FDE261ED82A860007A9E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 42 | D11F31DA1EDEEAFE006C91AC /* Service.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; 43 | D1959F3E1EE19FC50063EF99 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 44 | D1B4AD451EEEF740001315C7 /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | D10FDE091ED82A860007A9E7 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | D10FDE1D1ED82A860007A9E7 /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | /* End PBXFrameworksBuildPhase section */ 63 | 64 | /* Begin PBXGroup section */ 65 | D10FDE031ED82A860007A9E7 = { 66 | isa = PBXGroup; 67 | children = ( 68 | D1959F3E1EE19FC50063EF99 /* README.md */, 69 | D11F31D91EDEEA84006C91AC /* classes */, 70 | D10FDE0E1ED82A860007A9E7 /* xcode832 */, 71 | D10FDE231ED82A860007A9E7 /* xcode832UITests */, 72 | D10FDE0D1ED82A860007A9E7 /* Products */, 73 | ); 74 | sourceTree = ""; 75 | }; 76 | D10FDE0D1ED82A860007A9E7 /* Products */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | D10FDE0C1ED82A860007A9E7 /* xcode832.app */, 80 | D10FDE201ED82A860007A9E7 /* xcode832UITests.xctest */, 81 | ); 82 | name = Products; 83 | sourceTree = ""; 84 | }; 85 | D10FDE0E1ED82A860007A9E7 /* xcode832 */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | D10FDE0F1ED82A860007A9E7 /* AppDelegate.swift */, 89 | D10FDE111ED82A860007A9E7 /* ViewController.swift */, 90 | D10FDE131ED82A860007A9E7 /* Main.storyboard */, 91 | D10FDE161ED82A860007A9E7 /* Assets.xcassets */, 92 | D10FDE181ED82A860007A9E7 /* LaunchScreen.storyboard */, 93 | D10FDE1B1ED82A860007A9E7 /* Info.plist */, 94 | ); 95 | path = xcode832; 96 | sourceTree = ""; 97 | }; 98 | D10FDE231ED82A860007A9E7 /* xcode832UITests */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | D1B4AD441EEEF720001315C7 /* helpers */, 102 | D10FDE241ED82A860007A9E7 /* xcode832UITests.swift */, 103 | D10FDE261ED82A860007A9E7 /* Info.plist */, 104 | ); 105 | path = xcode832UITests; 106 | sourceTree = ""; 107 | }; 108 | D11F31D91EDEEA84006C91AC /* classes */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | D11F31DA1EDEEAFE006C91AC /* Service.swift */, 112 | ); 113 | name = classes; 114 | sourceTree = ""; 115 | }; 116 | D1B4AD441EEEF720001315C7 /* helpers */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | D1B4AD451EEEF740001315C7 /* Helpers.swift */, 120 | ); 121 | path = helpers; 122 | sourceTree = ""; 123 | }; 124 | /* End PBXGroup section */ 125 | 126 | /* Begin PBXNativeTarget section */ 127 | D10FDE0B1ED82A860007A9E7 /* xcode832 */ = { 128 | isa = PBXNativeTarget; 129 | buildConfigurationList = D10FDE291ED82A860007A9E7 /* Build configuration list for PBXNativeTarget "xcode832" */; 130 | buildPhases = ( 131 | D10FDE081ED82A860007A9E7 /* Sources */, 132 | D10FDE091ED82A860007A9E7 /* Frameworks */, 133 | D10FDE0A1ED82A860007A9E7 /* Resources */, 134 | ); 135 | buildRules = ( 136 | ); 137 | dependencies = ( 138 | ); 139 | name = xcode832; 140 | productName = xcode832; 141 | productReference = D10FDE0C1ED82A860007A9E7 /* xcode832.app */; 142 | productType = "com.apple.product-type.application"; 143 | }; 144 | D10FDE1F1ED82A860007A9E7 /* xcode832UITests */ = { 145 | isa = PBXNativeTarget; 146 | buildConfigurationList = D10FDE2C1ED82A860007A9E7 /* Build configuration list for PBXNativeTarget "xcode832UITests" */; 147 | buildPhases = ( 148 | D10FDE1C1ED82A860007A9E7 /* Sources */, 149 | D10FDE1D1ED82A860007A9E7 /* Frameworks */, 150 | D10FDE1E1ED82A860007A9E7 /* Resources */, 151 | ); 152 | buildRules = ( 153 | ); 154 | dependencies = ( 155 | D10FDE221ED82A860007A9E7 /* PBXTargetDependency */, 156 | ); 157 | name = xcode832UITests; 158 | productName = xcode832UITests; 159 | productReference = D10FDE201ED82A860007A9E7 /* xcode832UITests.xctest */; 160 | productType = "com.apple.product-type.bundle.ui-testing"; 161 | }; 162 | /* End PBXNativeTarget section */ 163 | 164 | /* Begin PBXProject section */ 165 | D10FDE041ED82A860007A9E7 /* Project object */ = { 166 | isa = PBXProject; 167 | attributes = { 168 | LastSwiftUpdateCheck = 0830; 169 | LastUpgradeCheck = 0830; 170 | ORGANIZATIONNAME = NowTV; 171 | TargetAttributes = { 172 | D10FDE0B1ED82A860007A9E7 = { 173 | CreatedOnToolsVersion = 8.3.2; 174 | DevelopmentTeam = 6EH25JGH8T; 175 | ProvisioningStyle = Automatic; 176 | }; 177 | D10FDE1F1ED82A860007A9E7 = { 178 | CreatedOnToolsVersion = 8.3.2; 179 | DevelopmentTeam = 6EH25JGH8T; 180 | ProvisioningStyle = Automatic; 181 | TestTargetID = D10FDE0B1ED82A860007A9E7; 182 | }; 183 | }; 184 | }; 185 | buildConfigurationList = D10FDE071ED82A860007A9E7 /* Build configuration list for PBXProject "xcode832" */; 186 | compatibilityVersion = "Xcode 3.2"; 187 | developmentRegion = English; 188 | hasScannedForEncodings = 0; 189 | knownRegions = ( 190 | en, 191 | Base, 192 | ); 193 | mainGroup = D10FDE031ED82A860007A9E7; 194 | productRefGroup = D10FDE0D1ED82A860007A9E7 /* Products */; 195 | projectDirPath = ""; 196 | projectRoot = ""; 197 | targets = ( 198 | D10FDE0B1ED82A860007A9E7 /* xcode832 */, 199 | D10FDE1F1ED82A860007A9E7 /* xcode832UITests */, 200 | ); 201 | }; 202 | /* End PBXProject section */ 203 | 204 | /* Begin PBXResourcesBuildPhase section */ 205 | D10FDE0A1ED82A860007A9E7 /* Resources */ = { 206 | isa = PBXResourcesBuildPhase; 207 | buildActionMask = 2147483647; 208 | files = ( 209 | D10FDE1A1ED82A860007A9E7 /* LaunchScreen.storyboard in Resources */, 210 | D10FDE171ED82A860007A9E7 /* Assets.xcassets in Resources */, 211 | D10FDE151ED82A860007A9E7 /* Main.storyboard in Resources */, 212 | ); 213 | runOnlyForDeploymentPostprocessing = 0; 214 | }; 215 | D10FDE1E1ED82A860007A9E7 /* Resources */ = { 216 | isa = PBXResourcesBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | ); 220 | runOnlyForDeploymentPostprocessing = 0; 221 | }; 222 | /* End PBXResourcesBuildPhase section */ 223 | 224 | /* Begin PBXSourcesBuildPhase section */ 225 | D10FDE081ED82A860007A9E7 /* Sources */ = { 226 | isa = PBXSourcesBuildPhase; 227 | buildActionMask = 2147483647; 228 | files = ( 229 | D10FDE121ED82A860007A9E7 /* ViewController.swift in Sources */, 230 | D10FDE101ED82A860007A9E7 /* AppDelegate.swift in Sources */, 231 | D1959F3F1EE19FC50063EF99 /* README.md in Sources */, 232 | D11F31DB1EDEEAFE006C91AC /* Service.swift in Sources */, 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | D10FDE1C1ED82A860007A9E7 /* Sources */ = { 237 | isa = PBXSourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | D10FDE251ED82A860007A9E7 /* xcode832UITests.swift in Sources */, 241 | D1B4AD461EEEF740001315C7 /* Helpers.swift in Sources */, 242 | ); 243 | runOnlyForDeploymentPostprocessing = 0; 244 | }; 245 | /* End PBXSourcesBuildPhase section */ 246 | 247 | /* Begin PBXTargetDependency section */ 248 | D10FDE221ED82A860007A9E7 /* PBXTargetDependency */ = { 249 | isa = PBXTargetDependency; 250 | target = D10FDE0B1ED82A860007A9E7 /* xcode832 */; 251 | targetProxy = D10FDE211ED82A860007A9E7 /* PBXContainerItemProxy */; 252 | }; 253 | /* End PBXTargetDependency section */ 254 | 255 | /* Begin PBXVariantGroup section */ 256 | D10FDE131ED82A860007A9E7 /* Main.storyboard */ = { 257 | isa = PBXVariantGroup; 258 | children = ( 259 | D10FDE141ED82A860007A9E7 /* Base */, 260 | ); 261 | name = Main.storyboard; 262 | sourceTree = ""; 263 | }; 264 | D10FDE181ED82A860007A9E7 /* LaunchScreen.storyboard */ = { 265 | isa = PBXVariantGroup; 266 | children = ( 267 | D10FDE191ED82A860007A9E7 /* Base */, 268 | ); 269 | name = LaunchScreen.storyboard; 270 | sourceTree = ""; 271 | }; 272 | /* End PBXVariantGroup section */ 273 | 274 | /* Begin XCBuildConfiguration section */ 275 | D10FDE271ED82A860007A9E7 /* Debug */ = { 276 | isa = XCBuildConfiguration; 277 | buildSettings = { 278 | ALWAYS_SEARCH_USER_PATHS = NO; 279 | CLANG_ANALYZER_NONNULL = YES; 280 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 281 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 282 | CLANG_CXX_LIBRARY = "libc++"; 283 | CLANG_ENABLE_MODULES = YES; 284 | CLANG_ENABLE_OBJC_ARC = YES; 285 | CLANG_WARN_BOOL_CONVERSION = YES; 286 | CLANG_WARN_CONSTANT_CONVERSION = YES; 287 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 288 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 289 | CLANG_WARN_EMPTY_BODY = YES; 290 | CLANG_WARN_ENUM_CONVERSION = YES; 291 | CLANG_WARN_INFINITE_RECURSION = YES; 292 | CLANG_WARN_INT_CONVERSION = YES; 293 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 294 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 295 | CLANG_WARN_UNREACHABLE_CODE = YES; 296 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 297 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 298 | COPY_PHASE_STRIP = NO; 299 | DEBUG_INFORMATION_FORMAT = dwarf; 300 | ENABLE_STRICT_OBJC_MSGSEND = YES; 301 | ENABLE_TESTABILITY = YES; 302 | GCC_C_LANGUAGE_STANDARD = gnu99; 303 | GCC_DYNAMIC_NO_PIC = NO; 304 | GCC_NO_COMMON_BLOCKS = YES; 305 | GCC_OPTIMIZATION_LEVEL = 0; 306 | GCC_PREPROCESSOR_DEFINITIONS = ( 307 | "DEBUG=1", 308 | "$(inherited)", 309 | ); 310 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 311 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 312 | GCC_WARN_UNDECLARED_SELECTOR = YES; 313 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 314 | GCC_WARN_UNUSED_FUNCTION = YES; 315 | GCC_WARN_UNUSED_VARIABLE = YES; 316 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 317 | MTL_ENABLE_DEBUG_INFO = YES; 318 | ONLY_ACTIVE_ARCH = YES; 319 | SDKROOT = iphoneos; 320 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 321 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 322 | TARGETED_DEVICE_FAMILY = "1,2"; 323 | }; 324 | name = Debug; 325 | }; 326 | D10FDE281ED82A860007A9E7 /* Release */ = { 327 | isa = XCBuildConfiguration; 328 | buildSettings = { 329 | ALWAYS_SEARCH_USER_PATHS = NO; 330 | CLANG_ANALYZER_NONNULL = YES; 331 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 332 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 333 | CLANG_CXX_LIBRARY = "libc++"; 334 | CLANG_ENABLE_MODULES = YES; 335 | CLANG_ENABLE_OBJC_ARC = YES; 336 | CLANG_WARN_BOOL_CONVERSION = YES; 337 | CLANG_WARN_CONSTANT_CONVERSION = YES; 338 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 339 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 340 | CLANG_WARN_EMPTY_BODY = YES; 341 | CLANG_WARN_ENUM_CONVERSION = YES; 342 | CLANG_WARN_INFINITE_RECURSION = YES; 343 | CLANG_WARN_INT_CONVERSION = YES; 344 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 345 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 346 | CLANG_WARN_UNREACHABLE_CODE = YES; 347 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 348 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 349 | COPY_PHASE_STRIP = NO; 350 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 351 | ENABLE_NS_ASSERTIONS = NO; 352 | ENABLE_STRICT_OBJC_MSGSEND = YES; 353 | GCC_C_LANGUAGE_STANDARD = gnu99; 354 | GCC_NO_COMMON_BLOCKS = YES; 355 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 356 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 357 | GCC_WARN_UNDECLARED_SELECTOR = YES; 358 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 359 | GCC_WARN_UNUSED_FUNCTION = YES; 360 | GCC_WARN_UNUSED_VARIABLE = YES; 361 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 362 | MTL_ENABLE_DEBUG_INFO = NO; 363 | SDKROOT = iphoneos; 364 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 365 | TARGETED_DEVICE_FAMILY = "1,2"; 366 | VALIDATE_PRODUCT = YES; 367 | }; 368 | name = Release; 369 | }; 370 | D10FDE2A1ED82A860007A9E7 /* Debug */ = { 371 | isa = XCBuildConfiguration; 372 | buildSettings = { 373 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 374 | DEVELOPMENT_TEAM = 6EH25JGH8T; 375 | INFOPLIST_FILE = xcode832/Info.plist; 376 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 377 | PRODUCT_BUNDLE_IDENTIFIER = uk.bskyb.xcode832; 378 | PRODUCT_NAME = "$(TARGET_NAME)"; 379 | SWIFT_VERSION = 3.0; 380 | }; 381 | name = Debug; 382 | }; 383 | D10FDE2B1ED82A860007A9E7 /* Release */ = { 384 | isa = XCBuildConfiguration; 385 | buildSettings = { 386 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 387 | DEVELOPMENT_TEAM = 6EH25JGH8T; 388 | INFOPLIST_FILE = xcode832/Info.plist; 389 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 390 | PRODUCT_BUNDLE_IDENTIFIER = uk.bskyb.xcode832; 391 | PRODUCT_NAME = "$(TARGET_NAME)"; 392 | SWIFT_VERSION = 3.0; 393 | }; 394 | name = Release; 395 | }; 396 | D10FDE2D1ED82A860007A9E7 /* Debug */ = { 397 | isa = XCBuildConfiguration; 398 | buildSettings = { 399 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 400 | DEVELOPMENT_TEAM = 6EH25JGH8T; 401 | INFOPLIST_FILE = xcode832UITests/Info.plist; 402 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 403 | PRODUCT_BUNDLE_IDENTIFIER = uk.bskyb.xcode832UITests; 404 | PRODUCT_NAME = "$(TARGET_NAME)"; 405 | SWIFT_VERSION = 3.0; 406 | TEST_TARGET_NAME = xcode832; 407 | }; 408 | name = Debug; 409 | }; 410 | D10FDE2E1ED82A860007A9E7 /* Release */ = { 411 | isa = XCBuildConfiguration; 412 | buildSettings = { 413 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 414 | DEVELOPMENT_TEAM = 6EH25JGH8T; 415 | INFOPLIST_FILE = xcode832UITests/Info.plist; 416 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 417 | PRODUCT_BUNDLE_IDENTIFIER = uk.bskyb.xcode832UITests; 418 | PRODUCT_NAME = "$(TARGET_NAME)"; 419 | SWIFT_VERSION = 3.0; 420 | TEST_TARGET_NAME = xcode832; 421 | }; 422 | name = Release; 423 | }; 424 | /* End XCBuildConfiguration section */ 425 | 426 | /* Begin XCConfigurationList section */ 427 | D10FDE071ED82A860007A9E7 /* Build configuration list for PBXProject "xcode832" */ = { 428 | isa = XCConfigurationList; 429 | buildConfigurations = ( 430 | D10FDE271ED82A860007A9E7 /* Debug */, 431 | D10FDE281ED82A860007A9E7 /* Release */, 432 | ); 433 | defaultConfigurationIsVisible = 0; 434 | defaultConfigurationName = Release; 435 | }; 436 | D10FDE291ED82A860007A9E7 /* Build configuration list for PBXNativeTarget "xcode832" */ = { 437 | isa = XCConfigurationList; 438 | buildConfigurations = ( 439 | D10FDE2A1ED82A860007A9E7 /* Debug */, 440 | D10FDE2B1ED82A860007A9E7 /* Release */, 441 | ); 442 | defaultConfigurationIsVisible = 0; 443 | defaultConfigurationName = Release; 444 | }; 445 | D10FDE2C1ED82A860007A9E7 /* Build configuration list for PBXNativeTarget "xcode832UITests" */ = { 446 | isa = XCConfigurationList; 447 | buildConfigurations = ( 448 | D10FDE2D1ED82A860007A9E7 /* Debug */, 449 | D10FDE2E1ED82A860007A9E7 /* Release */, 450 | ); 451 | defaultConfigurationIsVisible = 0; 452 | defaultConfigurationName = Release; 453 | }; 454 | /* End XCConfigurationList section */ 455 | }; 456 | rootObject = D10FDE041ED82A860007A9E7 /* Project object */; 457 | } 458 | --------------------------------------------------------------------------------