diff --git a/Sources/Base/BridgeResourceModels/Light.swift b/Sources/Base/BridgeResourceModels/Light.swift index 6b6c1a4..d5ce363 100755 --- a/Sources/Base/BridgeResourceModels/Light.swift +++ b/Sources/Base/BridgeResourceModels/Light.swift @@ -20,7 +20,7 @@ public class Light: BridgeResource, BridgeResourceDictGenerator { /** Identifier of the light. */ - public let identifier: String + public var identifier: String = "" /** A unique, editable name given to the light. @@ -69,7 +69,7 @@ public class Light: BridgeResource, BridgeResourceDictGenerator { public required init?(json: JSON) { - guard let identifier: String = "id" <~~ json, + guard //let identifier: String = "id" <~~ json, let name: String = "name" <~~ json, let state: LightState = "state" <~~ json, let type: String = "type" <~~ json, @@ -80,7 +80,7 @@ public class Light: BridgeResource, BridgeResourceDictGenerator { else { print("Can't create Light from JSON:\n \(json)"); return nil } - self.identifier = identifier + //self.identifier = identifier self.name = name self.state = state self.type = type @@ -97,7 +97,7 @@ public class Light: BridgeResource, BridgeResourceDictGenerator { public func toJSON() -> JSON? { let json = jsonify([ - "id" ~~> identifier, + //"id" ~~> identifier, "name" ~~> name, "state" ~~> state, "type" ~~> type, diff --git a/Sources/Base/BridgeResourceModels/LightState.swift b/Sources/Base/BridgeResourceModels/LightState.swift index 1c61da9..84f7ea3 100755 --- a/Sources/Base/BridgeResourceModels/LightState.swift +++ b/Sources/Base/BridgeResourceModels/LightState.swift @@ -84,7 +84,6 @@ public struct LightState: JSONDecodable, JSONEncodable { "colormode" ~~> colormode, "reachable" ~~> reachable, "transitiontime" ~~> transitiontime - ]) } } diff --git a/Sources/Base/BridgeResourcesCache.swift b/Sources/Base/BridgeResourcesCache.swift index 768ad67..1482588 100755 --- a/Sources/Base/BridgeResourcesCache.swift +++ b/Sources/Base/BridgeResourcesCache.swift @@ -125,7 +125,7 @@ public class BridgeResourcesCache: JSONDecodable { // MARK: Set - internal func setLights(_ lights: [String: Light]) { + public func setLights(_ lights: [String: Light]) { _lights = lights } diff --git a/Sources/Base/BridgeSendAPI.swift b/Sources/Base/BridgeSendAPI.swift index afbe9e9..140da7f 100755 --- a/Sources/Base/BridgeSendAPI.swift +++ b/Sources/Base/BridgeSendAPI.swift @@ -11,7 +11,6 @@ import Alamofire import Gloss public class BridgeSendAPI { - // public typealias PHBridgeSendDictionaryCompletionHandler = (dictionary: [String: Any], errors: [Error]?) -> Void public typealias BridgeCreateSceneCompletionHandler = (_ sceneIdentifier: String?, _ errors: [Error]?) -> Void public typealias BridgeSendErrorArrayCompletionHandler = (_ errors: [Error]?) -> Void @@ -37,15 +36,15 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/groups/0/action" - + Alamofire.request(url, method: .get, parameters: parameters, encoding: JSONEncoding.default) .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } - + } + } public func recallSceneWithIdentifier(_ identifier: String, inGroupWithIdentifier groupIdentifier: String, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -54,15 +53,15 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + let parameters = ["scene": identifier] let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/groups/\(groupIdentifier)/action" - + Alamofire.request(url, method: .put, parameters: parameters, encoding: JSONEncoding.default) .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } /** @@ -74,14 +73,14 @@ public class BridgeSendAPI { completionHandler(nil, [HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + var parameters: [String: Any] = ["name": name, "lights": lightIds, "recycle": recycle]; let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/scenes" - + parameters["transitiontime"] = transitionTime parameters["picture"] = picture parameters["appdata"] = appData?.toJSON() - + Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default) .responseJSON { response in @@ -92,8 +91,8 @@ public class BridgeSendAPI { } } completionHandler(sceneIdentifier, self.errorsFromResponse(response)) - } - + } + } public func updateLightStateInScene(_ sceneIdentifier: String, lightIdentifier: String, withLightState lightState: LightState, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -111,11 +110,11 @@ public class BridgeSendAPI { .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } - + public func removeSceneWithId(_ identifier: String, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { - + remove(.scene, withIdentifier: identifier, completionHandler: completionHandler) } @@ -127,20 +126,20 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + var parameters = lightState.toJSON()! - + if let transitionTime = transitionTime{ parameters["transitiontime"] = transitionTime } - + let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/lights/\(identifier)/state" - + Alamofire.request(url, method: .put, parameters: parameters, encoding: JSONEncoding.default) .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } public func removeLightWithId(_ identifier: String, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -156,17 +155,17 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + let parameters: [String: Any] = ["name": name, "class": roomClass.rawValue, "type": type.rawValue - , "lights": lightIds] + , "lights": lightIds] let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/groups" Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default) .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } - + } + } public func createGroupWithName(_ name: String, andType type: GroupType, includeLightIds lightIds: [String], completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -175,28 +174,28 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + let parameters: [String: Any] = ["name": name, "type": type.rawValue - , "lights": lightIds] + , "lights": lightIds] let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/groups" - + Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default) .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } - /** + /** Allows the user to modify the name and the lights of a group - */ + */ public func updateGroupWithId(_ identifier: String, newName: String?, newLightIdentifiers: [String]?, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { guard let bridgeAccessConfig = self.bridgeAccessConfig else { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + var parameters = [String: Any]() let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/groups/\(identifier)" parameters["name"] = newName; @@ -206,8 +205,8 @@ public class BridgeSendAPI { .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } - + } + } /** @@ -219,10 +218,10 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + var parameters = [String: Any]() let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/groups/\(identifier)" - + parameters["name"] = newName; parameters["class"] = newRoomClass?.rawValue; parameters["lights"] = newLightIdentifiers; @@ -231,7 +230,7 @@ public class BridgeSendAPI { .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } public func removeGroupWithId(_ identifier: String, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -245,7 +244,7 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + let parameters = lightState.toJSON()! let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/groups/\(identifier)/action" @@ -253,7 +252,7 @@ public class BridgeSendAPI { .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } // MARK: Rules @@ -264,10 +263,10 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + var parameters = [String: Any]() let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/rules" - + parameters["name"] = name; parameters["conditions"] = conditions.toJSONArray(); parameters["actions"] = actions.toJSONArray(); @@ -276,8 +275,8 @@ public class BridgeSendAPI { .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } - + } + } public func updateRuleWithId(_ identifier: String, newName: String, newConditions: [RuleCondition]?, newActions: [RuleAction]?, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -286,7 +285,7 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + var parameters = [String: Any]() let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/rules/\(identifier)" @@ -298,7 +297,7 @@ public class BridgeSendAPI { .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } public func removeRuleWithId(_ identifier: String, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -314,7 +313,7 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + var parameters = [String: Any]() let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/schedules" @@ -325,7 +324,7 @@ public class BridgeSendAPI { .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } public func updateScheduleWithId(_ identifier: String, newName: String, newCommand: ScheduleCommand, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -334,10 +333,10 @@ public class BridgeSendAPI { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + var parameters = [String: Any]() let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/schedules/\(identifier)" - + parameters["name"] = newName; parameters["command"] = newCommand.toJSON(); @@ -345,7 +344,7 @@ public class BridgeSendAPI { .responseJSON { response in completionHandler(self.errorsFromResponse(response)) - } + } } public func removeScheduleWithId(_ identifier: String, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { @@ -366,7 +365,7 @@ public class BridgeSendAPI { remove(.whitelistEntry, withIdentifier: identifier, completionHandler: completionHandler) } - + // MARK: Helpers private func errorsFromResponse(_ response: DataResponse) -> [Error]? { @@ -387,21 +386,44 @@ public class BridgeSendAPI { private func remove(_ bridgeResourceType: BridgeResourceType, withIdentifier identifier: String, completionHandler: @escaping BridgeSendErrorArrayCompletionHandler) { let resourceTypeForURL = bridgeResourceType == .whitelistEntry - ? "config/whitelist" - : "\(bridgeResourceType)s" - + ? "config/whitelist" + : "\(bridgeResourceType)s" + guard let bridgeAccessConfig = self.bridgeAccessConfig else { completionHandler([HueError(address: "SwiftyHue", errorDescription: "No bridgeAccessConfig available", type: 1)!]) return } - + let url = "http://\(bridgeAccessConfig.ipAddress)/api/\(bridgeAccessConfig.username)/\(resourceTypeForURL)/\(identifier)" - + Alamofire.request(url, method: .delete, encoding: JSONEncoding.default) .responseJSON { response in - completionHandler(self.errorsFromResponse(response)) + completionHandler(self.errorsFromResponse(response)) + } + } + + public func requestLights(completion: @escaping ([Light]?) -> Void) { + guard let ipAddress = bridgeAccessConfig?.ipAddress, + let username = bridgeAccessConfig?.username + else { + return } + Alamofire.request("http://\(ipAddress)/api/\(username)/lights", parameters: nil) + .responseJSON { response in + var lights: [Light] = [] + if let resultValueJSON = response.result.value as? JSON { + for (key, value) in resultValueJSON { + var resourceJSON = value as! JSON + resourceJSON["id"] = key + if let light = Light(json: resourceJSON), light.state.reachable == true { + light.identifier = key + lights.append(light) + } + } + } + completion(lights) + } } } diff --git a/Sources/BridgeServices/BridgeFinder/Scanner/NUPNPScanner.swift b/Sources/BridgeServices/BridgeFinder/Scanner/NUPNPScanner.swift index 92b1aa0..fd69143 100755 --- a/Sources/BridgeServices/BridgeFinder/Scanner/NUPNPScanner.swift +++ b/Sources/BridgeServices/BridgeFinder/Scanner/NUPNPScanner.swift @@ -10,65 +10,63 @@ import Foundation class NUPNPScanner: NSObject, Scanner { weak var delegate: ScannerDelegate? - + required init(delegate: ScannerDelegate? = nil) { self.delegate = delegate super.init() } - + func start() { let request = createRequest() startRequest(request as URLRequest) } - + func stop() { - + } - + private func createRequest() -> URLRequest { - let url = URL(string: "https://www.meethue.com/api/nupnp")! - + let url = URL(string: "https://discovery.meethue.com/")! + var request = URLRequest(url: url) request.httpMethod = "GET" - + return request } - + private func startRequest(_ request: URLRequest) { let task = URLSession.shared.dataTask(with: request) { [weak self] (data, response, error) in guard let this = self else { return } - + if error != nil || data == nil { this.delegate?.scanner(this, didFinishWithResults: []) return } - + let ips = this.parseResults(data!) this.delegate?.scanner(this, didFinishWithResults: ips) } task.resume() } - + private func parseResults(_ data: Data) -> [String] { var ips = [String]() - + do { - if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: String]] { + if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] { for bridgeJson in json { - if let ip = bridgeJson["internalipaddress"] { + if let ip = bridgeJson["internalipaddress"] as? String { ips.append(ip) } } } - - } catch let error as NSError { print("Error while parsing nupnp results: \(error)") } - + return ips } } diff --git a/SwiftyHue Example/Images.xcassets/AppIcon.appiconset/Contents.json b/SwiftyHue Example/Images.xcassets/AppIcon.appiconset/Contents.json index d3942e9..8121323 100644 --- a/SwiftyHue Example/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/SwiftyHue Example/Images.xcassets/AppIcon.appiconset/Contents.json @@ -2,37 +2,52 @@ "images" : [ { "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" + "scale" : "3x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" + "scale" : "3x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } } diff --git a/SwiftyHue Example/ViewController.swift b/SwiftyHue Example/ViewController.swift index 2f17bf1..17dc5aa 100644 --- a/SwiftyHue Example/ViewController.swift +++ b/SwiftyHue Example/ViewController.swift @@ -143,17 +143,6 @@ extension ViewController { // print(errors) // } - // var beatManager = BeatManager(bridgeAccessConfig: bridgeAccessConfig) -// beatManager.setLocalHeartbeatInterval(3, forResourceType: .Lights) -// beatManager.setLocalHeartbeatInterval(3, forResourceType: .Groups) -// beatManager.setLocalHeartbeatInterval(3, forResourceType: .Rules) -// beatManager.setLocalHeartbeatInterval(3, forResourceType: .Scenes) -// beatManager.setLocalHeartbeatInterval(3, forResourceType: .Schedules) -// beatManager.setLocalHeartbeatInterval(3, forResourceType: .Sensors) -// beatManager.setLocalHeartbeatInterval(3, forResourceType: .Config) -// -// beatManager.startHeartbeat() -// NotificationCenter.default.addObserver(self, selector: #selector(ViewController.lightChanged), name: NSNotification.Name(rawValue: ResourceCacheUpdateNotification.lightsUpdated.rawValue), object: nil) // var lightState = LightState() diff --git a/SwiftyHue.xcodeproj/project.pbxproj b/SwiftyHue.xcodeproj/project.pbxproj index 079d009..74aa437 100644 --- a/SwiftyHue.xcodeproj/project.pbxproj +++ b/SwiftyHue.xcodeproj/project.pbxproj @@ -1232,12 +1232,15 @@ }; 1FEF527B1CF607F200446694 = { CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 7UCMG35W8L; }; 1FEF528F1CF6081B00446694 = { CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 7UCMG35W8L; }; 1FEF529B1CF6081B00446694 = { CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 7UCMG35W8L; }; 1FEF52B61CF6087A00446694 = { CreatedOnToolsVersion = 7.3.1; @@ -2442,6 +2445,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 7UCMG35W8L; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/iOS"; @@ -2464,7 +2468,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example"; + PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.demo"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SWIFT_OBJC_BRIDGING_HEADER = "SwiftyHue Example/SwiftyHue Example-Bridging-Header.h"; @@ -2496,6 +2500,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 7UCMG35W8L; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/iOS"; @@ -2511,7 +2516,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example"; + PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.demo"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SWIFT_OBJC_BRIDGING_HEADER = "SwiftyHue Example/SwiftyHue Example-Bridging-Header.h"; @@ -2542,6 +2547,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 7UCMG35W8L; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -2562,7 +2568,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.watchkitapp.watchkitextension"; + PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.demo.watchkitapp.watchkitextension"; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; SKIP_INSTALL = YES; @@ -2593,6 +2599,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 7UCMG35W8L; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -2606,7 +2613,7 @@ INFOPLIST_FILE = "SwiftyHue Example Watch Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.watchkitapp.watchkitextension"; + PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.demo.watchkitapp.watchkitextension"; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; SKIP_INSTALL = YES; @@ -2640,6 +2647,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 7UCMG35W8L; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -2660,7 +2668,7 @@ INFOPLIST_FILE = "SwiftyHue Example Watch/Info.plist"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.watchkitapp"; + PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.demo.watchkitapp"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; SKIP_INSTALL = YES; @@ -2692,6 +2700,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 7UCMG35W8L; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -2705,7 +2714,7 @@ IBSC_MODULE = SwiftyHue_Example_Watch_Extension; INFOPLIST_FILE = "SwiftyHue Example Watch/Info.plist"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.watchkitapp"; + PRODUCT_BUNDLE_IDENTIFIER = "com.blowfishlab.SwiftyHue-Example.demo.watchkitapp"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; SKIP_INSTALL = YES;