From f5ebe9b73e75c91700a63318038184d35c362058 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 09:49:38 +0200 Subject: [PATCH 01/28] update all the frameworks --- Cartfile | 10 +++++----- Cartfile.resolved | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cartfile b/Cartfile index 3154f2e..a74edb2 100644 --- a/Cartfile +++ b/Cartfile @@ -1,5 +1,5 @@ -github "Alamofire/Alamofire" ~> 3.1.2 -github "Alamofire/AlamofireImage" ~> 2.1.0 -github "Hearst-DD/ObjectMapper" ~> 1.1 -github "tristanhimmelman/AlamofireObjectMapper" ~> 2.1 -github "SVProgressHUD/SVProgressHUD" ~> 2.0 \ No newline at end of file +github "Alamofire/Alamofire" ~> 4.0.0 +github "Alamofire/AlamofireImage" ~> 3.0.0 +github "Hearst-DD/ObjectMapper" ~> 2.0.0 +github "tristanhimmelman/AlamofireObjectMapper" ~> 4.0.0 +github "SVProgressHUD/SVProgressHUD" ~> 2.0 diff --git a/Cartfile.resolved b/Cartfile.resolved index f46b096..45b2f04 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,5 +1,5 @@ -github "Alamofire/Alamofire" "3.3.1" -github "Hearst-DD/ObjectMapper" "1.2.0" +github "Alamofire/Alamofire" "4.0.0" +github "Hearst-DD/ObjectMapper" "2.0.0" github "SVProgressHUD/SVProgressHUD" "2.0.3" -github "Alamofire/AlamofireImage" "2.4.0" -github "tristanhimmelman/AlamofireObjectMapper" "2.1.3" +github "Alamofire/AlamofireImage" "3.0.0" +github "tristanhimmelman/AlamofireObjectMapper" "4.0.0" From c3df6026c39ceb6d3d07937660450f6987d00ffe Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 09:50:36 +0200 Subject: [PATCH 02/28] migration to swift 3 --- App.xcodeproj/project.pbxproj | 22 ++++++- .../xcshareddata/xcschemes/App.xcscheme | 5 +- App/AppDelegate.swift | 12 ++-- App/AppError.swift | 26 ++++---- App/Base.lproj/Main.storyboard | 55 +++++++--------- App/CurrentWeatherResponse.swift | 4 +- App/Forecast.swift | 2 +- App/ForecastResponse.swift | 4 +- .../AppIcon.appiconset/Contents.json | 10 +++ App/IntTransform.swift | 9 +-- App/MailgunVC.swift | 14 ++--- App/NSBundle+Root.swift | 8 +-- App/NSURLRequest+Body.swift | 16 ++--- App/RouterProtocol.swift | 2 +- App/TownWithWoeid.swift | 12 ++-- App/WeatherBusiness.swift | 8 +-- App/WeatherCondition.swift | 2 +- App/WeatherData.swift | 62 ++++++++++--------- App/WeatherVC.swift | 20 +++--- AppTests/AppTests.swift | 2 +- MailgunBusiness.swift | 6 +- MailgunData.swift | 60 ++++++++++-------- MailgunResponse.swift | 2 +- 23 files changed, 197 insertions(+), 166 deletions(-) diff --git a/App.xcodeproj/project.pbxproj b/App.xcodeproj/project.pbxproj index e2cf541..5120245 100644 --- a/App.xcodeproj/project.pbxproj +++ b/App.xcodeproj/project.pbxproj @@ -385,14 +385,17 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0710; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = 3IE; TargetAttributes = { A79825121B18A6FC00F8E795 = { CreatedOnToolsVersion = 6.3.2; + DevelopmentTeam = 9C4PPFA3SJ; + LastSwiftMigration = 0800; }; A79825271B18A6FC00F8E795 = { CreatedOnToolsVersion = 6.3.2; + LastSwiftMigration = 0800; TestTargetID = A79825121B18A6FC00F8E795; }; }; @@ -559,8 +562,10 @@ 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_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -614,8 +619,10 @@ 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_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -637,6 +644,7 @@ MTL_ENABLE_DEBUG_INFO = NO; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; VALIDATE_PRODUCT = YES; WARNING_CFLAGS = ( "-Wextra", @@ -648,32 +656,38 @@ A79825331B18A6FC00F8E795 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + DEVELOPMENT_TEAM = 9C4PPFA3SJ; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = App/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "fr.3ie.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; A79825341B18A6FC00F8E795 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + DEVELOPMENT_TEAM = 9C4PPFA3SJ; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = App/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "fr.3ie.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -694,6 +708,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "fr.3ie.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/App.app/App"; }; name = Debug; @@ -711,6 +726,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "fr.3ie.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/App.app/App"; }; name = Release; diff --git a/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme b/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme index 5d87740..dc03283 100644 --- a/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme +++ b/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme @@ -1,6 +1,6 @@ + buildForAnalyzing = "YES"> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // 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. // 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. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // 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. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - func applicationWillEnterForeground(application: UIApplication) { + func applicationWillEnterForeground(_ application: UIApplication) { // 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. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // 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. } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } diff --git a/App/AppError.swift b/App/AppError.swift index bee51e6..5379c7b 100644 --- a/App/AppError.swift +++ b/App/AppError.swift @@ -17,14 +17,14 @@ The various kind of app errors - Parsing: the server responded but the response could not be parsed - Server: the server responded a custom error message */ -enum AppError: ErrorType { - case NoResponse(String) - case Parsing(String) - case Server(Int, String) +enum AppError: Error { + case noResponse(String) + case parsing(String) + case server(Int, String) var code: Int { switch self { - case .Server(let code, _): + case .server(let code, _): return code default: return -100 @@ -33,7 +33,7 @@ enum AppError: ErrorType { var message: String { switch self { - case .Server(_, let message): + case .server(_, let message): return getDomain() + message default: return "[parsing] app : " @@ -44,12 +44,12 @@ enum AppError: ErrorType { //MARK: - AlamoFire extension AppError { - init?(response: Alamofire.Response) { + init?(response: Alamofire.DataResponse) { if (response.response == nil) { - self = .NoResponse("No Response") + self = .noResponse("No Response") } else if (response.result.isFailure || response.result.value == nil) { - self = .Parsing("Parsing failure") + self = .parsing("Parsing failure") } else { return nil @@ -61,8 +61,8 @@ extension AppError { //MARK: - ObjectMapper extension AppError : Mappable { - init?(_ map: Map) { - self = .Server(0, "msg") + init?(map: Map) { + self = .server(0, "msg") } mutating func mapping(map: Map) { @@ -70,14 +70,14 @@ extension AppError : Mappable { var parsedCode : Int = 0 parsedMessage <- map["message"] parsedCode <- map["code"] - self = .Server(parsedCode, parsedMessage) + self = .server(parsedCode, parsedMessage) } } //MARK: - Helpers private func getDomain() -> String { - if let domain: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleIdentifier") as? String { + if let domain: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleIdentifier") as? String { return domain } else { return "" diff --git a/App/Base.lproj/Main.storyboard b/App/Base.lproj/Main.storyboard index 7084801..c3d8b46 100644 --- a/App/Base.lproj/Main.storyboard +++ b/App/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - - + + - - + + @@ -14,31 +14,28 @@ - + - @@ -49,7 +46,6 @@ - @@ -60,17 +56,15 @@ - @@ -81,7 +75,6 @@ - + @@ -131,7 +124,7 @@ - + @@ -151,57 +144,57 @@ - + - - + - - + Forecast 1 Forecast 2 - + diff --git a/App/CurrentWeatherResponse.swift b/App/CurrentWeatherResponse.swift index 2ceb729..0bdb071 100644 --- a/App/CurrentWeatherResponse.swift +++ b/App/CurrentWeatherResponse.swift @@ -12,14 +12,14 @@ import ObjectMapper struct CurrentWeatherResponse { var count: Int? var town: String? - var date: NSDate? + var date: Date? var language: String? var weatherCondition: WeatherCondition? } extension CurrentWeatherResponse: Mappable { - init?(_ map: Map) { + init?(map: Map) { } mutating func mapping(map: Map) { diff --git a/App/Forecast.swift b/App/Forecast.swift index a45a920..dbacf6c 100644 --- a/App/Forecast.swift +++ b/App/Forecast.swift @@ -19,7 +19,7 @@ struct Forecast { //MARK: ObjectMapper extension Forecast: Mappable { - init?(_ map: Map) { + init?(map: Map) { } mutating func mapping(map: Map) { diff --git a/App/ForecastResponse.swift b/App/ForecastResponse.swift index 359b616..5fb27a5 100644 --- a/App/ForecastResponse.swift +++ b/App/ForecastResponse.swift @@ -12,14 +12,14 @@ import ObjectMapper struct ForecastResponse { var count: Int? var town: String? - var date: NSDate? + var date: Date? var language: String? var forecasts: [Forecast]? } extension ForecastResponse: Mappable { - init?(_ map: Map) { + init?(map: Map) { } mutating func mapping(map: Map) { diff --git a/App/Images.xcassets/AppIcon.appiconset/Contents.json b/App/Images.xcassets/AppIcon.appiconset/Contents.json index 118c98f..b8236c6 100644 --- a/App/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/App/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", diff --git a/App/IntTransform.swift b/App/IntTransform.swift index 80b0599..3856cbb 100644 --- a/App/IntTransform.swift +++ b/App/IntTransform.swift @@ -9,20 +9,21 @@ import Foundation import ObjectMapper -public class IntTransform: TransformType { +open class IntTransform: TransformType { + public typealias Object = Int public typealias JSON = String public init() {} - public func transformFromJSON(value: AnyObject?) -> Int? { + open func transformFromJSON(_ value: Any?) -> Int? { if let strValue = value as? String { return Int(strValue) } return nil } - public func transformToJSON(value: Int?) -> String? { - return String(value) + open func transformToJSON(_ value: Int?) -> String? { + return String(describing: value) } } diff --git a/App/MailgunVC.swift b/App/MailgunVC.swift index aae0cf4..6d496e7 100644 --- a/App/MailgunVC.swift +++ b/App/MailgunVC.swift @@ -19,25 +19,25 @@ class MailgunVC: UIViewController, UITextFieldDelegate { super.viewDidLoad() } - @IBAction func sendEmailAction(sender: AnyObject) { + @IBAction func sendEmailAction(_ sender: AnyObject) { guard let recipient = self.recipientTextFieldOutlet.text, let subject = self.subjectTextFieldOutlet.text, let content = self.contentTextFieldOutlet.text else { - SVProgressHUD.showErrorWithStatus("Invalid data") + SVProgressHUD.showError(withStatus: "Invalid data") return } - SVProgressHUD.showWithStatus("Sending in progress") + SVProgressHUD.show(withStatus: "Sending in progress") MailgunBusiness.SendMail(recipient: recipient, subject: subject, content: content) { (response, error) in - dispatch_async(dispatch_get_main_queue(), { + DispatchQueue.main.async(execute: { if (error == nil) { - SVProgressHUD.showSuccessWithStatus("Mail sent") + SVProgressHUD.showSuccess(withStatus: "Mail sent") } else { - SVProgressHUD.showErrorWithStatus("Failed to send email") + SVProgressHUD.showError(withStatus: "Failed to send email") } }) } } - func textFieldShouldReturn(textField: UITextField) -> Bool { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } diff --git a/App/NSBundle+Root.swift b/App/NSBundle+Root.swift index b56330e..a580b90 100644 --- a/App/NSBundle+Root.swift +++ b/App/NSBundle+Root.swift @@ -8,17 +8,17 @@ import Foundation -extension NSBundle { +extension Bundle { - private static var _apiBaseUrl: String? = nil + fileprivate static var _apiBaseUrl: String? = nil /// returns the API base url that is shared by your web services static var apiBaseUrl: String { if (_apiBaseUrl == nil) { - _apiBaseUrl = NSBundle.mainBundle().objectForInfoDictionaryKey("kAPIBaseUrl") as? String ?? "" + _apiBaseUrl = Bundle.main.object(forInfoDictionaryKey: "kAPIBaseUrl") as? String ?? "" } return _apiBaseUrl! } //Add methods here in order to get the other endpoints -} \ No newline at end of file +} diff --git a/App/NSURLRequest+Body.swift b/App/NSURLRequest+Body.swift index dc84e17..0796b81 100644 --- a/App/NSURLRequest+Body.swift +++ b/App/NSURLRequest+Body.swift @@ -6,14 +6,14 @@ // Copyright (c) 2015 3IE. All rights reserved. // -import Foundation +/*import Foundation import Alamofire extension NSMutableURLRequest { - private convenience init(fullUrl :NSURL, method: Alamofire.Method) { - self.init(URL: fullUrl) - self.HTTPMethod = method.rawValue + fileprivate convenience init(fullUrl :URL, method: Alamofire.Method) { + self(url: fullUrl) + self.HTTPMethod = method.hashValue //Add here some other settings for your request } @@ -26,10 +26,10 @@ extension NSMutableURLRequest { - returns: a new request based on the API base path */ convenience init?(apiPathRelativeToBase path: String, method: Alamofire.Method) { - guard let baseUrl = NSURL(string: NSBundle.apiBaseUrl), let fullUrl = NSURL(string: path, relativeToURL: baseUrl) else { + guard let baseUrl = NSURL(string: Bundle.apiBaseUrl), let fullUrl = NSURL(string: path, relativeTo: baseUrl as URL) else { return nil } - self.init(fullUrl: fullUrl, method: method) + self.init(fullUrl: fullUrl as URL, method: method) } /** @@ -44,7 +44,7 @@ extension NSMutableURLRequest { guard let fullUrl = NSURL(string: path) else { return nil } - self.init(fullUrl: fullUrl, method: method) + self.init(fullUrl: fullUrl as URL, method: method) } -} \ No newline at end of file +} */ diff --git a/App/RouterProtocol.swift b/App/RouterProtocol.swift index 21a2130..9715de0 100644 --- a/App/RouterProtocol.swift +++ b/App/RouterProtocol.swift @@ -10,6 +10,6 @@ import Foundation import Alamofire protocol RouterProtocol { - var method: Alamofire.Method { get } + var method: Alamofire.HTTPMethod { get } var path: String { get } } diff --git a/App/TownWithWoeid.swift b/App/TownWithWoeid.swift index 9a146fb..81d7162 100644 --- a/App/TownWithWoeid.swift +++ b/App/TownWithWoeid.swift @@ -14,20 +14,20 @@ protocol TownWithWoeidProtocol { } enum TownWithWoeid: TownWithWoeidProtocol { - case Paris - case KremlinBicetre + case paris + case kremlinBicetre var name: String { switch self { - case .Paris: return "Paris" - case .KremlinBicetre : return "Le Kremlin Bicetre" + case .paris: return "Paris" + case .kremlinBicetre : return "Le Kremlin Bicetre" } } var woeid: String { switch self { - case .Paris: return "615702" - case .KremlinBicetre : return "55863504" + case .paris: return "615702" + case .kremlinBicetre : return "55863504" } } } diff --git a/App/WeatherBusiness.swift b/App/WeatherBusiness.swift index 17574d7..d853732 100644 --- a/App/WeatherBusiness.swift +++ b/App/WeatherBusiness.swift @@ -10,15 +10,15 @@ import Foundation class WeatherBusiness { - static func GetWeather(forTown town: TownWithWoeid, completed:((response:CurrentWeatherResponse?, error: AppError?) -> Void)) -> Void { + static func GetWeather(forTown town: TownWithWoeid, completed:@escaping ((_ response:CurrentWeatherResponse?, _ error: Error?) -> Void)) -> Void { WeatherData.GetCurrentWeather(forTown: town) { (response, error) in - completed(response: response, error: error) + completed(response, error) } } - static func GetForecast(forTown town: TownWithWoeid, completed:((response:ForecastResponse?, error: AppError?) -> Void)) -> Void { + static func GetForecast(forTown town: TownWithWoeid, completed:@escaping ((_ response:ForecastResponse?, _ error: Error?) -> Void)) -> Void { WeatherData.GetForecast(forTown: town) { (response, error) in - completed(response: response, error: error) + completed(response, error) } } diff --git a/App/WeatherCondition.swift b/App/WeatherCondition.swift index 57e109c..8e120e2 100644 --- a/App/WeatherCondition.swift +++ b/App/WeatherCondition.swift @@ -17,7 +17,7 @@ struct WeatherCondition { //MARK: ObjectMapper extension WeatherCondition: Mappable { - init?(_ map: Map) { + init?(map: Map) { } mutating func mapping(map: Map) { diff --git a/App/WeatherData.swift b/App/WeatherData.swift index 9a26051..19c3dec 100644 --- a/App/WeatherData.swift +++ b/App/WeatherData.swift @@ -12,43 +12,49 @@ import AlamofireObjectMapper //MARK: Router class private enum Router { - case CurrentWeather(TownWithWoeid) - case Forecast(TownWithWoeid) + case currentWeather(TownWithWoeid) + case forecast(TownWithWoeid) } //MARK: RouterProtocol extension Router: RouterProtocol { - var method: Alamofire.Method { + var method: Alamofire.HTTPMethod { switch self { - case .CurrentWeather: - return .GET - case .Forecast: - return .GET + case .currentWeather: + return .get + case .forecast: + return .get } } var path: String { switch self { - case .CurrentWeather(let town): - return "/v1/public/yql?q=select%20item.condition%2Clocation%2Cunits%20from%20weather.forecast%20where%20woeid%3D\(town.woeid)%20and%20u%20%3D%20'c'&format=json" - case .Forecast(let town): - return "/v1/public/yql?q=select%20item%2Clocation%2Cunits%20from%20weather.forecast%20where%20woeid%3D\(town.woeid)%20and%20u%20%3D%20'c'&format=json" + case .currentWeather(let town): + return "\(Bundle.apiBaseUrl)/v1/public/yql?q=select%20item.condition%2Clocation%2Cunits%20from%20weather.forecast%20where%20woeid%3D\(town.woeid)%20and%20u%20%3D%20'c'&format=json" + case .forecast(let town): + return "\(Bundle.apiBaseUrl)/v1/public/yql?q=select%20item%2Clocation%2Cunits%20from%20weather.forecast%20where%20woeid%3D\(town.woeid)%20and%20u%20%3D%20'c'&format=json" } } } //MARK: URLRequestConvertible extension Router: URLRequestConvertible { - var URLRequest: NSMutableURLRequest { - guard let mutableURLRequest = NSMutableURLRequest(apiPathRelativeToBase: self.path, method: self.method) else { - return NSMutableURLRequest() - } - switch self { - default: - return mutableURLRequest - } - } + /// Returns a URL request or throws if an `Error` was encountered. + /// + /// - throws: An `Error` if the underlying `URLRequest` is `nil`. + /// + /// - returns: A URL request. + public func asURLRequest() throws -> URLRequest { + + var urlRequest = URLRequest(url: URL(string: self.path)!) + urlRequest.httpMethod = self.method.rawValue + + switch self { + default: + return urlRequest + } + } } //MARK: - WeatherData @@ -60,11 +66,11 @@ class WeatherData { - parameter town: town to fetch the weather from - parameter completed: completion block; error is nil is everthing goes right */ - static func GetCurrentWeather(forTown town: TownWithWoeid, completed:((response: CurrentWeatherResponse?, error: AppError?) -> Void)) -> Void { - Alamofire.request(Router.CurrentWeather(town)) + static func GetCurrentWeather(forTown town: TownWithWoeid, completed:@escaping ((_ response: CurrentWeatherResponse?, _ error: Error?) -> Void)) -> Void { + Alamofire.request(Router.currentWeather(town)) .validate() - .responseObject { (alamoResponse: Response) in - completed(response: alamoResponse.result.value, error: AppError(response: alamoResponse)) + .responseObject { (alamoResponse: DataResponse) in + completed(alamoResponse.result.value, alamoResponse.result.error) } } @@ -74,11 +80,11 @@ class WeatherData { - parameter town: town to fetch the weather from - parameter completed: completion block; error is nil is everthing goes right */ - static func GetForecast(forTown town: TownWithWoeid, completed:((response: ForecastResponse?, error: AppError?) -> Void)) -> Void { - Alamofire.request(Router.Forecast(town)) + static func GetForecast(forTown town: TownWithWoeid, completed:@escaping ((_ response: ForecastResponse?, _ error: Error?) -> Void)) -> Void { + Alamofire.request(Router.forecast(town)) .validate() - .responseObject { (alamoResponse: Response) in - completed(response: alamoResponse.result.value, error: AppError(response: alamoResponse)) + .responseObject { (alamoResponse: DataResponse) in + completed(alamoResponse.result.value, alamoResponse.result.error) } } } diff --git a/App/WeatherVC.swift b/App/WeatherVC.swift index a943061..b2a144c 100644 --- a/App/WeatherVC.swift +++ b/App/WeatherVC.swift @@ -9,7 +9,7 @@ import UIKit import SVProgressHUD -private let kTownToUse = TownWithWoeid.Paris +private let kTownToUse = TownWithWoeid.paris class WeatherVC: UIViewController { @@ -20,38 +20,38 @@ class WeatherVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() - SVProgressHUD.setDefaultMaskType(SVProgressHUDMaskType.Black) + SVProgressHUD.setDefaultMaskType(SVProgressHUDMaskType.black) self.townLabelOutlet.text = kTownToUse.name self.forecastTextViewOutlet.text = "" } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - SVProgressHUD.showWithStatus("Fetching in progress") + SVProgressHUD.show(withStatus: "Fetching in progress") WeatherBusiness.GetWeather(forTown: kTownToUse) { (response, error) in - dispatch_async(dispatch_get_main_queue(), { + DispatchQueue.main.async(execute: { if (error == nil) { self.temperatureLabelOutlet.text = "\(response?.weatherCondition?.temperature ?? 0) °C" self.descriptionLabelOutlet.text = response?.weatherCondition?.description ?? "unknown" - SVProgressHUD.showSuccessWithStatus("done !") + SVProgressHUD.showSuccess(withStatus: "done !") } else { - SVProgressHUD.showErrorWithStatus("failure") + SVProgressHUD.showError(withStatus: "failure") } }) } WeatherData.GetForecast(forTown: kTownToUse) { (response, error) in - dispatch_async(dispatch_get_main_queue(), { + DispatchQueue.main.async(execute: { if (error == nil) { - let forecastArray = response?.forecasts?.map({ (let forecast) -> String in + let forecastArray = response?.forecasts?.map({ (forecast) -> String in guard let date = forecast.date, let low = forecast.lowTemperature, let high = forecast.highTemperature else { return ""; } return "\(date), temp = \(low) - \(high)" }) - self.forecastTextViewOutlet.text = forecastArray?.joinWithSeparator("\n") + self.forecastTextViewOutlet.text = forecastArray?.joined(separator: "\n") } else { } diff --git a/AppTests/AppTests.swift b/AppTests/AppTests.swift index d15fe94..645ea7e 100644 --- a/AppTests/AppTests.swift +++ b/AppTests/AppTests.swift @@ -28,7 +28,7 @@ class AppTests: XCTestCase { func testPerformanceExample() { // This is an example of a performance test case. - self.measureBlock() { + self.measure() { // Put the code you want to measure the time of here. } } diff --git a/MailgunBusiness.swift b/MailgunBusiness.swift index 41cba10..b49a751 100644 --- a/MailgunBusiness.swift +++ b/MailgunBusiness.swift @@ -10,10 +10,10 @@ import Foundation class MailgunBusiness { - static func SendMail(recipient recipient: String, subject: String, content: String, completed:((response: MailgunResponse?, error: AppError?) -> Void)) -> Void { + static func SendMail(recipient: String, subject: String, content: String, completed:@escaping ((_ response: MailgunResponse?, _ error: Error?) -> Void)) -> Void { MailgunData.SendMail(recipient: recipient, subject: subject, content: content) { (response, error) in - completed(response: response, error: error) + completed(response, error) } } -} \ No newline at end of file +} diff --git a/MailgunData.swift b/MailgunData.swift index fce0117..31dc4aa 100644 --- a/MailgunData.swift +++ b/MailgunData.swift @@ -15,22 +15,22 @@ private let kMailgunApiKey = "" //TODO: fill this with your info //MARK: Router class private enum Router { - case SendMail([String: AnyObject]) + case sendMail([String: AnyObject]) } //MARK: RouterProtocol extension Router: RouterProtocol { - - var method: Alamofire.Method { - switch self { - case .SendMail: - return .POST - } - } - + + var method: Alamofire.HTTPMethod { + switch self { + case .sendMail: + return .post + } + } + var path: String { switch self { - case .SendMail: + case .sendMail: return "https://api.mailgun.net/v3/sandbox72c4329542d34f668085a9f3d71203e9.mailgun.org/messages" } } @@ -38,32 +38,38 @@ extension Router: RouterProtocol { //MARK: URLRequestConvertible extension Router: URLRequestConvertible { - var URLRequest: NSMutableURLRequest { - guard let mutableURLRequest = NSMutableURLRequest(apiPathAbsolute: self.path, method: self.method) else { - return NSMutableURLRequest() - } - switch self { - case .SendMail(let body): - return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: body).0 - } - } + /// Returns a URL request or throws if an `Error` was encountered. + /// + /// - throws: An `Error` if the underlying `URLRequest` is `nil`. + /// + /// - returns: A URL request. + public func asURLRequest() throws -> URLRequest { + + var urlRequest = URLRequest(url: URL(string: self.path)!) + urlRequest.httpMethod = self.method.rawValue + + switch self { + case .sendMail(let body): + return try Alamofire.URLEncoding.default.encode(urlRequest, with: body) + } + } } //MARK: - WeatherData class MailgunData { - static func SendMail(recipient recipient: String, subject: String, content: String, completed:((response: MailgunResponse?, error: AppError?) -> Void)) -> Void { + static func SendMail(recipient: String, subject: String, content: String, completed:@escaping ((_ response: MailgunResponse?, _ error: Error?) -> Void)) -> Void { precondition(kMailgunSender.characters.count > 0 && kMailgunApiKey.characters.count > 0, "You need to provide the mailgun info") let body: [String: AnyObject] = [ - "from": kMailgunSender, - "to": recipient, - "subject": subject, - "text": content] - Alamofire.request(Router.SendMail(body)) + "from": kMailgunSender as AnyObject, + "to": recipient as AnyObject, + "subject": subject as AnyObject, + "text": content as AnyObject] + Alamofire.request(Router.sendMail(body)) .authenticate(user: "api", password: kMailgunApiKey) .validate() - .responseObject { (alamoResponse: Response) in - completed(response: alamoResponse.result.value, error: AppError(response: alamoResponse)) + .responseObject { (alamoResponse: DataResponse) in + completed(alamoResponse.result.value, alamoResponse.result.error) } } } diff --git a/MailgunResponse.swift b/MailgunResponse.swift index d6a4ee2..46b34e1 100644 --- a/MailgunResponse.swift +++ b/MailgunResponse.swift @@ -16,7 +16,7 @@ struct MailgunResponse { //MARK: ObjectMapper extension MailgunResponse: Mappable { - init?(_ map: Map) { + init?(map: Map) { } mutating func mapping(map: Map) { From 0994a131c5984118fbd1b9da8cd1e75e050a2194 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 14:03:31 +0200 Subject: [PATCH 03/28] update xcode version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3610a56..bcf98b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode7.3 +osx_image: xcode8.0 xcode_project: App.xcodeproj xcode_scheme: App xcode_sdk: iphonesimulator9.3 From 18a4271b9dbecdd69b9a86eef0fd44bb0f506f5f Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 15:05:25 +0200 Subject: [PATCH 04/28] update carthage version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bcf98b4..a2e26e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ xcode_project: App.xcodeproj xcode_scheme: App xcode_sdk: iphonesimulator9.3 before_install: -- curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.16.2/Carthage.pkg" +- curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18.0/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / - rm "Carthage.pkg" before_script: From 9f9b478d4ca2ecd6dd835eb5c486fdbfcbb8d7dd Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 15:09:33 +0200 Subject: [PATCH 05/28] fix travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a2e26e6..ee99b7b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ xcode_project: App.xcodeproj xcode_scheme: App xcode_sdk: iphonesimulator9.3 before_install: -- curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18.0/Carthage.pkg" +- curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / - rm "Carthage.pkg" before_script: From 79708e0b1b2c3cf9e9e2b3b8981bf80e9383acfb Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 15:27:32 +0200 Subject: [PATCH 06/28] try with 10.0 iOS --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ee99b7b..45933fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: objective-c osx_image: xcode8.0 xcode_project: App.xcodeproj xcode_scheme: App -xcode_sdk: iphonesimulator9.3 +xcode_sdk: iphonesimulator10.0 before_install: - curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / From 8b12f0e02c69551fe159a6dbf24acce1f2bd6d31 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 17:43:57 +0200 Subject: [PATCH 07/28] travis test to fix buid --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 45933fa..dfe9b8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ before_install: - curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / - rm "Carthage.pkg" +- "/Library/Frameworks/CarthageKit.framework" before_script: - carthage bootstrap --no-use-binaries --platform iOS notifications: From af673a188a232a593644c087e005b334fd3ef389 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 17:46:15 +0200 Subject: [PATCH 08/28] fix on travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index dfe9b8c..bbeeced 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ before_install: - curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / - rm "Carthage.pkg" -- "/Library/Frameworks/CarthageKit.framework" +- rm "/Library/Frameworks/CarthageKit.framework" before_script: - carthage bootstrap --no-use-binaries --platform iOS notifications: From ba71838a611dae2017f75d3e34cb0618c11444ab Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 18:18:43 +0200 Subject: [PATCH 09/28] try to fix travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bbeeced..0647dae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ before_install: - curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / - rm "Carthage.pkg" -- rm "/Library/Frameworks/CarthageKit.framework" +- rm -f "/Library/Frameworks/CarthageKit.framework" before_script: - carthage bootstrap --no-use-binaries --platform iOS notifications: From 2e6587ecc69b61da61a621eee984780132edc494 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 18:29:48 +0200 Subject: [PATCH 10/28] fix --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0647dae..52f0ddf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ before_install: - curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / - rm "Carthage.pkg" -- rm -f "/Library/Frameworks/CarthageKit.framework" +- rm -rf "/Library/Frameworks/CarthageKit.framework" before_script: - carthage bootstrap --no-use-binaries --platform iOS notifications: From c26926e54c65dc127dede35dfa4c1dd502016066 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 18:42:01 +0200 Subject: [PATCH 11/28] fix --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 52f0ddf..d0b60c5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,8 @@ before_install: - curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / - rm "Carthage.pkg" -- rm -rf "/Library/Frameworks/CarthageKit.framework" +- rm -f "CarthageKit.framework.zip" +- rm -rf "/tmp/Carthage.dst" before_script: - carthage bootstrap --no-use-binaries --platform iOS notifications: From cf92d76ba5372fb44b7ce5d88fea2cc9ce70cb2d Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 26 Sep 2016 22:34:37 +0200 Subject: [PATCH 12/28] fix --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index d0b60c5..5ed6ba6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,8 @@ xcode_project: App.xcodeproj xcode_scheme: App xcode_sdk: iphonesimulator10.0 before_install: -- curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" -- sudo installer -pkg "Carthage.pkg" -target / -- rm "Carthage.pkg" -- rm -f "CarthageKit.framework.zip" -- rm -rf "/tmp/Carthage.dst" +- "brew update" +- "brew outdated carthage || brew upgrade carthage" before_script: - carthage bootstrap --no-use-binaries --platform iOS notifications: From f3ca4ada8e255fa93c73076959cec77b64b793af Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Tue, 27 Sep 2016 09:45:23 +0200 Subject: [PATCH 13/28] fix compile --- .travis.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5ed6ba6..49e7a86 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,14 @@ language: objective-c -osx_image: xcode8.0 +osx_image: xcode8 xcode_project: App.xcodeproj xcode_scheme: App xcode_sdk: iphonesimulator10.0 before_install: -- "brew update" -- "brew outdated carthage || brew upgrade carthage" +- curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" +- sudo installer -pkg "Carthage.pkg" -target / +- rm "Carthage.pkg" before_script: -- carthage bootstrap --no-use-binaries --platform iOS +- carthage bootstrap --platform iOS notifications: email: on_success: change From d0cbaf46df6570ecace5c1536e2d9eb089bf8da9 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Tue, 27 Sep 2016 21:04:22 +0200 Subject: [PATCH 14/28] fix compile --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 49e7a86..2c4138c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,12 @@ before_install: - curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / - rm "Carthage.pkg" +- gem install xcpretty before_script: - carthage bootstrap --platform iOS +script: +- set -o pipefail +- xcodebuild -project $TRAVIS_XCODE_PROJECT -scheme $TRAVIS_XCODE_SCHEME -sdk $TRAVIS_XCODE_SDK test | xcpretty -c notifications: email: on_success: change From a0625f4cdf2e1fec9b861a2e10fe74b211a00947 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Wed, 28 Sep 2016 08:56:22 +0200 Subject: [PATCH 15/28] fix compile --- .travis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2c4138c..7116e26 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,8 +12,12 @@ before_script: - carthage bootstrap --platform iOS script: - set -o pipefail -- xcodebuild -project $TRAVIS_XCODE_PROJECT -scheme $TRAVIS_XCODE_SCHEME -sdk $TRAVIS_XCODE_SDK test | xcpretty -c +- xcodebuild -project App.xcodeproj -scheme App -sdk iphonesimulator10.0 test | xcpretty -c notifications: email: + recipients: + - sabrine.elbahri@3ie.fr + - benoit.verdier@3ie.fr + - emmanuel.perez@3ie.fr on_success: change on_failure: always From 174ef6f875478fe1ea103d15a161e7341bc7121b Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Wed, 28 Sep 2016 09:18:01 +0200 Subject: [PATCH 16/28] fix compile --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7116e26..f60d8d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ before_script: - carthage bootstrap --platform iOS script: - set -o pipefail -- xcodebuild -project App.xcodeproj -scheme App -sdk iphonesimulator10.0 test | xcpretty -c +- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 7,OS=10.0 test | xcpretty -c notifications: email: recipients: From 47956cd59cfce1a76258ec45fec6dbf825fb5ba2 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Wed, 28 Sep 2016 09:23:28 +0200 Subject: [PATCH 17/28] fix compile --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f60d8d2..bde9dc4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ before_script: - carthage bootstrap --platform iOS script: - set -o pipefail -- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 7,OS=10.0 test | xcpretty -c +- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 7,OS=10.0' test | xcpretty -c notifications: email: recipients: From a82edab05b8d6c57a15ff4292083f31f272f31f2 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Wed, 28 Sep 2016 11:01:54 +0200 Subject: [PATCH 18/28] minimum deployment targe iOS 9.0 --- App.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/App.xcodeproj/project.pbxproj b/App.xcodeproj/project.pbxproj index 5120245..754874e 100644 --- a/App.xcodeproj/project.pbxproj +++ b/App.xcodeproj/project.pbxproj @@ -664,7 +664,7 @@ "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "fr.3ie.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -683,7 +683,7 @@ "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "fr.3ie.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; From 9e19b1de413a1bb1763911260be1ad10457179eb Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Wed, 28 Sep 2016 11:22:42 +0200 Subject: [PATCH 19/28] fix compile --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bde9dc4..00a9c79 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ before_script: - carthage bootstrap --platform iOS script: - set -o pipefail -- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 7,OS=10.0' test | xcpretty -c +- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 7,OS=9.0' test | xcpretty -c notifications: email: recipients: From 5e4116c93163bf44351f9620529bab70e446b4ca Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Wed, 28 Sep 2016 11:36:21 +0200 Subject: [PATCH 20/28] fix compile --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 00a9c79..9bb6e0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ before_script: - carthage bootstrap --platform iOS script: - set -o pipefail -- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 7,OS=9.0' test | xcpretty -c +- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 6,OS=9.0' test | xcpretty -c notifications: email: recipients: From 69d470e87f79f44711b94d68a1cfb3a50f6d7cf7 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Wed, 28 Sep 2016 11:49:26 +0200 Subject: [PATCH 21/28] fix compile --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9bb6e0a..8c86044 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: objective-c osx_image: xcode8 xcode_project: App.xcodeproj xcode_scheme: App -xcode_sdk: iphonesimulator10.0 +xcode_sdk: iphonesimulator9.0 before_install: - curl -OlL "https://github.com/Carthage/Carthage/releases/download/0.18/Carthage.pkg" - sudo installer -pkg "Carthage.pkg" -target / From 64626def9f236b50eb143aee4fb5a7244ec88a64 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Fri, 30 Sep 2016 09:52:31 +0200 Subject: [PATCH 22/28] fix compile --- .travis.yml | 4 +--- App.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8c86044..14bb227 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,12 +12,10 @@ before_script: - carthage bootstrap --platform iOS script: - set -o pipefail -- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 6,OS=9.0' test | xcpretty -c +- xcodebuild -project App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=iPhone 6,OS=9.0' test | xcpretty notifications: email: recipients: - sabrine.elbahri@3ie.fr - - benoit.verdier@3ie.fr - - emmanuel.perez@3ie.fr on_success: change on_failure: always diff --git a/App.xcodeproj/project.pbxproj b/App.xcodeproj/project.pbxproj index 754874e..628ade1 100644 --- a/App.xcodeproj/project.pbxproj +++ b/App.xcodeproj/project.pbxproj @@ -589,7 +589,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; RUN_CLANG_STATIC_ANALYZER = YES; @@ -640,7 +640,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; From 6b1a52387977ed85d15da82523bbe22e225c0218 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 3 Oct 2016 17:59:09 +0200 Subject: [PATCH 23/28] Add social Network framework --- Cartfile | 1 + Cartfile.resolved | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Cartfile b/Cartfile index a74edb2..e0c62bd 100644 --- a/Cartfile +++ b/Cartfile @@ -3,3 +3,4 @@ github "Alamofire/AlamofireImage" ~> 3.0.0 github "Hearst-DD/ObjectMapper" ~> 2.0.0 github "tristanhimmelman/AlamofireObjectMapper" ~> 4.0.0 github "SVProgressHUD/SVProgressHUD" ~> 2.0 +github "sabrineElbahri/socialNetwork" " feature/Swift3" diff --git a/Cartfile.resolved b/Cartfile.resolved index 45b2f04..4fb65d7 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,5 +1,9 @@ -github "Alamofire/Alamofire" "4.0.0" +github "Alamofire/Alamofire" "4.0.1" +github "BoltsFramework/Bolts-ObjC" "1.8.4" github "Hearst-DD/ObjectMapper" "2.0.0" github "SVProgressHUD/SVProgressHUD" "2.0.3" -github "Alamofire/AlamofireImage" "3.0.0" +github "Alamofire/AlamofireImage" "3.1.0" +github "facebook/facebook-ios-sdk" "sdk-version-4.16.0" github "tristanhimmelman/AlamofireObjectMapper" "4.0.0" +github "facebook/Facebook-sdk-swift" "0.2.0" +github "sabrineElbahri/socialNetwork" "810968ee645c3afd3ced30d9345925e47080ed20" From 2aa05aed7f9c6c6a7b4c0796dd74036dd485c413 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Mon, 3 Oct 2016 17:59:55 +0200 Subject: [PATCH 24/28] Setup an exemple of facebook login utilsation --- App.xcodeproj/project.pbxproj | 48 +++++ App/Base.lproj/Main.storyboard | 167 +++++++++++++++++- App/FacebookConnectVC.swift | 75 ++++++++ App/FacebookInfoVC.swift | 38 ++++ App/Images.xcassets/Contents.json | 6 + .../loginWithFacebook.imageset/Contents.json | 21 +++ .../loginWithFacebook.png | Bin 0 -> 3848 bytes App/Info.plist | 40 ++++- Default-568h@2x.png | Bin 0 -> 18594 bytes 9 files changed, 391 insertions(+), 4 deletions(-) create mode 100644 App/FacebookConnectVC.swift create mode 100644 App/FacebookInfoVC.swift create mode 100644 App/Images.xcassets/Contents.json create mode 100644 App/Images.xcassets/loginWithFacebook.imageset/Contents.json create mode 100644 App/Images.xcassets/loginWithFacebook.imageset/loginWithFacebook.png create mode 100644 Default-568h@2x.png diff --git a/App.xcodeproj/project.pbxproj b/App.xcodeproj/project.pbxproj index 628ade1..bd01577 100644 --- a/App.xcodeproj/project.pbxproj +++ b/App.xcodeproj/project.pbxproj @@ -55,6 +55,16 @@ A79825201B18A6FC00F8E795 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A798251F1B18A6FC00F8E795 /* Images.xcassets */; }; A79825231B18A6FC00F8E795 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = A79825211B18A6FC00F8E795 /* LaunchScreen.xib */; }; A798252F1B18A6FC00F8E795 /* AppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A798252E1B18A6FC00F8E795 /* AppTests.swift */; }; + CC30F6FE1DA2924D000146B4 /* FacebookInfoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC30F6FD1DA2924D000146B4 /* FacebookInfoVC.swift */; }; + CC30F7001DA297E4000146B4 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CC30F6FF1DA297E4000146B4 /* Default-568h@2x.png */; }; + CC30F70B1DA2ABAA000146B4 /* socialNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC30F70A1DA2ABAA000146B4 /* socialNetwork.framework */; }; + CC34EA301DA2853900255715 /* FacebookConnectVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC34EA2F1DA2853900255715 /* FacebookConnectVC.swift */; }; + CC6645911DA2B45D008360E7 /* FacebookCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC66458B1DA2B45D008360E7 /* FacebookCore.framework */; }; + CC6645921DA2B45D008360E7 /* FacebookLogin.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC66458C1DA2B45D008360E7 /* FacebookLogin.framework */; }; + CC6645931DA2B45D008360E7 /* FacebookShare.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC66458D1DA2B45D008360E7 /* FacebookShare.framework */; }; + CC6645941DA2B45D008360E7 /* FBSDKCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC66458E1DA2B45D008360E7 /* FBSDKCoreKit.framework */; }; + CC6645951DA2B45D008360E7 /* FBSDKLoginKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC66458F1DA2B45D008360E7 /* FBSDKLoginKit.framework */; }; + CC6645961DA2B45D008360E7 /* FBSDKShareKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC6645901DA2B45D008360E7 /* FBSDKShareKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -113,6 +123,16 @@ A79825281B18A6FC00F8E795 /* AppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; A798252D1B18A6FC00F8E795 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A798252E1B18A6FC00F8E795 /* AppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTests.swift; sourceTree = ""; }; + CC30F6FD1DA2924D000146B4 /* FacebookInfoVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FacebookInfoVC.swift; path = App/FacebookInfoVC.swift; sourceTree = ""; }; + CC30F6FF1DA297E4000146B4 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; + CC30F70A1DA2ABAA000146B4 /* socialNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = socialNetwork.framework; path = Carthage/Build/iOS/socialNetwork.framework; sourceTree = ""; }; + CC34EA2F1DA2853900255715 /* FacebookConnectVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FacebookConnectVC.swift; path = App/FacebookConnectVC.swift; sourceTree = ""; }; + CC66458B1DA2B45D008360E7 /* FacebookCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FacebookCore.framework; path = Carthage/Build/iOS/FacebookCore.framework; sourceTree = ""; }; + CC66458C1DA2B45D008360E7 /* FacebookLogin.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FacebookLogin.framework; path = Carthage/Build/iOS/FacebookLogin.framework; sourceTree = ""; }; + CC66458D1DA2B45D008360E7 /* FacebookShare.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FacebookShare.framework; path = Carthage/Build/iOS/FacebookShare.framework; sourceTree = ""; }; + CC66458E1DA2B45D008360E7 /* FBSDKCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSDKCoreKit.framework; path = Carthage/Build/iOS/FBSDKCoreKit.framework; sourceTree = ""; }; + CC66458F1DA2B45D008360E7 /* FBSDKLoginKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSDKLoginKit.framework; path = Carthage/Build/iOS/FBSDKLoginKit.framework; sourceTree = ""; }; + CC6645901DA2B45D008360E7 /* FBSDKShareKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSDKShareKit.framework; path = Carthage/Build/iOS/FBSDKShareKit.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -120,6 +140,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CC6645911DA2B45D008360E7 /* FacebookCore.framework in Frameworks */, + CC6645921DA2B45D008360E7 /* FacebookLogin.framework in Frameworks */, + CC6645931DA2B45D008360E7 /* FacebookShare.framework in Frameworks */, + CC6645941DA2B45D008360E7 /* FBSDKCoreKit.framework in Frameworks */, + CC6645951DA2B45D008360E7 /* FBSDKLoginKit.framework in Frameworks */, + CC6645961DA2B45D008360E7 /* FBSDKShareKit.framework in Frameworks */, + CC30F70B1DA2ABAA000146B4 /* socialNetwork.framework in Frameworks */, 172F50451C68E6D0000A9D78 /* AlamofireObjectMapper.framework in Frameworks */, 172F50461C68E6D0000A9D78 /* ObjectMapper.framework in Frameworks */, 177691BC1C10C13E00A3D08A /* Alamofire.framework in Frameworks */, @@ -191,6 +218,7 @@ A798250A1B18A6FC00F8E795 = { isa = PBXGroup; children = ( + CC30F6FF1DA297E4000146B4 /* Default-568h@2x.png */, A79825381B18A70C00F8E795 /* Core */, A79825151B18A6FC00F8E795 /* App */, A798252B1B18A6FC00F8E795 /* AppTests */, @@ -258,6 +286,13 @@ A79825391B18A71000F8E795 /* Frameworks */ = { isa = PBXGroup; children = ( + CC66458B1DA2B45D008360E7 /* FacebookCore.framework */, + CC66458C1DA2B45D008360E7 /* FacebookLogin.framework */, + CC66458D1DA2B45D008360E7 /* FacebookShare.framework */, + CC66458E1DA2B45D008360E7 /* FBSDKCoreKit.framework */, + CC66458F1DA2B45D008360E7 /* FBSDKLoginKit.framework */, + CC6645901DA2B45D008360E7 /* FBSDKShareKit.framework */, + CC30F70A1DA2ABAA000146B4 /* socialNetwork.framework */, 17965D541C561B0C0013D390 /* Internal */, 17965D531C561B030013D390 /* External */, ); @@ -269,6 +304,8 @@ children = ( 17EE77441C6C7C65009638A6 /* MailgunVC.swift */, 172F06811C6B2C3600B711B2 /* WeatherVC.swift */, + CC34EA2F1DA2853900255715 /* FacebookConnectVC.swift */, + CC30F6FD1DA2924D000146B4 /* FacebookInfoVC.swift */, ); name = Controllers; sourceTree = ""; @@ -425,6 +462,7 @@ buildActionMask = 2147483647; files = ( A798251E1B18A6FC00F8E795 /* Main.storyboard in Resources */, + CC30F7001DA297E4000146B4 /* Default-568h@2x.png in Resources */, A79825231B18A6FC00F8E795 /* LaunchScreen.xib in Resources */, A79825201B18A6FC00F8E795 /* Images.xcassets in Resources */, ); @@ -451,6 +489,14 @@ "$(SRCROOT)/Carthage/Build/iOS/AlamofireObjectMapper.framework", "$(SRCROOT)/Carthage/Build/iOS/ObjectMapper.framework", "$(SRCROOT)/Carthage/Build/iOS/SVProgressHUD.framework", + "$(SRCROOT)/Carthage/Build/iOS/socialNetwork.framework", + "$(SRCROOT)/Carthage/Build/iOS/FacebookCore.framework", + "$(SRCROOT)/Carthage/Build/iOS/FacebookLogin.framework", + "$(SRCROOT)/Carthage/Build/iOS/FacebookShare.framework", + "$(SRCROOT)/Carthage/Build/iOS/Bolts.framework", + "$(SRCROOT)/Carthage/Build/iOS/FBSDKShareKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/FBSDKCoreKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/FBSDKLoginKit.framework", ); outputPaths = ( ); @@ -468,6 +514,7 @@ 17EE77621C6CCC9A009638A6 /* MailgunResponse.swift in Sources */, 172F06821C6B2C3600B711B2 /* WeatherVC.swift in Sources */, 17EE77451C6C7C65009638A6 /* MailgunVC.swift in Sources */, + CC34EA301DA2853900255715 /* FacebookConnectVC.swift in Sources */, 172FE3431C69F0FA00496519 /* CurrentWeatherResponse.swift in Sources */, A765CDF61B25E191004CD54A /* NSBundle+Root.swift in Sources */, 172F06881C6B2C6F00B711B2 /* WeatherData.swift in Sources */, @@ -481,6 +528,7 @@ 173B57DF1C6B45FE00FEB036 /* NSURLRequest+Body.swift in Sources */, 172F06851C6B2C5F00B711B2 /* IntTransform.swift in Sources */, 8D503B681BA059AD00C84F58 /* AppError.swift in Sources */, + CC30F6FE1DA2924D000146B4 /* FacebookInfoVC.swift in Sources */, 17EE77581C6C891E009638A6 /* TownWithWoeid.swift in Sources */, 172F068E1C6B2C8A00B711B2 /* WeatherCondition.swift in Sources */, 17EE77561C6C891E009638A6 /* ForecastResponse.swift in Sources */, diff --git a/App/Base.lproj/Main.storyboard b/App/Base.lproj/Main.storyboard index c3d8b46..abfe3a3 100644 --- a/App/Base.lproj/Main.storyboard +++ b/App/Base.lproj/Main.storyboard @@ -106,7 +106,9 @@ - + + + @@ -117,6 +119,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -129,6 +286,7 @@ + @@ -206,7 +364,9 @@ Forecast 2 - + + + @@ -219,4 +379,7 @@ Forecast 2 + + + diff --git a/App/FacebookConnectVC.swift b/App/FacebookConnectVC.swift new file mode 100644 index 0000000..dd1345a --- /dev/null +++ b/App/FacebookConnectVC.swift @@ -0,0 +1,75 @@ +// +// FacebookConnectVC.swift +// App +// +// Created by Sabrine Elbahri on 03/10/2016. +// Copyright © 2016 3IE. All rights reserved. +// + +import UIKit +import socialNetwork + +class FacebookConnectVC: UIViewController { + + //MARK: - Properties + var facebookId: String? + var firstName: String? + var lastName: String? + var email: String? + var profileImageView: UIImageView? + var loginWithFacebook: LogInWithFacebook = LogInWithFacebook.init() + + //MARK: - VC methods + override func viewDidLoad() { + super.viewDidLoad() + } + + //MARK: - Login + @IBAction func LogIn(_ sender: AnyObject) { + loginWithFacebook.login(self) { userInfo, cancelled, failed, isDeclinedPermissions in + if userInfo != nil { + self.facebookId = self.loginWithFacebook.getFacebookIdFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) + self.firstName = self.loginWithFacebook.getUserFirstNameFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) + self.lastName = self.loginWithFacebook.getUserLastNameFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) + self.email = self.loginWithFacebook.getUserEmailFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) + + self.loginWithFacebook.getFacebookProfileImageUrlAsync(self.facebookId) { image in + self.profileImageView?.image = image + self.profileImageView?.contentMode = .scaleAspectFit + self.cropping(imageView: self.profileImageView!) + + self.performSegue(withIdentifier: "PushFacebookInfo", sender: nil) + } + } + + } + } + + //MARK: - Treatment on image + func cropping(imageView: UIImageView) { + imageView.layer.borderWidth = 1 + imageView.layer.masksToBounds = false + imageView.layer.borderColor = UIColor.white.cgColor + imageView.layer.cornerRadius = imageView.frame.height / 2 + imageView.clipsToBounds = true + } + + //MARK: - TextFieldKeyboard + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + + + //MARK: - Navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "PushFacebookInfo" { + let controller: FacebookInfoVC = segue.destination as! FacebookInfoVC + + controller.firstName = firstName + controller.lastName = lastName + controller.email = email + controller.ProfileImageView = profileImageView + } + } +} diff --git a/App/FacebookInfoVC.swift b/App/FacebookInfoVC.swift new file mode 100644 index 0000000..50f1d8e --- /dev/null +++ b/App/FacebookInfoVC.swift @@ -0,0 +1,38 @@ +// +// FacebookInfoVC.swift +// App +// +// Created by Sabrine Elbahri on 03/10/2016. +// Copyright © 2016 3IE. All rights reserved. +// + +import UIKit +import socialNetwork + +class FacebookInfoVC: UIViewController { + + //MARK: - Outlets + @IBOutlet weak var firstNameTextField: UITextField! + @IBOutlet weak var lastNameTextField: UITextField! + @IBOutlet weak var emailTextField: UITextField! + @IBOutlet weak var ProfileImageView: UIImageView! + + //MARK: - Properties + var firstName: String? + var lastName: String? + var email: String? + var logOutWithFacebook: LogOutWithFacebook = LogOutWithFacebook.init() + + //MARK: - Vc methods + override func viewDidLoad() { + super.viewDidLoad() + } + + //MARK: - LogOut + @IBAction func LogOut(_ sender: AnyObject) { + logOutWithFacebook.logOut() + let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) + let controller: FacebookConnectVC = storyboard.instantiateViewController(withIdentifier: "FacebookConnectVC") as! FacebookConnectVC + self.present(controller, animated: true, completion: nil) + } +} diff --git a/App/Images.xcassets/Contents.json b/App/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/App/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/App/Images.xcassets/loginWithFacebook.imageset/Contents.json b/App/Images.xcassets/loginWithFacebook.imageset/Contents.json new file mode 100644 index 0000000..9acae77 --- /dev/null +++ b/App/Images.xcassets/loginWithFacebook.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "loginWithFacebook.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/App/Images.xcassets/loginWithFacebook.imageset/loginWithFacebook.png b/App/Images.xcassets/loginWithFacebook.imageset/loginWithFacebook.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0d202c68465148e12b10fef21c56c5df0630fa GIT binary patch literal 3848 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 literal 0 HcmV?d00001 diff --git a/App/Info.plist b/App/Info.plist index 669a772..47abee5 100644 --- a/App/Info.plist +++ b/App/Info.plist @@ -18,6 +18,26 @@ 1.0 CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + fb210886035996098 + + + + FacebookAppID + 210886035996098 + FacebookDisplayName + AppTest + LSApplicationQueriesSchemes + + fbapi + fb-messenger-api + fbauth2 + fbshareextension + CFBundleVersion 1 LSRequiresIPhoneOS @@ -40,14 +60,30 @@ https://query.yahooapis.com NSAppTransportSecurity + NSAllowsArbitraryLoads + NSExceptionDomains + fbcdn.net + + NSIncludesSubdomains + + NSThirdPartyExceptionRequiresForwardSecrecy + + + facebook.com + + NSIncludesSubdomains + + NSTemporaryExceptionAllowsInsecureHTTPLoads + + NSThirdPartyExceptionRequiresForwardSecrecy + + api.mailgun.net - NSIncludesSubdomains - NSTemporaryExceptionAllowsInsecureHTTPLoads diff --git a/Default-568h@2x.png b/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 From 940eed27e775d347c7f06ed155c25d035ebdec66 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Thu, 6 Oct 2016 15:26:50 +0200 Subject: [PATCH 25/28] Facebook connection exemple --- App/AppDelegate.swift | 12 +++- App/Base.lproj/Main.storyboard | 62 ++++++++++-------- App/FacebookConnectVC.swift | 45 ++++++------- App/FacebookInfoVC.swift | 45 ++++++++++--- .../misterrabbit.imageset/Contents.json | 13 ++++ .../misterrabbit.imageset/misterrabbit.png | Bin 0 -> 96854 bytes App/Info.plist | 42 ++++++------ 7 files changed, 136 insertions(+), 83 deletions(-) create mode 100644 App/Images.xcassets/misterrabbit.imageset/Contents.json create mode 100644 App/Images.xcassets/misterrabbit.imageset/misterrabbit.png diff --git a/App/AppDelegate.swift b/App/AppDelegate.swift index 82edf31..15cb010 100644 --- a/App/AppDelegate.swift +++ b/App/AppDelegate.swift @@ -8,6 +8,7 @@ import UIKit import ObjectMapper +import socialNetwork import Alamofire import AlamofireObjectMapper @@ -16,12 +17,19 @@ import AlamofireObjectMapper class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - + var facebookAppDelegate: FacebookAppDelegate = FacebookAppDelegate.init() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. + + facebookAppDelegate.launch(application, launchOptions: launchOptions) + return true } + + func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { + return facebookAppDelegate.openUrl(app, open: url, options: options) + } func applicationWillResignActive(_ application: UIApplication) { // 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. @@ -39,6 +47,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func applicationDidBecomeActive(_ application: UIApplication) { // 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. + + facebookAppDelegate.didBecomeActive(application) } func applicationWillTerminate(_ application: UIApplication) { diff --git a/App/Base.lproj/Main.storyboard b/App/Base.lproj/Main.storyboard index abfe3a3..afad433 100644 --- a/App/Base.lproj/Main.storyboard +++ b/App/Base.lproj/Main.storyboard @@ -119,10 +119,10 @@ - + - + @@ -144,21 +144,19 @@ - - + + - - - + - + @@ -188,10 +186,10 @@ - + - - + + - @@ -245,8 +233,6 @@ - - @@ -258,7 +244,7 @@ - + @@ -272,12 +258,12 @@ - + - + @@ -286,7 +272,7 @@ - + @@ -378,8 +364,30 @@ Forecast 2 + + + + + + + + + + + + + + + + + + + + + + diff --git a/App/FacebookConnectVC.swift b/App/FacebookConnectVC.swift index dd1345a..d839a3a 100644 --- a/App/FacebookConnectVC.swift +++ b/App/FacebookConnectVC.swift @@ -8,52 +8,46 @@ import UIKit import socialNetwork +import SVProgressHUD class FacebookConnectVC: UIViewController { //MARK: - Properties - var facebookId: String? var firstName: String? var lastName: String? var email: String? - var profileImageView: UIImageView? - var loginWithFacebook: LogInWithFacebook = LogInWithFacebook.init() + var facebookId: String? + var logInWithFacebook: LogInWithFacebook = LogInWithFacebook.init() + var logOutWithFacebook: LogOutWithFacebook = LogOutWithFacebook.init() //MARK: - VC methods override func viewDidLoad() { super.viewDidLoad() } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(true) + logOutWithFacebook.logOut() + } + //MARK: - Login @IBAction func LogIn(_ sender: AnyObject) { - loginWithFacebook.login(self) { userInfo, cancelled, failed, isDeclinedPermissions in + logInWithFacebook.login(self) { userInfo, cancelled, failed, isDeclinedPermissions in if userInfo != nil { - self.facebookId = self.loginWithFacebook.getFacebookIdFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) - self.firstName = self.loginWithFacebook.getUserFirstNameFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) - self.lastName = self.loginWithFacebook.getUserLastNameFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) - self.email = self.loginWithFacebook.getUserEmailFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) + SVProgressHUD.show(withStatus: "Chargement") + + self.facebookId = self.logInWithFacebook.getFacebookIdFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) + self.firstName = self.logInWithFacebook.getUserFirstNameFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) + self.lastName = self.logInWithFacebook.getUserLastNameFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) + self.email = self.logInWithFacebook.getUserEmailFromUserInfoInTheCompletionHandlerFromLoginFunction(userInfo!) - self.loginWithFacebook.getFacebookProfileImageUrlAsync(self.facebookId) { image in - self.profileImageView?.image = image - self.profileImageView?.contentMode = .scaleAspectFit - self.cropping(imageView: self.profileImageView!) - - self.performSegue(withIdentifier: "PushFacebookInfo", sender: nil) - } + self.performSegue(withIdentifier: "PushFacebookInfo", sender: nil) + } } } - //MARK: - Treatment on image - func cropping(imageView: UIImageView) { - imageView.layer.borderWidth = 1 - imageView.layer.masksToBounds = false - imageView.layer.borderColor = UIColor.white.cgColor - imageView.layer.cornerRadius = imageView.frame.height / 2 - imageView.clipsToBounds = true - } - //MARK: - TextFieldKeyboard func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() @@ -69,7 +63,8 @@ class FacebookConnectVC: UIViewController { controller.firstName = firstName controller.lastName = lastName controller.email = email - controller.ProfileImageView = profileImageView + controller.facebookId = facebookId! + controller.loginWithFacebook = logInWithFacebook } } } diff --git a/App/FacebookInfoVC.swift b/App/FacebookInfoVC.swift index 50f1d8e..15630a1 100644 --- a/App/FacebookInfoVC.swift +++ b/App/FacebookInfoVC.swift @@ -8,6 +8,7 @@ import UIKit import socialNetwork +import SVProgressHUD class FacebookInfoVC: UIViewController { @@ -21,18 +22,46 @@ class FacebookInfoVC: UIViewController { var firstName: String? var lastName: String? var email: String? - var logOutWithFacebook: LogOutWithFacebook = LogOutWithFacebook.init() - + var facebookId: String? + var loginWithFacebook: LogInWithFacebook? + //MARK: - Vc methods override func viewDidLoad() { super.viewDidLoad() + SVProgressHUD.dismiss() + setupFacebookInformartion() + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + cropping(imageView: ProfileImageView) + } - //MARK: - LogOut - @IBAction func LogOut(_ sender: AnyObject) { - logOutWithFacebook.logOut() - let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) - let controller: FacebookConnectVC = storyboard.instantiateViewController(withIdentifier: "FacebookConnectVC") as! FacebookConnectVC - self.present(controller, animated: true, completion: nil) + //MARK: - Setup view + func setupFacebookInformartion() { + firstNameTextField.text = firstName + firstNameTextField.isEnabled = false + lastNameTextField.text = lastName + lastNameTextField.isEnabled = false + emailTextField.text = email + emailTextField.isEnabled = false + + self.loginWithFacebook?.getFacebookProfileImageUrlAsync(self.facebookId!) { image in + self.ProfileImageView.image = image + self.ProfileImageView.contentMode = .scaleAspectFit + } } + + + //MARK: - Treatment on image + func cropping(imageView: UIImageView) { + ProfileImageView.layer.borderWidth = 1 + ProfileImageView.layer.masksToBounds = false + ProfileImageView.layer.borderColor = UIColor.white.cgColor + ProfileImageView.layer.cornerRadius = ProfileImageView.frame.height / 2 + ProfileImageView.clipsToBounds = true + } + } diff --git a/App/Images.xcassets/misterrabbit.imageset/Contents.json b/App/Images.xcassets/misterrabbit.imageset/Contents.json new file mode 100644 index 0000000..0da7e07 --- /dev/null +++ b/App/Images.xcassets/misterrabbit.imageset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "misterrabbit.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/App/Images.xcassets/misterrabbit.imageset/misterrabbit.png b/App/Images.xcassets/misterrabbit.imageset/misterrabbit.png new file mode 100644 index 0000000000000000000000000000000000000000..c7bca3ec5d2e7d0b0cb6fbcbed75301866530bd7 GIT binary patch literal 96854 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%0AqHlzw0?pV6zT%@d{~=Fe zAO_IK;{N&R0F{Sl=V^VX9RM=Z7OyM|2W8LH&(CNTwikRZyF`zN=|{h@Pb5_uvo9Pj zV5M9F72<5JmRkp2zg*8!;$y_kTjdVhHq5{<=`1yytqM-SKfK6c=X3$EhcTSfx95B z{@XYO#j7{vrh;gqP11lHj1rwURN?o(RXWQb6P}!5!B(RN&ySC@&u=v*Z=McG14X0& z9tSov@234!1|_*8Vz4EeYbZ9!1Gc0Af^QejJST)n_5w^h!ed?r)a>br^xWdQ4_~@o zn@r`kQ*67ezPq7Sj|gk2c$eEl>wCJM8)KQr5eFF0Cceu_gZ!H@45;yW~t6+ zDU=h)2T*ft(GHOtPO!nlOr5oyuu2`}os!kDpn97M%4k!gR4A-9+52@&2g2Q=qI@hX zIFPZ7qw%SUL)f&nyAGTe$SNSXpac7tn=c+}6WzUQ0&_#vS1zyIUQ8(vx&v}*x(ptd;btY&8~F9$nzl~bOHENtusYf(x&CJI1j5LC{% zl3}L5ZR<6c{^$EzTK@J!U|?<(JeXJrjE32W+h8O*S*$(c#Zz%8fr2PzL@^~+5~;YI zC%Q>(tJ5?*7B!3FST^Z=e)U4|FdzLZ*vU;%FAjDe&1PBvPsL9&>y461II62DLn14+ zIg~6&MKk33<71RBsOGGFdbV4~58zIWkJ!1GmyQQ6c-94VY^*JqSvl;y>45Ifl%O9G z^~%cDr!-HmJn&Aj9>4)~a4caf6*5r)mhj*@t5V1JGggJmr;W#{Y}!~USSL_Dv2_9h z52_KDhwo{KQ8cVzitN zcq|%P55{It@KItZTFnMGz4G{H{-)(a?{0bE_CIW(+lyN)XE@h^}6Pq(>Q? z@07_wxXT*@?gi7>813<^2)qE*B8)_B$-^s1fWYV zr%lx-$TT!0o*Q=bN<_|KCfi?mX5o*%^SO_IpyhA=s^ur&`{Mk&E?@uR z^5gqn8}8cEesKNX&Cfpl$o+TS_`9F~;H#hbP|Ld{(677fzmDwwb23PY!L2IR&l&|M7xU5a5Gk`R$J01Lp~Q%+mGR>h&6&)xB-Uw-LR z?}EVjk-u#D}(&Df&R8FtCrn%%XRUOa@DvDXu)eISQEv`Netj7Wn_`SIi_m>SRB&XCx(-}cJNuD6qQ)HrI0`G}a8inwUMnR1fo9e93_ zG4@;SiZFnlf`_RSp_W7M{34+t+N4`0&!vAV*7L?{7R?ngo#3-qK*!arwTd({1fBfqwJ}tS0_q4Qt&xQpE=U@5k`~K&LUs?RX)olk~b(;o?V^A#N zv49#xWw;>$nBJAwiC8aqb%T5V^V^?>q5`akoI1(C=-sA4y<-2ftM2>ymp=IJmX>dQ z{qNSk_-JuFD58Jk6Zw$KtRgfg;BzEwET{d+knzt?J_K?7Bkx6V-N_Bg&lA+mM)XhQ zZBqRb$Xv~#^O6fQI?WpBP3Mk;f=kH;&(%!Y=<=#*i$co{GG3Mq+nJ~j4eK|Fd;R_E z3j}&yETR;meaZ3~V*IMz^nzY{|ETDTi^?|NhQ|ipX4ZYEe?`QJdySY4GjKx$+ix^0 z{651-oXwBJg|>@%hnSO;1>ylXS#~ii<35A+>1x3D4XKHBU=dZfi$ym?WnecqVzRN_ z{q38!yteYW#~*n3p_>;!a4md3zk1%bwX6DCH~Z~MvFryQA{M})*SqhcJ~l`-+-oYQ zA+Eb2uK)Z$zYMJ3dhIVf=HZE~SMY#Y?^gBh0@lCv^^bk(qb-;H=KDwYuB&DsLnv0W z;be$6QN6hO804l>6?@cc)h&MDdU&cpT>r0s|Ki;@{ci0GOQ5ub-Rk@(lz+%}ykZIU zFhivdz3$|0sE(X@?ll4K6Gdw&ZxN!n*)gO;u3bm@csk;w;jt{?jz*H2q`a;fxBhJv z#C2sfIyhQ=$y~a2FL!UNr6VE+M@6Dv*t$w_zF7y#5$J}=+H^eXLIYITaRaX;*a4GC z5%giH5py}?m;kDfoMOf)ra>-o+$lnS21>ipN<@F7nW^jiu#Rv?QMn4o1zg0iD8|8g zk4EUI4;u|LV*;Csa`{ns2zaG$!>H?39_%=jSoDXrJ)oU9r1z5Sko5xV@VEfhY3X~KAR}G#ZfPU z9tr~(n_7$q?xo6^bI*EBQYR`IR;O5ULxcv7QA-U3>@s?_S*pyILgqBGW#2VTP<|vK z*3q+~8iYr|iiLjyuMY{p_H|F>;jD83Ff%5igTvZ5yaVF5l^KBaG~gtBHiMN>Kvrrb zyM1;|EI=1i9?<^nfBw!lKKb63mLGlR^AFy8<$bqY@~aWKw3ggy(QYj6epY`z zSx24v!MXtG9xU!A6D}fZ!~Bfas?jk0B-8IhZQWKe?Gdv+am*!-IK>zgLtE8s%n@Wt zV;CFKjSlHkY9fa-VoVT6!s573Ou59A6#F53W|~d>42aKC_3+jt1OeQBu)K0$mhEpf zhbDNDyU<8)&B5OSI*>!7MjR;@galVsJt>rBlS8{W5rS~L?$1lV^r`nidV1H5zvr>; z(wI9LWZWhNt8c~CM;U!PYv?qRy&Tp}Bg%Vh+@Rl~jrz${3^GU|f>w@1b zoeuiVwO=(UC_^8dtQE~dO<+K*y(+&$s7lsMjhus5=INZ30Z-J^`{Rtvk7k=;X~ zy#vWMRcb(6p(xR95u+|~%p;CF#FP}^>rSSb;5Q_>USd)b`chlEJj4YoBfh1uhaw+* zD?uz*bRZ!(V2xbISF0qgu|8RBK2^24aw^lP90s~>;wbNAi)n^&Hl@8o;3 zNe;Xj>KOq~B-ADixwuvSFZ@n)Y7-u@>>3+2I=wo|ssh&aZXOE(>plRTibo97SwAU) zXDPYD9tqWEMr7geDGhWb3zt;?Z+)aU(ByG}^+bQNus1UCV87#rz1k<09&JqY#>JuI zvGdD1>IjhZ;7KPQw-JI-@4;23K@Hn&v?|6EW)#sOPRBiBz)`jEDV<@oM;G0p8rzDE zZN19%7 z!GEU}i3Zi0Z)Db|e+8+_;?~z5kNZfm7!dQ`{D>_j z7=di`DX^ei(pnmKRv>jL2E|H*(Y4-m)z82JK~Vwg;^YRz2|=oGw27jCdJgAZxe+6e zw;tO0?5d@=T>AgM^~F!3HrkJU0KE=!*>AqRYUxc!c0W(347Nk|?Atl{K@V$P& zp$t9*f_ls&y6qxo%noDm<3q8%N&r2xiOFqdbDOyACO*3v#HKcr<68}*J2Z(s%5=M- zYA}i}w;1<}Deynwp3evCph=)>Oi!w|a>h0_HT?N$Sw~K$-~qdG=MBFB*x%RE^8J7P z?2{|+;tXvSNX-jA)E~VRs%AV8tx@A^DI`{-kRPXGCQbjog?G>S%tuk}=dXVJjkbfY zO=KZ^j>$Fp(u+=(;+P3OAqkfAX&ckCZSAAW7hLy?|N2J=@Td#T$6CJstxsM4oA12x z?1GLXubRoWWC%lD=h4UPqQjnYi$eKuMM@FOvPG(jhT#q-EI zQUlyr6#iRVGjp_B>A!+9673hp+egIb>F^zgwGW)Y_PJ8lyh!LP=aF@(sQK}PhaPcL zF{{pvDVT0G)nRrFjgOd6G78qk=cv+LZV($gjyN9Krp;`k3mZ+v4M>Fz=E6phDZi1= zZKhLO@WdAN$UbehhZJdx7y;J(BC69kPprR1ot|~DJx)YbB{0G=D7`#*m6 zy|-Wg3xE<=9g6#L0A0-c#A;Zah(Np_i*RGa5 zJr5g86`chq90FMpIX9Thq2V(bBy@v&cWij<*FXK*KY#fHAAKJ>=x0CP^5gG)_LggZ z`sBm6srq(=oyts%u0j?oH47Be_GH}X^bnX)t>kr>*J_M~jL8_2K=WnevVm?O{@k)Y zIS6ya0DMOUNwqc7+og>=sj=Q0OmrqI>#WIpP8jYutl3~nm`WnciRX)T`I#b(JLjbn zZX#k7<^_l**t$nSV!HPVw^7d;k{lPc?@xzeLe)v5t|MSDIYI+f78<-Yri)c<<%E`R}iP`lBr$e0R%- z-h*0&fAFopyX%Hutb6{Uz7y*`rv6-lM@48N5{_`JRjc7NS}Vl_U0gIo3c>nRJm-mZ zLtFq0-XQpIWraw2LWIw*{GCCfW}*(ECb4F{BKv~DsdT3zRpbvSLv*2%b^in)Ge~c@pesO=TLgPA-jdlZ(@sp^?K{1Y{j+K(pqbIy`{X~ zRNTmAHWH&-bn(5aR4*o4EMmfaVYA+ZyUaSmy_!V>JEF=QK(p*Cj#&ux;VrMNob&td z{o`lfgIxG~&@cpF`P_TI@x>2(|6f1#@Bj4ifBy3O!F50+{`d!5zV+3=x#Lg&@5t^y zCjz7>Mv>vE1i=xZy%nX=Z>EHZm(opGmTE=OXi#3M28oaQv=+Mk)#n!6e*MpW^zWbg z>fgTy+|-BP-SVZsYx&`~K7Hr)zj*esyIT*ujH!;eoI2K|)Y3z0PDlG}d^A7N3#SlKMt9Nx2Mq1SprKi$}C^VNy{^XjykM+_llLG9vVZ;+=`ozG(GfJb2B1 z<>G#mA}P8;=aqGIEkb0}M}{4G7dgxg82BDfK$jXbqPvn0i9u&cOO6~G9^0nQZ6OMq z=;B5mh42Q}OY7~RGAyq%l{Of28^Ot7iCyZER!xzh#jyPXW*r2-O41bcfP0O2sWJx^ zP}~KFogX!U!BF<>T>HY}xp!XjyZ`ydzyI^!eC-SG{qkr2;tQWZmE~Xi!h3%5AD{ij ze|;Ig-M4Lx%h(S_9AY^#CuKjX@0UR@0^F$b2X!Js6+trY@EDPnYgI( zt=;ijtFqVNwo*cX5JFTO%{xgZB7`KllS~r~XQPIQj)FP@Jt6252yRV0risVZNC`=C zSfhnk}y{+rIwc z^)D>~?b))b^XMyv;XQu4A|0mzP}ICtK4wSzY)zHuU_st2t`K5fzVK0Zl;i6cld17dQ%y#H0IXR;~Nc$ zt*Y38q13Rh>f*&rQ}2!oR+BM)8uxYLW$fe_j3n9mlStZTn$RE0b^Mc{PwpJ)q$?#& zJG8WOctV21K{cM4C~qaZ`i^hh_|mc^4_tM{@4ox_Prds??`wJ2yINY_)$*T+5SvvjM~((QJ4c|6^|K#xDv6BIhU zp%X6uA)9Bf(Y}kd?4V5BaN`CIwN{C}JfQh=@9=ZogU@vJuR7lK@R80H$NC>SGBo#? z{+1)eoV|uQ`|%~co`X|^G@aHxVc<#p-wL&cG1qIyHv@Yip*BL zu!*U~^%~zsN$_8gvAo_`0dKRxm|af+>&b2E#KGb5A#K&cUOcQfsVUOWl#F1r>g=9M zP5U|3`UcexWD_9_q5KtcTpy|^%eu00KIBwW+GDT0uw?GNSN-g#-~8e~{Ow@QKR z{@;H18$bK6-HJXU8l*>}h;=DLeY31b6hYrkOuzc@p(l?Yf4;l-rGcU6dlXM~_CMLt z|LF0qWrx}x+IQ^1y+`NoIy`UZ;knz7+`siO=Sm(+;-ucCb!|oigi2mufs?t-v!k;}A!kqRW&YG$i&6 zr?z3aN!I1s#^MHJaRXllt(Rr2po&O7yMY|vY)Ecb#}5u=l==x5caeCQld2)oH>p+( zNKzu?LSs;tA(3^Lb1tt_d;I9e$5t<#bK_;- z|J9Gb@st1f(dC!yQ}*K#Ka-3?XnzZ=hgFeKr_1$H|G?erHr)Km>vwP7anF|Bw{P5e z+s0kDZ`yO~#@)AV-gE2bJ-2PycgyB|w{1Ca$F`$)ZasF-&enT&o|wC@ec|Em#mD*| zJktB%vHm4(s>L1p2fL_yJD3}e5SQ=P{pkSn*iihuvrfl@GV4QhZv*Rg)B(n8EvSf* z!|LQ#ZF)0>Dq%MAg^k9-Mw3+Y2oaqtZ{R8$0d!*-t!L9xJxp?!DtSzq*Mna-UD&zl zo7O3#KCE1T0SkC(41;sGZ>y2U>S-Jg{ZUiT#I^ zeF_^-q5cA4NK)T4>tJ9MLH`N6V@*f*ZR<8)|H}G5t=)R{E1Rx(Y2($eZ@*#F-aB?5 zn}4i#N$2p2KJCf@!}31;vL3^VUVK@Xeq|s2_%QvHmVa7jdQ!u$R~mNf?ZDxKpY zh55Et^2$A$%eJX+KVo@XS?3(XBV)#LLF%{*to!X{j2&;+$9Jkz+sWKkHou9>ZvxyA z@xXm?BL^yNLJI(TZZkc;2}^F%#P=#kI@Lvn7Q>eRrL2P*!hD0|-Up}y!i=xpfSLt`x$pF88zjid#2qyMEoaJNF*Hb6@MVoA+P2Vb8T&58k$~eO{|#X`f-0hI@*z zufgq45zaNZW0ltYgx>lT;dqXAKTSHMuWa!79PN1$cP<_>-qC8fYR~YcTL!P)ZFu`U z46sgF2Bh57hFDK|#IQ>=S@Q}iaX>w`8%u2^vzwV5XcIus7NpPoCZ@0%C}*;p>GW1I zxm6e2sfr&~jt}apHlvuZi>Qa~|4P=+s~T~a3&7O++M@v39%O8gw}Et73=}ffY|7&E z>6O|OLxvv4&GBIu9}Tdv&|7C+Kbma!dY|a-|I@lHw`@N+uXS+gfZ@JY#r3<6U$^u4 zb=!~Ku=B*td)x0mIxxRmw|J0RuH;s#`A4*-M|GAb2nXmfgIU%pz4-~ux=L?ZGQ{57 zVYv0E_WHfbYj-K%4%QjLZE%smI$`Ro)j5I@%%Z-HqTeIZmeDrt=mFj64t;7Xk=a6K zw~)Eb6bKg5n+c??Bn1BCc0GU|JE%%@s53eOED(A)oX7q!|GOn4-U#~i^|iuanJA!+ z>|)uOPn)tS<4BSv=x!C(MLS7j*kO$N*jSJP+$Z~iy*btmV#o)!%bs=#~TB*KR*PXVbwsn-5>JQ@t;dXt*- zn`^8`QKQmZVO^Vybp?ZK`UbCkebb+|?tidH^DO6CP1v7iJr8S5iv|cF{>D8W!1^CI z9QfnLgO_hQbj6m#f82NgKCj(*;@Vv&uG)U|+Fi%4*>UvBt%v4pK6vepV>j$>yJ2_x zbvs(G-_d&A*5l`wbu1Pnz|TcJwBM-a6gsBM=~Ji1ckLD(pa_HM88Xn zd8JqKq`J#l)=wr8H2JR9$u;9oP9b33B(V;m-3qLajj6gr|O$^a>=Z> z`F*Rpd#_u+_13+|7W8U>^)-xZHExsbIOuVMb%}zy+CWBR{rn_lVUqm3vQjb$42=G}KdXW@@bkrsK z9irVPa>f$QT36JC$Z`fdA8G_VeF-6j!lhtCx%=I-Nz zS8Y3d*Rg@+Dh5`9o+P0pzyfS$h0nUAzn#+gW!(@9lCc0A_c0+G=_0k<0M7Mzd|I&V zXe?4R5GlZFm);z8AbiK%sOusC9dV06rx8=j|I{T^SdE^+&sU zu7$Y1zsCBLw6jjC%&x@xz}4Fh-*KdOrJ8+`w6CF@@Yw|SbBqPo+BR6D13|>!@2VBe;T30M`QHZ2qTS7DzPq&hCE5U1bu^~yc1$F7q7%z@;NMn*@?&V@IlY6P%t#NNnhnp#xb&$+@I>lQZL%_O*8+@l&zhcw=8+NxY zQ4p|FW*xjc2-ZB*Z&=Wy1I_Q&$P2JW)_G+e(iC*^I9!N`kBYb{zZtV(dQL%`21Z7? zY?`m2HaSpj#$AZewFc@2RSR&H(Zti`qPbK8$)Wu`v)-_uH>##xy+uviIXLeuFJ_Hm z+9-}oh>x&hoSKM{pelUEDYOQ@f?`mQ^yiIr(#@P()>pQ5UcGh`urBAOjjYRhSi=G9 zmv7v6-Ogi+2XR;<;|^uu`d!C=`^q*5`PXbe0wxDOuibGJKIQ+;*?jPPvmU|Y0v-($ z(I6%G=#YbSvwD*nWWc)v z>%V(-`(+#U!nYuRUgo~8^Uk_7ng<$LffW3V;Gt1yH(Qdf{a!na`N&h=p zpRrA&nl^4yZ8I5kV0V0&o;;3Ah(veGTOV z*1^^M{*C^pr#F) z)Ums?4Q4Rg2G+{2c#j|bJ4&pYcf?(jq-ViC9^bi~Jo9juQhENX)9 zH(C3Ih#?10=ZaIBf6#t<)*(ZcWNHK*-Hb_1@o^f4rft>)IzSAd(_)zx3q)Z|H74|p zM*8xjnu#naaSz{eVvZ4WXc~``s_Af`=|^l<)5i7Yg4zakrw(oe40;$xvD~Mtf+i6M zO-Mq^lK~zP59I+IJeV1<@Adkb8t%2To_^?)2wmRktlOQZXI*%6tRJ%5mK-~A`OE8O zvJOnktiva;E*tR&d-Z@mtdv>5d4ICg=T4je=bxCH%ao$;P*hZ2Jxkt zDXmz7uV^txlv9RkhB{SrZ#vvW0lbj>D5&c++shrt5$?4O0LofWXT&HehVTi$e!`~{ zy*ioinUd*8F&+`x) zjUJ}XI!I>y>TQP?^yt8!ztNPlS>CcyZv*Q!$z$B0Aw;49O7O7}msHoT zG_XBJOJ69Y%Zzgp*XtG$XMb#V3V8ue~lLvxsUKC8sXNP*4{GnCRC7=%-;_RtyNUW#FO%A8hKzHl-A(?e1TB~!MWF3XJ$y?uq#K{G$ zE8{|)^&55_hPeK?#5!cCK90JxK(eg6u;9F$Y!LKhJqUwmt zlFP|?Wqq0qlH{I`Ow>yS&6vYrFb-12KAS@k6Yx^jDpo!9JQWb1N>9-n1GQGtI_S;! zL(&w@Grj`VzG~Ja=l~+%2ti#`N5h*H1Gn$o_UohjZ{@I;bIHDmtVS&B#nPY<*q~D_ z8tQu}5jrU5aj|R`MQd?8NwEC}UP*g6ChVf40YVzv@lC(0p_N!aXtzCd#0M;*EyBj{`diN$hj-Tgut7pm(3!(u{f%S-k z4seu1PZ$SCw#(%j9!)S+G?lK*I*R4><|H}h)dTsdKtH2qP%dkdb;w8a>YHO7HZIyqIZHfBnk@=~9l(ql)@NcP9>jWd8tW47 z&A0wE0@jD)!hV}|;o+l~zqsnB_>nNP%Cy{m36T z?48@GlC3$g4t#@OmsywV-5Ui@gD0r->tRkJc`jc(=A&b7POwpK5;qU)sZQS18w~2R zDF}qXI(jWYYFDaBVjW%dw*oq-f$t_smKu2sd_3N6VxB#??}}YJf2LF4GafxKkyc6g zVq#TQNbSXRx9{2cqvMCJjQX~UB@&g83hr~PJFx#(2loFu;MpQpU}Jbn0LPGX8%t>= zZFrf~KbMRi604etf=(;}>k!%z?hwsU1l9s zL_#^K*%)v{Z-#X#=pfc3VT|MZ4OBmA#aO?UjrvHiF3}(YU1D9r9jWQopGGLIC!>2U z<^_ii%d9`7z)s3KWUGsZ2w?rv^?M%ZP}W%ozGc?ob0+JccYt+y{zp6>pkiJ|a56z7 zVb|-~K9cLP*ajnELn&_&(Y)+n&>LBAy7X^S)A^n*2+sw&n%4zfyV{T6z5cbIwI07J z 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 ?uttf3OEo>;s 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�mS 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 literal 0 HcmV?d00001 diff --git a/App/Info.plist b/App/Info.plist index 47abee5..5c36d6d 100644 --- a/App/Info.plist +++ b/App/Info.plist @@ -27,6 +27,8 @@ + CFBundleVersion + 1 FacebookAppID 210886035996098 FacebookDisplayName @@ -38,37 +40,19 @@ fbauth2 fbshareextension - CFBundleVersion - 1 LSRequiresIPhoneOS - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - kAPIBaseUrl - https://query.yahooapis.com NSAppTransportSecurity NSAllowsArbitraryLoads NSExceptionDomains - fbcdn.net + api.mailgun.net NSIncludesSubdomains - NSThirdPartyExceptionRequiresForwardSecrecy + NSTemporaryExceptionAllowsInsecureHTTPLoads facebook.com @@ -80,14 +64,28 @@ NSThirdPartyExceptionRequiresForwardSecrecy - api.mailgun.net + fbcdn.net NSIncludesSubdomains - NSTemporaryExceptionAllowsInsecureHTTPLoads + NSThirdPartyExceptionRequiresForwardSecrecy + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + kAPIBaseUrl + https://query.yahooapis.com From acdfc23f52e89618c0d72d435f5aa02919976723 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Thu, 6 Oct 2016 17:15:24 +0200 Subject: [PATCH 26/28] change the code sign identity --- App.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/App.xcodeproj/project.pbxproj b/App.xcodeproj/project.pbxproj index bd01577..bd445ae 100644 --- a/App.xcodeproj/project.pbxproj +++ b/App.xcodeproj/project.pbxproj @@ -706,6 +706,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = 9C4PPFA3SJ; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -725,6 +726,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = 9C4PPFA3SJ; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", From 5c3e57ec4307a905680c8e60e4c73a5fc3fdf5c6 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Fri, 7 Oct 2016 10:07:08 +0200 Subject: [PATCH 27/28] treat warnings as errors --- App.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/App.xcodeproj/project.pbxproj b/App.xcodeproj/project.pbxproj index bd445ae..7146b23 100644 --- a/App.xcodeproj/project.pbxproj +++ b/App.xcodeproj/project.pbxproj @@ -717,6 +717,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "fr.3ie.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = YES; SWIFT_VERSION = 3.0; }; name = Debug; @@ -737,6 +738,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "fr.3ie.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = YES; SWIFT_VERSION = 3.0; }; name = Release; From bb52fabcb526110e695e9312f30be824d0cba162 Mon Sep 17 00:00:00 2001 From: Sabrine Elbahri Date: Fri, 7 Oct 2016 14:04:21 +0200 Subject: [PATCH 28/28] VVDocumenter-Xcode obsolete with Xcode 8 --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index ed2f0e8..7890e53 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,4 @@ $ carthage update --no-use-binaries --platform iOS ## Documentation -Use VVDocumenter-Xcode to generate your methods documentation by simply typing `///` above them - - - +Use the shortcut (⌥ Option + ⌘ Command + /) in Xcode 8 to add documentation to your code.