diff --git a/App/AppDelegate.swift b/App/AppDelegate.swift index 76d6f4d..88b42f7 100644 --- a/App/AppDelegate.swift +++ b/App/AppDelegate.swift @@ -17,7 +17,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var endpointProvider = EndpointProvider() - func application(_ app: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? = nil) -> Bool { + func application(_ app: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { let splitViewController = self.window!.rootViewController as! UISplitViewController let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.endIndex-1] as! UINavigationController splitViewController.delegate = navigationController.topViewController as! DetailViewController @@ -36,7 +36,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } // You need this for Safari and Safari Web View Controller to work - func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { guard let smart = endpointProvider.activeEndpoint?.client else { window?.rootViewController?.show(error: AppError.noActiveEndpoint, title: "Not Set Up") return false diff --git a/App/Bundle+Utilities.swift b/App/Bundle+Utilities.swift index 3ebf65c..592c4f9 100644 --- a/App/Bundle+Utilities.swift +++ b/App/Bundle+Utilities.swift @@ -27,6 +27,6 @@ extension SMART.Bundle { */ func entries(ofType type: T.Type, typeName name: String) -> [Resource]? { //print("===> Filtering for type \(T.self) [\(name)]") - return entry?.filter() { return nil != $0.resource && type(of: $0.resource!).resourceType == name }.map() { return $0.resource! } + return entry?.filter() { return nil != $0.resource && Swift.type(of: $0.resource!).resourceType == name }.map() { return $0.resource! } } } diff --git a/App/DetailViewController.swift b/App/DetailViewController.swift index cb61205..2273651 100644 --- a/App/DetailViewController.swift +++ b/App/DetailViewController.swift @@ -13,16 +13,11 @@ import SMART class DetailViewController: UIViewController, UISplitViewControllerDelegate { @IBOutlet var detailDescriptionLabel: UILabel? - var masterPopoverController: UIPopoverController? = nil /// The prescription to show details about var resource: Resource? { didSet { configureView() - - if masterPopoverController != nil { - masterPopoverController!.dismiss(animated: true) - } } } @@ -41,7 +36,7 @@ class DetailViewController: UIViewController, UISplitViewControllerDelegate { } } else { - var style = UIFontTextStyle.headline + var style = UIFont.TextStyle.headline if #available(iOS 9, *) { style = .title1 } @@ -49,8 +44,8 @@ class DetailViewController: UIViewController, UISplitViewControllerDelegate { p.alignment = .center p.paragraphSpacingBefore = 200.0 let attr = NSAttributedString(string: "Select a FHIR Resource first", attributes: [ - NSFontAttributeName: UIFont.preferredFont(forTextStyle: style), - NSParagraphStyleAttributeName: p, + NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: style), + NSAttributedString.Key.paragraphStyle: p, ]) label.attributedText = attr } @@ -64,16 +59,9 @@ class DetailViewController: UIViewController, UISplitViewControllerDelegate { // MARK: - Split view - internal func splitViewController(_ splitController: UISplitViewController, willHide viewController: UIViewController, with barButtonItem: UIBarButtonItem, for popoverController: UIPopoverController) { - barButtonItem.title = "Resources" // NSLocalizedString(@"Resources", @"Resources") - self.navigationItem.setLeftBarButton(barButtonItem, animated: true) - self.masterPopoverController = popoverController - } - func splitViewController(_ splitController: UISplitViewController, willShow viewController: UIViewController, invalidating barButtonItem: UIBarButtonItem) { // Called when the view is shown again in the split view, invalidating the button and popover controller. self.navigationItem.setLeftBarButton(nil, animated: true) - self.masterPopoverController = nil } func splitViewController(_ splitController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { diff --git a/App/EndpointListViewController.swift b/App/EndpointListViewController.swift index 68cc1df..d86c164 100644 --- a/App/EndpointListViewController.swift +++ b/App/EndpointListViewController.swift @@ -60,7 +60,7 @@ class EndpointListViewController: UITableViewController { class EndpointCell: UITableViewCell { - override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .subtitle, reuseIdentifier: reuseIdentifier) } diff --git a/App/EndpointProvider.swift b/App/EndpointProvider.swift index 634c75d..6a74fa7 100644 --- a/App/EndpointProvider.swift +++ b/App/EndpointProvider.swift @@ -67,13 +67,13 @@ public class EndpointProvider { CareTeam.self, Condition.self, DiagnosticReport.self, -// DocumentReference.self, + DocumentReference.self, Goal.self, Immunization.self, MedicationRequest.self, Observation.self, Procedure.self, - ReferralRequest.self + ServiceRequest.self ] } } diff --git a/App/Images.xcassets/AppIcon.appiconset/Contents.json b/App/Images.xcassets/AppIcon.appiconset/Contents.json index dd95d60..5121c43 100644 --- a/App/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/App/Images.xcassets/AppIcon.appiconset/Contents.json @@ -101,6 +101,11 @@ "idiom" : "ipad", "filename" : "Icon-83.5@2x.png", "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/App/LenientClient.swift b/App/LenientClient.swift new file mode 100644 index 0000000..46d5405 --- /dev/null +++ b/App/LenientClient.swift @@ -0,0 +1,74 @@ +// +// LenientClient.swift +// CareGuide +// +// Created by Dave Carlson on 1/14/19. +// Copyright © 2019 Clinical Cloud Solutions, LLC. All rights reserved. +// + +import Foundation +import SMART + +/** +A client that defaults to lenient validation, where JSON validation errors are tolerated when receiving a response, +i.e. don't throw upon instantiation, use what's provided. +*/ +public class LenientClient: Client { + + /// Which options to apply. + open var options: FHIRRequestOption = .lenient + + public convenience init(baseURL: URL, settings: OAuth2JSON) { + var sett = settings + if let redirect = settings["redirect"] as? String { + sett["redirect_uris"] = [redirect] + } + if nil == settings["title"] { + sett["title"] = "SMART" + } + let srv = LenientServer(baseURL: baseURL, auth: sett) + self.init(server: srv) + } + + /** + Request a JSON resource at the given path from the client's server. + + - parameter path: The path relative to the server's base URL to request + - parameter callback: The callback to execute once the request finishes + */ + override public func getJSON(at path: String, callback: @escaping ((_ response: FHIRServerJSONResponse) -> Void)) { + let handler = FHIRJSONRequestHandler(.GET) + handler.options = options + server.performRequest(against: path, handler: handler, callback: { response in + callback(response as! FHIRServerJSONResponse) + }) + } + +} + +/** +A server that defaults to lenient validation, where JSON validation errors are tolerated when receiving a response, +i.e. don't throw upon instantiation, use what's provided. +*/ +public class LenientServer: Server { + + /// Which options to apply. + open var options: FHIRRequestOption = .lenient + + /** + The server can return the appropriate request handler for the type and resource combination. + + Request handlers are responsible for constructing an URLRequest that correctly performs the desired REST interaction. + + - parameter method: The request method (GET, PUT, POST or DELETE) + - parameter resource: The resource to be involved in the request, if any + + - returns: An appropriate `FHIRRequestHandler`, for example a _FHIRJSONRequestHandler_ if sending and receiving JSON + */ + override public func handlerForRequest(withMethod method: FHIRRequestMethod, resource: Resource?) -> FHIRRequestHandler? { + let handler = FHIRJSONRequestHandler(method, resource: resource) + handler.options = options + return handler + } + +} diff --git a/App/MasterViewController.swift b/App/MasterViewController.swift index 2e06ec5..0f2dbf4 100644 --- a/App/MasterViewController.swift +++ b/App/MasterViewController.swift @@ -95,7 +95,7 @@ class MasterViewController: UITableViewController { } func spinningSpinner() -> UIActivityIndicatorView { - let activity = UIActivityIndicatorView(activityIndicatorStyle: .gray) + let activity = UIActivityIndicatorView(style: .gray) activity.isUserInteractionEnabled = false activity.startAnimating() return activity @@ -178,7 +178,7 @@ class MasterViewController: UITableViewController { } } - func cancelPatientSelection() { + @objc func cancelPatientSelection() { endpointProvider?.cancelPatientSelect() connectButtonTitle = previousConnectButtonTitle } @@ -272,7 +272,7 @@ class MasterViewController: UITableViewController { // MARK: - Generic - func dismissModal() { + @objc func dismissModal() { dismiss(animated: true) } } diff --git a/App/ResourceListViewController.swift b/App/ResourceListViewController.swift index d22c031..34a53f9 100644 --- a/App/ResourceListViewController.swift +++ b/App/ResourceListViewController.swift @@ -98,20 +98,6 @@ class ResourceListViewController: UITableViewController { cell.detailTextLabel?.text = participants.count.description + " participants" } } - /* - else if let diagnosticRequestInstance = resource as? DiagnosticRequest { - if let displayName: String = diagnosticRequestInstance.code?.displayString() { - cell.textLabel?.text = displayName - } else { - cell.textLabel?.text = "Diagnostic Request" - } - - if let period: Period = diagnosticRequestInstance.occurrencePeriod { - cell.detailTextLabel?.text = period.displayString() - } else { - cell.detailTextLabel?.text = "Unknown request period" - } - } // */ else if let diagnosticReportInstance = resource as? DiagnosticReport { if let displayName: String = diagnosticReportInstance.code?.displayString() { @@ -139,7 +125,7 @@ class ResourceListViewController: UITableViewController { cell.textLabel?.text = "Document" } - if let documentDate: DateTime = documentInstance.created { + if let documentDate: FHIRDate = documentInstance.date?.date { let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium dateFormatter.timeStyle = .none @@ -156,7 +142,7 @@ class ResourceListViewController: UITableViewController { cell.textLabel?.text = "Goal" } - if let goalDate: FHIRDate = goalInstance.target?.dueDate { + if let goalDate: FHIRDate = goalInstance.startDate { let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium dateFormatter.timeStyle = .none @@ -176,7 +162,7 @@ class ResourceListViewController: UITableViewController { cell.textLabel?.text = "Immunization" } - if let immunizationDate: DateTime = immunizationInstance.date { + if let immunizationDate: DateTime = immunizationInstance.occurrenceDateTime { let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium dateFormatter.timeStyle = .none @@ -204,7 +190,8 @@ class ResourceListViewController: UITableViewController { else if let observationInstance = resource as? Observation { if let observationValue: String = observationInstance.valueQuantity?.value?.description { - cell.textLabel?.text = observationValue + " " + (observationInstance.valueQuantity?.unit?.string)! + let units = observationInstance.valueQuantity?.unit?.string ?? "(no units)" + cell.textLabel?.text = "\(observationValue) \(units)" } else if let observationValue: String = observationInstance.valueString?.string { cell.textLabel?.text = observationValue } else { @@ -235,15 +222,17 @@ class ResourceListViewController: UITableViewController { } } - else if let referralRequestInstance = resource as? ReferralRequest { - if let displayName: String = referralRequestInstance.reasonCode?.first?.displayString() { + else if let serviceRequestInstance = resource as? ServiceRequest { + if let displayName: String = serviceRequestInstance.code?.displayString() { cell.textLabel?.text = displayName } else { - cell.textLabel?.text = "Referral Request" + cell.textLabel?.text = "Service Request" } - if let specialty: String = referralRequestInstance.specialty?.displayString() { - cell.detailTextLabel?.text = "For specialty: \(specialty)" + if let requestStatus: String = serviceRequestInstance.status?.rawValue { + cell.detailTextLabel?.text = "Status: " + requestStatus + } else { + cell.detailTextLabel?.text = "Status Not Available" } } @@ -269,7 +258,7 @@ class ResourceListViewController: UITableViewController { class ResourceCell: UITableViewCell { - override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .subtitle, reuseIdentifier: reuseIdentifier) } diff --git a/Endpoints.swift b/Endpoints.swift index 406f062..6cb2b09 100644 --- a/Endpoints.swift +++ b/Endpoints.swift @@ -13,19 +13,8 @@ import SMART func configuredEndpoints() -> [Endpoint] { var endpoints = [Endpoint]() - let hspc = Client( - baseURL: URL(string: "https://api3.hspconsortium.org/fhirconnect14/open")!, - settings: [ - "client_name": "SMART on FHIR iOS Sample App", - "redirect": "smartapp://callback", - "logo_uri": "https://avatars1.githubusercontent.com/u/7401080", - ]) - hspc.authProperties.granularity = .patientSelectNative - hspc.authProperties.embedded = true - endpoints.append(Endpoint(client: hspc, name: "HSPC")) - - let hapi = Client( - baseURL: URL(string: "https://fhirtest.uhn.ca/baseDstu3")!, + let hapi = LenientClient( + baseURL: URL(string: "http://hapi.fhir.org/baseR4")!, settings: [ "client_name": "SMART on FHIR iOS Sample App", "redirect": "smartapp://callback", @@ -33,34 +22,30 @@ func configuredEndpoints() -> [Endpoint] { ]) hapi.authProperties.granularity = .patientSelectNative hapi.authProperties.embedded = true - endpoints.append(Endpoint(client: hapi, name: "HAPI Public")) + endpoints.append(Endpoint(client: hapi, name: "HAPI at fhir.org")) - // Grahame's test server - let grahame = Client( - baseURL: URL(string: "http://fhir3.healthintersections.com.au/open")!, + let hspc = LenientClient( + baseURL: URL(string: "https://api-v5-r4.hspconsortium.org/testr4/open")!, settings: [ "client_name": "SMART on FHIR iOS Sample App", "redirect": "smartapp://callback", "logo_uri": "https://avatars1.githubusercontent.com/u/7401080", ]) - grahame.authProperties.granularity = .patientSelectNative - grahame.authProperties.embedded = true - endpoints.append(Endpoint(client: grahame, name: "Health Intersections")) + hspc.authProperties.granularity = .patientSelectNative + hspc.authProperties.embedded = true + endpoints.append(Endpoint(client: hspc, name: "HSPC Sandbox")) - // SMART DSTU-2!! sandbox - // Credentials obtained by registering on the SMART website - let smart = Client( - baseURL: URL(string: "https://fhir-api-dstu2.smarthealthit.org")!, + let fhirorg = LenientClient( + baseURL: URL(string: "http://test.fhir.org/r4")!, settings: [ - "client_id": "my_mobile_app", "client_name": "SMART on FHIR iOS Sample App", "redirect": "smartapp://callback", "logo_uri": "https://avatars1.githubusercontent.com/u/7401080", ]) - smart.authProperties.granularity = .patientSelectNative - smart.authProperties.embedded = true - endpoints.append(Endpoint(client: smart, name: "SMART")) - + fhirorg.authProperties.granularity = .patientSelectNative + fhirorg.authProperties.embedded = true + endpoints.append(Endpoint(client: fhirorg, name: "Test at FHIR.org")) + return endpoints } diff --git a/README.md b/README.md index 5a1cf3e..c7d38f4 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ An **iOS sample app** using SMART on FHIR via our [iOS SMART on FHIR framework]( 2. Open the project file `SoF-Demo.xcodeproj` in Xcode 8+. 3. Select an iPhone simulator and press **Run**. -The `master` branch is currently on _Swift 3.0_ and the _STU-3_ (`3.0.0.11832`) version of FHIR ([version `3.0.0` of the SMART framework](https://github.com/smart-on-fhir/Swift-SMART/releases/tag/3.0.0)). +The `master` branch is currently on _Swift 4.2_ and the _R4_ (`4.0.0-a53ec6ee1b`) version of FHIR ([version `4.0.0` of the SMART framework](https://github.com/smart-on-fhir/Swift-SMART/releases/tag/4.0.0)). Check the `develop` branch for bleeding edge updates, if any, and the [tags](https://github.com/smart-on-fhir/SoF-Demo/releases) for older releases. diff --git a/SoF-Demo.xcodeproj/project.pbxproj b/SoF-Demo.xcodeproj/project.pbxproj index dec91d4..f40450f 100644 --- a/SoF-Demo.xcodeproj/project.pbxproj +++ b/SoF-Demo.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + B4FA94B922239D4900BD72A1 /* LenientClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4FA94B822239D4900BD72A1 /* LenientClient.swift */; }; EE17790219D0A9E200B5826B /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EE17790119D0A9E200B5826B /* Launch.storyboard */; }; EE19A6831B47EC4000A406FD /* SMART.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE9EE7031AC49C3D002D8B49 /* SMART.framework */; }; EE19A6841B47EC4000A406FD /* SMART.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = EE9EE7031AC49C3D002D8B49 /* SMART.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -84,6 +85,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + B4FA94B822239D4900BD72A1 /* LenientClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LenientClient.swift; sourceTree = ""; }; EE17790119D0A9E200B5826B /* Launch.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = ""; }; EE3EE2BC1DF2BDA900341419 /* ResourceListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResourceListViewController.swift; sourceTree = ""; }; EE3EE2C11DF2BE5D00341419 /* EndpointProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndpointProvider.swift; sourceTree = ""; }; @@ -140,6 +142,7 @@ EE43B1DA19547E410017679A /* App */ = { isa = PBXGroup; children = ( + B4FA94B822239D4900BD72A1 /* LenientClient.swift */, EE43B1DD19547E410017679A /* AppDelegate.swift */, EE43B1DF19547E410017679A /* MasterViewController.swift */, EE3EE2BC1DF2BDA900341419 /* ResourceListViewController.swift */, @@ -216,12 +219,12 @@ attributes = { LastSwiftMigration = 0700; LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = "SMART Platforms"; TargetAttributes = { EE43B1D719547E410017679A = { CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0800; + LastSwiftMigration = 1010; }; }; }; @@ -304,6 +307,7 @@ EE3EE2C21DF2BE5D00341419 /* EndpointProvider.swift in Sources */, EE43B1E019547E410017679A /* MasterViewController.swift in Sources */, EE3EE2BD1DF2BDA900341419 /* ResourceListViewController.swift in Sources */, + B4FA94B922239D4900BD72A1 /* LenientClient.swift in Sources */, EE43B1DE19547E410017679A /* AppDelegate.swift in Sources */, EEFC6B371DF5D9A500D03A84 /* Endpoints.swift in Sources */, EEDB85771E60A9810022803D /* DataType+Utilities.swift in Sources */, @@ -346,14 +350,22 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -377,7 +389,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; METAL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -394,14 +406,22 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -418,7 +438,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; METAL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -436,7 +456,8 @@ OTHER_SWIFT_FLAGS = "-DDEBUG=1"; PRODUCT_BUNDLE_IDENTIFIER = "org.chip.smart-on-fhir.ios.demo"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -452,7 +473,8 @@ PRODUCT_BUNDLE_IDENTIFIER = "org.chip.smart-on-fhir.ios.demo"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/SoF-Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SoF-Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/SoF-Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SoF-Demo.xcodeproj/xcshareddata/xcschemes/SoF-Demo.xcscheme b/SoF-Demo.xcodeproj/xcshareddata/xcschemes/SoF-Demo.xcscheme index 47a8f07..337e00b 100644 --- a/SoF-Demo.xcodeproj/xcshareddata/xcschemes/SoF-Demo.xcscheme +++ b/SoF-Demo.xcodeproj/xcshareddata/xcschemes/SoF-Demo.xcscheme @@ -1,6 +1,6 @@