From 1229e3ef358121a399f54eef66b4dd3a8103ae91 Mon Sep 17 00:00:00 2001 From: Jonas-Taha El Sesiy Date: Thu, 8 Mar 2018 00:21:13 -0800 Subject: [PATCH 1/6] WIP add support for osx --- GAppAuth.podspec | 14 +- Sources/{ => iOS}/GAppAuth.swift | 1 + Sources/macOS/GAppAuth.swift | 258 +++++++++++++++++++++++++++++++ 3 files changed, 270 insertions(+), 3 deletions(-) rename Sources/{ => iOS}/GAppAuth.swift (99%) create mode 100644 Sources/macOS/GAppAuth.swift diff --git a/GAppAuth.podspec b/GAppAuth.podspec index 90f66f7..d1c178d 100644 --- a/GAppAuth.podspec +++ b/GAppAuth.podspec @@ -1,16 +1,24 @@ Pod::Spec.new do |s| s.name = 'GAppAuth' - s.version = '1.2.0' + s.version = '1.3.0' s.summary = 'Convenient Wrapper for AppAuth with Google Services written in Swift 4 (iOS).' s.homepage = 'https://github.com/elsesiy/GAppAuth' s.license = 'BSD-2-Clause' s.author = 'Jonas-Taha El Sesiy' s.social_media_url = 'http://twitter.com/elsesiy' + s.platforms = { :ios => "8.0", :osx => "10.9" } s.source = { :git => 'https://github.com/elsesiy/GAppAuth.git', :tag => s.version } - s.source_files = 'Sources/GAppAuth.swift' s.swift_version = '4.0' #s.tvos.deployment_target = '9.0' - #s.osx.deployment_target = '10.9' + + # MacOS + s.osx.deployment_target = '10.9' + s.osx.source_files = 'Sources/macOS/GAppAuth.swift' + + # iOS s.ios.deployment_target = '8.0' + s.ios.source_files = 'Sources/iOS/GAppAuth.swift' + + s.dependency 'GTMAppAuth', '~> 0.7.0' end diff --git a/Sources/GAppAuth.swift b/Sources/iOS/GAppAuth.swift similarity index 99% rename from Sources/GAppAuth.swift rename to Sources/iOS/GAppAuth.swift index 7429d4b..f8d930e 100644 --- a/Sources/GAppAuth.swift +++ b/Sources/iOS/GAppAuth.swift @@ -90,6 +90,7 @@ public final class GAppAuth: NSObject { /// /// - parameter presentingViewController: The UIViewController that starts the workflow. /// - parameter callback: A completion callback to be used for further processing. + @available(iOS 8.0, *) public func authorize(in presentingViewController: UIViewController, callback: ((Bool) -> Void)?) throws { guard GAppAuth.RedirectUri != "" else { throw GAppAuthError.plistValueEmpty("The value for RedirectUri seems to be wrong, did you forget to set it up?") diff --git a/Sources/macOS/GAppAuth.swift b/Sources/macOS/GAppAuth.swift new file mode 100644 index 0000000..5160a7b --- /dev/null +++ b/Sources/macOS/GAppAuth.swift @@ -0,0 +1,258 @@ +// BSD 2-Clause License +// Copyright (c) 2016, Jonas-Taha El Sesiy +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +import AppAuth +import GTMAppAuth + +/// Wrapper class that provides convenient AppAuth functionality with Google Services. +/// Set ClientId, RedirectUri and call respective methods where you need them. +/// Requires dependency to GTMAppAuth, see: https://github.com/google/GTMAppAuth +public final class GAppAuth: NSObject { + + // MARK: - Static declarations + + private static let KeychainPrefix = Bundle.main.bundleIdentifier! + private static let KeychainItemName = KeychainPrefix + "GoogleAuthorization" + private static let GAppAuthCredentials = Bundle.main.object(forInfoDictionaryKey: "GAppAuth") as! NSDictionary + + private static var ClientId: String { + return GAppAuthCredentials.value(forKey: "ClientId") as? String ?? "" + } + private static var RedirectUri: String { + return GAppAuthCredentials.value(forKey: "RedirectUri") as? String ?? "" + } + + // MARK: - Public vars + + // Authorization unsuccessful, subscribe if you're interested + public var errorCallback: ((OIDAuthState, Error) -> Void)? + + // Authorization changed, subscribe if you're interested + public var stateChangeCallback: ((OIDAuthState) -> Void)? + + // MARK: - Private vars + + private(set) var authorization: GTMAppAuthFetcherAuthorization? + + // Auth scopes + private var scopes = [OIDScopeOpenID, OIDScopeProfile] + + // Used in continueAuthorization(with:callback:) in order to resume the authorization flow after app reentry + private var currentAuthorizationFlow: OIDAuthorizationFlowSession? + + // MARK: - Singleton + + private static var singletonInstance: GAppAuth? + public static var shared: GAppAuth { + if singletonInstance == nil { + singletonInstance = GAppAuth() + } + return singletonInstance! + } + + // No instances allowed + private override init() { + super.init() + } + + // MARK: - APIs + + /// Add another authorization realm to the current set of scopes, i.e. `kGTLAuthScopeDrive` for Google Drive API. + public func appendAuthorizationRealm(_ scope: String) { + if !scopes.contains(scope) { + scopes.append(scope) + } + } + + /// Starts the authorization flow. + /// + /// - parameter callback: A completion callback to be used for further processing. + @available(OSX 10.9, *) + public func authorize(callback: ((Bool) -> Void)?) throws { + guard GAppAuth.RedirectUri != "" else { + throw GAppAuthError.plistValueEmpty("The value for RedirectUri seems to be wrong, did you forget to set it up?") + } + + guard GAppAuth.ClientId != "" else { + throw GAppAuthError.plistValueEmpty("The value for ClientId seems to be wrong, did you forget to set it up?") + } + + let issuer = URL(string: "https://accounts.google.com")! + let redirectURI = URL(string: GAppAuth.RedirectUri)! + + // Search for endpoints + OIDAuthorizationService.discoverConfiguration(forIssuer: issuer) {(configuration: OIDServiceConfiguration?, error: Error?) in + + if configuration == nil { + self.setAuthorization(nil) + return + } + + // Create auth request + let request = OIDAuthorizationRequest(configuration: configuration!, clientId: GAppAuth.ClientId, scopes: self.scopes, redirectURL: redirectURI, responseType: OIDResponseTypeCode, additionalParameters: nil) + + // Store auth flow to be resumed after app reentry, serialize response + self.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request) {(authState: OIDAuthState?, error: Error?) in + var response = false + if let authState = authState { + + let authorization = GTMAppAuthFetcherAuthorization(authState: authState) + self.setAuthorization(authorization) + response = true + + } else { + self.setAuthorization(nil) + if let error = error { + NSLog("Authorization error: \(error.localizedDescription)") + } + } + + if let callback = callback { + callback(response) + } + } + } + } + + /// Continues the authorization flow (to be called from AppDelegate), i.e. in + /// func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool + /// + /// - parameter url: The url that's used to enter the app. + /// - parameter callback: A completion callback to be used for further processing. + /// - returns: true, if the authorization workflow can be continued with the provided url, else false + public func continueAuthorization(with url: URL, callback: ((Bool) -> Void)?) -> Bool { + var response = false + if let authFlow = currentAuthorizationFlow { + + if authFlow.resumeAuthorizationFlow(with: url) { + currentAuthorizationFlow = nil + response = true + } else { + NSLog("Couldn't resume authorization flow!") + } + } + + if let callback = callback { + callback(response) + } + + return response + } + + /// Determines the current authorization state. + /// + /// - returns: true, if there is a valid authorization available, else false + public func isAuthorized() -> Bool { + return authorization != nil ? authorization!.canAuthorize() : false + } + + /// Load any existing authorization from the key chain on app start. + public func retrieveExistingAuthorizationState() { + let keychainItemName = GAppAuth.KeychainItemName + if let authorization = GTMAppAuthFetcherAuthorization(fromKeychainForName: keychainItemName) { + setAuthorization(authorization) + } + } + + /// Resets the authorization state and removes any stored information. + public func resetAuthorizationState() { + GTMAppAuthFetcherAuthorization.removeFromKeychain(forName: GAppAuth.KeychainItemName) + // As keychain and cached authorization token are meant to be in sync, we also have to: + setAuthorization(nil) + } + + /// Query the current authorization state + public func getCurrentAuthorization() -> GTMAppAuthFetcherAuthorization? { return authorization } + + // MARK: - Internal functions + + /// Internal: Store the authorization. + private func setAuthorization(_ authorization: GTMAppAuthFetcherAuthorization?) { + guard self.authorization == nil || !self.authorization!.isEqual(authorization) else { return } + + self.authorization = authorization + + if self.authorization != nil { + self.authorization!.authState.errorDelegate = self + self.authorization!.authState.stateChangeDelegate = self + } + + serializeAuthorizationState() + } + + /// Internal: Save the authorization result from the workflow. + private func serializeAuthorizationState() { + // No authorization available which can be saved + guard let authorization = authorization else { return } + + let keychainItemName = GAppAuth.KeychainItemName + if authorization.canAuthorize() { + GTMAppAuthFetcherAuthorization.save(authorization, toKeychainForName: keychainItemName) + } else { + // Remove existing authorization state + GTMAppAuthFetcherAuthorization.removeFromKeychain(forName: keychainItemName) + } + } + +} + +// MARK: - OIDAuthStateChangeDelegate + +extension GAppAuth: OIDAuthStateChangeDelegate { + + public func didChange(_ state: OIDAuthState) { + guard self.authorization != nil else { return } + + let authorization = GTMAppAuthFetcherAuthorization(authState: state) + self.setAuthorization(authorization) + + if let stateChangeCallback = stateChangeCallback { + stateChangeCallback(state) + } + } + +} + +// MARK: - OIDAuthStateErrorDelegate + +extension GAppAuth: OIDAuthStateErrorDelegate { + + // Error callback + public func authState(_ state: OIDAuthState, didEncounterAuthorizationError error: Error) { + guard self.authorization != nil else { return } + + currentAuthorizationFlow = nil + setAuthorization(nil) + if let errorCallback = errorCallback { + errorCallback(state, error) + } + } + +} + +// MARK: - Error +public enum GAppAuthError: Error { + case plistValueEmpty(String) +} From c2071170a594f1f91045079c0777a6b1b2f60847 Mon Sep 17 00:00:00 2001 From: Jonas-Taha El Sesiy Date: Tue, 28 Aug 2018 20:09:44 -0700 Subject: [PATCH 2/6] Add support for MacOS --- README.md | 35 ++++++++++++++++++++++++++++------- Sources/macOS/GAppAuth.swift | 13 +++++++++---- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 349f518..558be56 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,11 @@ GAppAuth ===== ![pod](https://img.shields.io/cocoapods/v/GAppAuth.svg) +![dependency](https://img.shields.io/cocoapods/v/GTMAppAuth.svg) [![License](https://img.shields.io/cocoapods/l/GAppAuth.svg)](http://cocoapods.org/pods/GAppAuth) [![Twitter](https://img.shields.io/badge/twitter-@elsesiy-blue.svg)](http://twitter.com/elsesiy) -This is a drop-in class to handle AppAuth with Google Services (currently supporting only iOS). +This is a drop-in class to handle AppAuth with Google Services (iOS & macOS). ## Installation via cocoapods @@ -13,23 +14,42 @@ Just add this dependency to your Podfile: `pod GAppAuth` -The transitive dependency to GTMAppAuth is added automatically. +The transitive dependency to `GTMAppAuth` is added automatically. ## Manually Add `GTMAppAuth` dependency to your Podfile (Cocoapods) or copy the files manually to your project directory. Add `GAppAuth.swift` to your project and set-up you project as follows to use AppAuth with Google Services. +### iOS 1. Setup your project (iOS) at https://console.developers.google.com to retrieve ClientID and iOS scheme URL. 2. Enable Google APIs as desired. 3. Add ClientId and RedirectUri to your Info.plist: ``` - GAppAuth - +GAppAuth + RedirectUri com.googleusercontent.apps.YOUR-CLIENT-ID:/oauthredirect ClientId YOUR-CLIENT-ID.apps.googleusercontent.com - + ``` + +### macOS +1. Setup your project (macOS) at https://console.developers.google.com to retrieve ClientID and ClientSecret. +2. Enable Google APIs as desired. +3. Add ClientId, ClientSecret RedirectUri to your Info.plist: +``` +GAppAuth + + RedirectUri + com.googleusercontent.apps.YOUR-CLIENT-ID:/oauthredirect + ClientId + YOUR-CLIENT-ID.apps.googleusercontent.com + ClientSecret + YOUR-SECRET + +``` + +### General 4. Add Custom URL-Scheme to your project: ``` CFBundleURLTypes @@ -44,11 +64,12 @@ Add `GTMAppAuth` dependency to your Podfile (Cocoapods) or copy the files manual ``` 5. In order to authorize for any Google Service, you'd need to append the respective scope to the authorization request via: `GAppAuth.shared.appendAuthorizationRealm` (i.e. kGTLRAuthScopeDrive for Google Drive access). -6. From any `UIViewController` start the authorization workflow by calling `GAppAuth.shared.authorize`. +6. From any `UIViewController` or `NSViewController` start the authorization workflow by calling `GAppAuth.shared.authorize`. 7. You might want to retrieve any existing authorization upon start of the app which can be done via `GAppAuth.shared.retrieveExistingAuthorizationState`. 8. There are two closures you can monitor in order to be notified about any changes `stateChangeCallback` or errors `errorCallback`. **Note:** In case of a revoked access by the user, both callbacks will be called. ##### A good spot for 5. and 7. is the AppDelegate's `didFinishLaunchingWithOptions`. -#### Feel free to add any remarks or open up a PR. +## Contribution +Feel free to create issues or open up a PR. diff --git a/Sources/macOS/GAppAuth.swift b/Sources/macOS/GAppAuth.swift index 5160a7b..192cab9 100644 --- a/Sources/macOS/GAppAuth.swift +++ b/Sources/macOS/GAppAuth.swift @@ -40,6 +40,11 @@ public final class GAppAuth: NSObject { private static var ClientId: String { return GAppAuthCredentials.value(forKey: "ClientId") as? String ?? "" } + + private static var ClientSecret: String { + return GAppAuthCredentials.value(forKey: "ClientSecret") as? String ?? "" + } + private static var RedirectUri: String { return GAppAuthCredentials.value(forKey: "RedirectUri") as? String ?? "" } @@ -85,7 +90,7 @@ public final class GAppAuth: NSObject { scopes.append(scope) } } - + /// Starts the authorization flow. /// /// - parameter callback: A completion callback to be used for further processing. @@ -111,7 +116,7 @@ public final class GAppAuth: NSObject { } // Create auth request - let request = OIDAuthorizationRequest(configuration: configuration!, clientId: GAppAuth.ClientId, scopes: self.scopes, redirectURL: redirectURI, responseType: OIDResponseTypeCode, additionalParameters: nil) + let request = OIDAuthorizationRequest(configuration: configuration!, clientId: GAppAuth.ClientId, clientSecret: GAppAuth.ClientSecret, scopes: self.scopes, redirectURL: redirectURI, responseType: OIDResponseTypeCode, additionalParameters: nil) // Store auth flow to be resumed after app reentry, serialize response self.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request) {(authState: OIDAuthState?, error: Error?) in @@ -193,7 +198,7 @@ public final class GAppAuth: NSObject { guard self.authorization == nil || !self.authorization!.isEqual(authorization) else { return } self.authorization = authorization - + if self.authorization != nil { self.authorization!.authState.errorDelegate = self self.authorization!.authState.stateChangeDelegate = self @@ -242,7 +247,7 @@ extension GAppAuth: OIDAuthStateErrorDelegate { // Error callback public func authState(_ state: OIDAuthState, didEncounterAuthorizationError error: Error) { guard self.authorization != nil else { return } - + currentAuthorizationFlow = nil setAuthorization(nil) if let errorCallback = errorCallback { From 11b9a8f37ee9a9a66c37ce809344abb3701f22fc Mon Sep 17 00:00:00 2001 From: Jonas-Taha El Sesiy Date: Thu, 20 Dec 2018 22:13:25 +0100 Subject: [PATCH 3/6] Adapt to latest GTMAppAuth changes --- Sources/macOS/GAppAuth.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/macOS/GAppAuth.swift b/Sources/macOS/GAppAuth.swift index 192cab9..ac8a900 100644 --- a/Sources/macOS/GAppAuth.swift +++ b/Sources/macOS/GAppAuth.swift @@ -23,8 +23,8 @@ // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -import AppAuth -import GTMAppAuth +@_exported import AppAuth +@_exported import GTMAppAuth /// Wrapper class that provides convenient AppAuth functionality with Google Services. /// Set ClientId, RedirectUri and call respective methods where you need them. @@ -65,7 +65,7 @@ public final class GAppAuth: NSObject { private var scopes = [OIDScopeOpenID, OIDScopeProfile] // Used in continueAuthorization(with:callback:) in order to resume the authorization flow after app reentry - private var currentAuthorizationFlow: OIDAuthorizationFlowSession? + private var currentAuthorizationFlow: OIDExternalUserAgentSession? // MARK: - Singleton @@ -151,7 +151,7 @@ public final class GAppAuth: NSObject { var response = false if let authFlow = currentAuthorizationFlow { - if authFlow.resumeAuthorizationFlow(with: url) { + if authFlow.resumeExternalUserAgentFlow(with: url) { currentAuthorizationFlow = nil response = true } else { From 1d2c569cb7800a613da09ddb4d59effa5d6b0c94 Mon Sep 17 00:00:00 2001 From: Jonas-Taha El Sesiy Date: Fri, 21 Dec 2018 01:46:07 +0100 Subject: [PATCH 4/6] Change default swift version to 4.2 & export dependencies for iOS as well --- GAppAuth.podspec | 2 +- README.md | 5 +++-- Sources/iOS/GAppAuth.swift | 13 +++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/GAppAuth.podspec b/GAppAuth.podspec index d1c178d..a173618 100644 --- a/GAppAuth.podspec +++ b/GAppAuth.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.social_media_url = 'http://twitter.com/elsesiy' s.platforms = { :ios => "8.0", :osx => "10.9" } s.source = { :git => 'https://github.com/elsesiy/GAppAuth.git', :tag => s.version } - s.swift_version = '4.0' + s.swift_version = '4.2' #s.tvos.deployment_target = '9.0' # MacOS diff --git a/README.md b/README.md index 558be56..21568c3 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ The transitive dependency to `GTMAppAuth` is added automatically. Add `GTMAppAuth` dependency to your Podfile (Cocoapods) or copy the files manually to your project directory. Add `GAppAuth.swift` to your project and set-up you project as follows to use AppAuth with Google Services. ### iOS -1. Setup your project (iOS) at https://console.developers.google.com to retrieve ClientID and iOS scheme URL. +1. Setup your project (APIs & Services -> Credentials -> Create Credentials -> OAuth Client ID -> iOS) at https://console.developers.google.com to retrieve ClientID and iOS scheme URL. 2. Enable Google APIs as desired. 3. Add ClientId and RedirectUri to your Info.plist: ``` @@ -34,7 +34,7 @@ Add `GTMAppAuth` dependency to your Podfile (Cocoapods) or copy the files manual ``` ### macOS -1. Setup your project (macOS) at https://console.developers.google.com to retrieve ClientID and ClientSecret. +1. Setup your project (APIs & Services -> Credentials -> Create Credentials -> OAuth Client ID -> Other) at https://console.developers.google.com to retrieve ClientID and ClientSecret. 2. Enable Google APIs as desired. 3. Add ClientId, ClientSecret RedirectUri to your Info.plist: ``` @@ -48,6 +48,7 @@ Add `GTMAppAuth` dependency to your Podfile (Cocoapods) or copy the files manual YOUR-SECRET ``` +**Note:** Make sure Sandboxing is turned off or properly configured, otherwise it's not possible to open the Browser window. ### General 4. Add Custom URL-Scheme to your project: diff --git a/Sources/iOS/GAppAuth.swift b/Sources/iOS/GAppAuth.swift index f8d930e..107f37b 100644 --- a/Sources/iOS/GAppAuth.swift +++ b/Sources/iOS/GAppAuth.swift @@ -23,8 +23,8 @@ // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -import AppAuth -import GTMAppAuth +@_exported import AppAuth +@_exported import GTMAppAuth /// Wrapper class that provides convenient AppAuth functionality with Google Services. /// Set ClientId, RedirectUri and call respective methods where you need them. @@ -40,6 +40,7 @@ public final class GAppAuth: NSObject { private static var ClientId: String { return GAppAuthCredentials.value(forKey: "ClientId") as? String ?? "" } + private static var RedirectUri: String { return GAppAuthCredentials.value(forKey: "RedirectUri") as? String ?? "" } @@ -60,7 +61,7 @@ public final class GAppAuth: NSObject { private var scopes = [OIDScopeOpenID, OIDScopeProfile] // Used in continueAuthorization(with:callback:) in order to resume the authorization flow after app reentry - private var currentAuthorizationFlow: OIDAuthorizationFlowSession? + private var currentAuthorizationFlow: OIDExternalUserAgentSession? // MARK: - Singleton @@ -147,7 +148,7 @@ public final class GAppAuth: NSObject { var response = false if let authFlow = currentAuthorizationFlow { - if authFlow.resumeAuthorizationFlow(with: url) { + if authFlow.resumeExternalUserAgentFlow(with: url) { currentAuthorizationFlow = nil response = true } else { @@ -194,7 +195,7 @@ public final class GAppAuth: NSObject { guard self.authorization == nil || !self.authorization!.isEqual(authorization) else { return } self.authorization = authorization - + if self.authorization != nil { self.authorization!.authState.errorDelegate = self self.authorization!.authState.stateChangeDelegate = self @@ -243,7 +244,7 @@ extension GAppAuth: OIDAuthStateErrorDelegate { // Error callback public func authState(_ state: OIDAuthState, didEncounterAuthorizationError error: Error) { guard self.authorization != nil else { return } - + currentAuthorizationFlow = nil setAuthorization(nil) if let errorCallback = errorCallback { From e50285f118d0b5f0659a80b24b5c12881b5c4053 Mon Sep 17 00:00:00 2001 From: Jonas-Taha El Sesiy Date: Fri, 21 Dec 2018 02:34:58 +0100 Subject: [PATCH 5/6] Add Examples for macOS and iOS --- Examples/.gitignore | 46 + .../project.pbxproj | 768 ++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Examples/GAppAuth-iOS/AppDelegate.swift | 37 + .../AppIcon.appiconset/Contents.json | 98 ++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../GAppAuth-iOS/Base.lproj/Main.storyboard | 131 +++ Examples/GAppAuth-iOS/Info.plist | 61 ++ Examples/GAppAuth-iOS/ViewControllerIOS.swift | 58 ++ Examples/GAppAuth-macOS/AppDelegate.swift | 33 + .../AppIcon.appiconset/Contents.json | 58 ++ .../Assets.xcassets/Contents.json | 6 + .../GAppAuth-macOS/Base.lproj/Main.storyboard | 851 ++++++++++++++++++ .../GAppAuth_macOS.entitlements | 5 + Examples/GAppAuth-macOS/Info.plist | 50 + .../GAppAuth-macOS/ViewControllerMacOS.swift | 69 ++ Examples/Podfile | 16 + Examples/Podfile.lock | 35 + Examples/README.md | 4 + 23 files changed, 2390 insertions(+) create mode 100644 Examples/.gitignore create mode 100644 Examples/GAppAuth-Examples.xcodeproj/project.pbxproj create mode 100644 Examples/GAppAuth-Examples.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Examples/GAppAuth-Examples.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Examples/GAppAuth-Samples.xcworkspace/contents.xcworkspacedata create mode 100644 Examples/GAppAuth-Samples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Examples/GAppAuth-iOS/AppDelegate.swift create mode 100644 Examples/GAppAuth-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/GAppAuth-iOS/Assets.xcassets/Contents.json create mode 100644 Examples/GAppAuth-iOS/Base.lproj/LaunchScreen.storyboard create mode 100644 Examples/GAppAuth-iOS/Base.lproj/Main.storyboard create mode 100644 Examples/GAppAuth-iOS/Info.plist create mode 100644 Examples/GAppAuth-iOS/ViewControllerIOS.swift create mode 100644 Examples/GAppAuth-macOS/AppDelegate.swift create mode 100644 Examples/GAppAuth-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/GAppAuth-macOS/Assets.xcassets/Contents.json create mode 100644 Examples/GAppAuth-macOS/Base.lproj/Main.storyboard create mode 100644 Examples/GAppAuth-macOS/GAppAuth_macOS.entitlements create mode 100644 Examples/GAppAuth-macOS/Info.plist create mode 100644 Examples/GAppAuth-macOS/ViewControllerMacOS.swift create mode 100644 Examples/Podfile create mode 100644 Examples/Podfile.lock create mode 100644 Examples/README.md diff --git a/Examples/.gitignore b/Examples/.gitignore new file mode 100644 index 0000000..9f32006 --- /dev/null +++ b/Examples/.gitignore @@ -0,0 +1,46 @@ +# Created by https://www.gitignore.io + +### Swift ### +# Xcode +.DS_Store +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +*.idea + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# + +Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +### Fastlane ### +fastlane/report.xml +fastlane/README.md +fastlane/screenshots/**/*.png +fastlane/screenshots/*.html +fastlane/test_output diff --git a/Examples/GAppAuth-Examples.xcodeproj/project.pbxproj b/Examples/GAppAuth-Examples.xcodeproj/project.pbxproj new file mode 100644 index 0000000..902e9cd --- /dev/null +++ b/Examples/GAppAuth-Examples.xcodeproj/project.pbxproj @@ -0,0 +1,768 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 331062F47BDAB97F99CAF2F2 /* Pods_GAppAuth_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5301A5B92884786EFABF8180 /* Pods_GAppAuth_iOS.framework */; }; + CAFC13CE21CC41EA00EFFBED /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFC13CD21CC41EA00EFFBED /* AppDelegate.swift */; }; + CAFC13D021CC41EA00EFFBED /* ViewControllerIOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFC13CF21CC41EA00EFFBED /* ViewControllerIOS.swift */; }; + CAFC13D321CC41EA00EFFBED /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CAFC13D121CC41EA00EFFBED /* Main.storyboard */; }; + CAFC13D521CC41EB00EFFBED /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CAFC13D421CC41EB00EFFBED /* Assets.xcassets */; }; + CAFC13D821CC41EB00EFFBED /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CAFC13D621CC41EB00EFFBED /* LaunchScreen.storyboard */; }; + CAFC13E421CC420600EFFBED /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFC13E321CC420600EFFBED /* AppDelegate.swift */; }; + CAFC13E621CC420600EFFBED /* ViewControllerMacOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFC13E521CC420600EFFBED /* ViewControllerMacOS.swift */; }; + CAFC13E821CC420600EFFBED /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CAFC13E721CC420600EFFBED /* Assets.xcassets */; }; + CAFC13EB21CC420600EFFBED /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CAFC13E921CC420600EFFBED /* Main.storyboard */; }; + F7F44E8E1F6D6CB456899677 /* Pods_GAppAuth_macOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0512BDFD114E7503423051A9 /* Pods_GAppAuth_macOS.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0512BDFD114E7503423051A9 /* Pods_GAppAuth_macOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GAppAuth_macOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 49F0F598BA65BF7EBE7514F2 /* Pods-GAppAuth-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GAppAuth-iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-GAppAuth-iOS/Pods-GAppAuth-iOS.release.xcconfig"; sourceTree = ""; }; + 4E6C8306195A833618932AFF /* Pods-GAppAuth-macOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GAppAuth-macOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-GAppAuth-macOS/Pods-GAppAuth-macOS.debug.xcconfig"; sourceTree = ""; }; + 5301A5B92884786EFABF8180 /* Pods_GAppAuth_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GAppAuth_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7055A3C7EF381FF2FBD8F213 /* Pods-GAppAuth-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GAppAuth-iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-GAppAuth-iOS/Pods-GAppAuth-iOS.debug.xcconfig"; sourceTree = ""; }; + CAFC13CA21CC41EA00EFFBED /* GAppAuth-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GAppAuth-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + CAFC13CD21CC41EA00EFFBED /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + CAFC13CF21CC41EA00EFFBED /* ViewControllerIOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewControllerIOS.swift; sourceTree = ""; }; + CAFC13D221CC41EA00EFFBED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + CAFC13D421CC41EB00EFFBED /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + CAFC13D721CC41EB00EFFBED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + CAFC13D921CC41EB00EFFBED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CAFC13E121CC420600EFFBED /* GAppAuth-macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GAppAuth-macOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + CAFC13E321CC420600EFFBED /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + CAFC13E521CC420600EFFBED /* ViewControllerMacOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewControllerMacOS.swift; sourceTree = ""; }; + CAFC13E721CC420600EFFBED /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + CAFC13EA21CC420600EFFBED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + CAFC13EC21CC420600EFFBED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CAFC13ED21CC420600EFFBED /* GAppAuth_macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = GAppAuth_macOS.entitlements; sourceTree = ""; }; + FAA262CFF753180DB7AA149A /* Pods-GAppAuth-macOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GAppAuth-macOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-GAppAuth-macOS/Pods-GAppAuth-macOS.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CAFC13C721CC41EA00EFFBED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 331062F47BDAB97F99CAF2F2 /* Pods_GAppAuth_iOS.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAFC13DE21CC420600EFFBED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F7F44E8E1F6D6CB456899677 /* Pods_GAppAuth_macOS.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 35967C24A92412BB2F6E89F0 /* Pods */ = { + isa = PBXGroup; + children = ( + 7055A3C7EF381FF2FBD8F213 /* Pods-GAppAuth-iOS.debug.xcconfig */, + 49F0F598BA65BF7EBE7514F2 /* Pods-GAppAuth-iOS.release.xcconfig */, + 4E6C8306195A833618932AFF /* Pods-GAppAuth-macOS.debug.xcconfig */, + FAA262CFF753180DB7AA149A /* Pods-GAppAuth-macOS.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + B7B919AF99265721C7353FC2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5301A5B92884786EFABF8180 /* Pods_GAppAuth_iOS.framework */, + 0512BDFD114E7503423051A9 /* Pods_GAppAuth_macOS.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + CAFC13BF21CC41D600EFFBED = { + isa = PBXGroup; + children = ( + CAFC13CC21CC41EA00EFFBED /* GAppAuth-iOS */, + CAFC13E221CC420600EFFBED /* GAppAuth-macOS */, + CAFC13CB21CC41EA00EFFBED /* Products */, + 35967C24A92412BB2F6E89F0 /* Pods */, + B7B919AF99265721C7353FC2 /* Frameworks */, + ); + sourceTree = ""; + }; + CAFC13CB21CC41EA00EFFBED /* Products */ = { + isa = PBXGroup; + children = ( + CAFC13CA21CC41EA00EFFBED /* GAppAuth-iOS.app */, + CAFC13E121CC420600EFFBED /* GAppAuth-macOS.app */, + ); + name = Products; + sourceTree = ""; + }; + CAFC13CC21CC41EA00EFFBED /* GAppAuth-iOS */ = { + isa = PBXGroup; + children = ( + CAFC13CD21CC41EA00EFFBED /* AppDelegate.swift */, + CAFC13CF21CC41EA00EFFBED /* ViewControllerIOS.swift */, + CAFC13D121CC41EA00EFFBED /* Main.storyboard */, + CAFC13D421CC41EB00EFFBED /* Assets.xcassets */, + CAFC13D621CC41EB00EFFBED /* LaunchScreen.storyboard */, + CAFC13D921CC41EB00EFFBED /* Info.plist */, + ); + path = "GAppAuth-iOS"; + sourceTree = ""; + }; + CAFC13E221CC420600EFFBED /* GAppAuth-macOS */ = { + isa = PBXGroup; + children = ( + CAFC13E321CC420600EFFBED /* AppDelegate.swift */, + CAFC13E521CC420600EFFBED /* ViewControllerMacOS.swift */, + CAFC13E721CC420600EFFBED /* Assets.xcassets */, + CAFC13E921CC420600EFFBED /* Main.storyboard */, + CAFC13EC21CC420600EFFBED /* Info.plist */, + CAFC13ED21CC420600EFFBED /* GAppAuth_macOS.entitlements */, + ); + path = "GAppAuth-macOS"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CAFC13C921CC41EA00EFFBED /* GAppAuth-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CAFC13DA21CC41EB00EFFBED /* Build configuration list for PBXNativeTarget "GAppAuth-iOS" */; + buildPhases = ( + 6F110732BC713CACCD63BF5E /* [CP] Check Pods Manifest.lock */, + CAFC13C621CC41EA00EFFBED /* Sources */, + CAFC13C721CC41EA00EFFBED /* Frameworks */, + CAFC13C821CC41EA00EFFBED /* Resources */, + 6B26848FCBF458ABBA013ECB /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "GAppAuth-iOS"; + productName = "GAppAuth-iOS"; + productReference = CAFC13CA21CC41EA00EFFBED /* GAppAuth-iOS.app */; + productType = "com.apple.product-type.application"; + }; + CAFC13E021CC420600EFFBED /* GAppAuth-macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CAFC13EE21CC420600EFFBED /* Build configuration list for PBXNativeTarget "GAppAuth-macOS" */; + buildPhases = ( + AE49618E1973839DDDDDE949 /* [CP] Check Pods Manifest.lock */, + CAFC13DD21CC420600EFFBED /* Sources */, + CAFC13DE21CC420600EFFBED /* Frameworks */, + CAFC13DF21CC420600EFFBED /* Resources */, + E6BD1F3DAF7F04E2156D2C42 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "GAppAuth-macOS"; + productName = "GAppAuth-macOS"; + productReference = CAFC13E121CC420600EFFBED /* GAppAuth-macOS.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CAFC13C021CC41D600EFFBED /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 1010; + TargetAttributes = { + CAFC13C921CC41EA00EFFBED = { + CreatedOnToolsVersion = 10.1; + }; + CAFC13E021CC420600EFFBED = { + CreatedOnToolsVersion = 10.1; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 0; + }; + }; + }; + }; + }; + buildConfigurationList = CAFC13C321CC41D600EFFBED /* Build configuration list for PBXProject "GAppAuth-Examples" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CAFC13BF21CC41D600EFFBED; + productRefGroup = CAFC13CB21CC41EA00EFFBED /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CAFC13C921CC41EA00EFFBED /* GAppAuth-iOS */, + CAFC13E021CC420600EFFBED /* GAppAuth-macOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CAFC13C821CC41EA00EFFBED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CAFC13D821CC41EB00EFFBED /* LaunchScreen.storyboard in Resources */, + CAFC13D521CC41EB00EFFBED /* Assets.xcassets in Resources */, + CAFC13D321CC41EA00EFFBED /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAFC13DF21CC420600EFFBED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CAFC13E821CC420600EFFBED /* Assets.xcassets in Resources */, + CAFC13EB21CC420600EFFBED /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6B26848FCBF458ABBA013ECB /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-GAppAuth-iOS/Pods-GAppAuth-iOS-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth-iOS/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GAppAuth-iOS/GAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth-iOS/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher-iOS/GTMSessionFetcher.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + ); + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-GAppAuth-iOS/Pods-GAppAuth-iOS-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 6F110732BC713CACCD63BF5E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-GAppAuth-iOS-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + AE49618E1973839DDDDDE949 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-GAppAuth-macOS-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E6BD1F3DAF7F04E2156D2C42 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-GAppAuth-macOS/Pods-GAppAuth-macOS-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth-macOS/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GAppAuth-macOS/GAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth-macOS/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher-macOS/GTMSessionFetcher.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + ); + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-GAppAuth-macOS/Pods-GAppAuth-macOS-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CAFC13C621CC41EA00EFFBED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CAFC13D021CC41EA00EFFBED /* ViewControllerIOS.swift in Sources */, + CAFC13CE21CC41EA00EFFBED /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAFC13DD21CC420600EFFBED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CAFC13E621CC420600EFFBED /* ViewControllerMacOS.swift in Sources */, + CAFC13E421CC420600EFFBED /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + CAFC13D121CC41EA00EFFBED /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CAFC13D221CC41EA00EFFBED /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + CAFC13D621CC41EB00EFFBED /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CAFC13D721CC41EB00EFFBED /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + CAFC13E921CC420600EFFBED /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CAFC13EA21CC420600EFFBED /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + CAFC13C421CC41D600EFFBED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + }; + name = Debug; + }; + CAFC13C521CC41D600EFFBED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + }; + name = Release; + }; + CAFC13DB21CC41EB00EFFBED /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7055A3C7EF381FF2FBD8F213 /* Pods-GAppAuth-iOS.debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 45A27V49AJ; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "GAppAuth-iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.elsesiy.GAppAuth-iOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + CAFC13DC21CC41EB00EFFBED /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 49F0F598BA65BF7EBE7514F2 /* Pods-GAppAuth-iOS.release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 45A27V49AJ; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "GAppAuth-iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.elsesiy.GAppAuth-iOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + CAFC13EF21CC420600EFFBED /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4E6C8306195A833618932AFF /* Pods-GAppAuth-macOS.debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 45A27V49AJ; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "GAppAuth-macOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.elsesiy.GAppAuth-macOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + CAFC13F021CC420600EFFBED /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FAA262CFF753180DB7AA149A /* Pods-GAppAuth-macOS.release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 45A27V49AJ; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "GAppAuth-macOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.elsesiy.GAppAuth-macOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CAFC13C321CC41D600EFFBED /* Build configuration list for PBXProject "GAppAuth-Examples" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAFC13C421CC41D600EFFBED /* Debug */, + CAFC13C521CC41D600EFFBED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CAFC13DA21CC41EB00EFFBED /* Build configuration list for PBXNativeTarget "GAppAuth-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAFC13DB21CC41EB00EFFBED /* Debug */, + CAFC13DC21CC41EB00EFFBED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CAFC13EE21CC420600EFFBED /* Build configuration list for PBXNativeTarget "GAppAuth-macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAFC13EF21CC420600EFFBED /* Debug */, + CAFC13F021CC420600EFFBED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CAFC13C021CC41D600EFFBED /* Project object */; +} diff --git a/Examples/GAppAuth-Examples.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/GAppAuth-Examples.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cce51cd --- /dev/null +++ b/Examples/GAppAuth-Examples.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Examples/GAppAuth-Examples.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/GAppAuth-Examples.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Examples/GAppAuth-Examples.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/GAppAuth-Samples.xcworkspace/contents.xcworkspacedata b/Examples/GAppAuth-Samples.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..3f99370 --- /dev/null +++ b/Examples/GAppAuth-Samples.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Examples/GAppAuth-Samples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/GAppAuth-Samples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Examples/GAppAuth-Samples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/GAppAuth-iOS/AppDelegate.swift b/Examples/GAppAuth-iOS/AppDelegate.swift new file mode 100644 index 0000000..d28e31c --- /dev/null +++ b/Examples/GAppAuth-iOS/AppDelegate.swift @@ -0,0 +1,37 @@ +// +// AppDelegate.swift +// GAppAuth-iOS +// +// Created by El Sesiy, Jonas-Taha (624) on 12/20/18. +// + +import UIKit +import GAppAuth + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + + // Set Google services realms to authenticate against + GAppAuth.shared.appendAuthorizationRealm(OIDScopeEmail) + + // Retrieve any existing authorization + GAppAuth.shared.retrieveExistingAuthorizationState() + + return true + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { + if GAppAuth.shared.continueAuthorization(with: url, callback: nil) { + return true + } + + return false + } + +} + diff --git a/Examples/GAppAuth-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/GAppAuth-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/Examples/GAppAuth-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/GAppAuth-iOS/Assets.xcassets/Contents.json b/Examples/GAppAuth-iOS/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Examples/GAppAuth-iOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/GAppAuth-iOS/Base.lproj/LaunchScreen.storyboard b/Examples/GAppAuth-iOS/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..bfa3612 --- /dev/null +++ b/Examples/GAppAuth-iOS/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/GAppAuth-iOS/Base.lproj/Main.storyboard b/Examples/GAppAuth-iOS/Base.lproj/Main.storyboard new file mode 100644 index 0000000..24972a1 --- /dev/null +++ b/Examples/GAppAuth-iOS/Base.lproj/Main.storyboard @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/GAppAuth-iOS/Info.plist b/Examples/GAppAuth-iOS/Info.plist new file mode 100644 index 0000000..b2aed4a --- /dev/null +++ b/Examples/GAppAuth-iOS/Info.plist @@ -0,0 +1,61 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + GAppAuth + + RedirectUri + com.googleusercontent.apps.YOUR-CLIENT:/oauthredirect + ClientId + YOUR-CLIENT.apps.googleusercontent.com + + CFBundleURLTypes + + + CFBundleURLSchemes + + com.googleusercontent.apps.YOUR-CLIENT + + + + + diff --git a/Examples/GAppAuth-iOS/ViewControllerIOS.swift b/Examples/GAppAuth-iOS/ViewControllerIOS.swift new file mode 100644 index 0000000..2d532c5 --- /dev/null +++ b/Examples/GAppAuth-iOS/ViewControllerIOS.swift @@ -0,0 +1,58 @@ +// +// ViewControllerIOS.swift +// GAppAuth-iOS +// +// Created by El Sesiy, Jonas-Taha (624) on 12/20/18. +// + +import UIKit +import GAppAuth + +class ViewControllerIOS: UIViewController { + + @IBOutlet weak var accessToken: UITextField! + @IBOutlet weak var refreshToken: UITextField! + @IBOutlet weak var scopes: UITextField! + @IBOutlet weak var email: UITextField! + + override func viewDidLoad() { + super.viewDidLoad() + + if GAppAuth.shared.isAuthorized() { + let authorization = GAppAuth.shared.getCurrentAuthorization() + self.updateUI(authorization) + } + } + + private func updateUI(_ authorization: GTMAppAuthFetcherAuthorization?) { + let tokenResponse = authorization?.authState.lastTokenResponse + + self.accessToken.text = tokenResponse?.accessToken ?? "" + self.refreshToken.text = tokenResponse?.refreshToken ?? "" + self.scopes.text = tokenResponse?.scope ?? "" + self.email.text = authorization?.userEmail ?? "" + } + + @IBAction func login() { + do { + try GAppAuth.shared.authorize(in: self) { auth in + if auth { + if GAppAuth.shared.isAuthorized() { + let authorization = GAppAuth.shared.getCurrentAuthorization() + self.updateUI(authorization) + } + } + } + } catch let error { + print(error.localizedDescription) + updateUI(nil) + } + } + + @IBAction func logout() { + GAppAuth.shared.resetAuthorizationState() + updateUI(nil) + } + +} + diff --git a/Examples/GAppAuth-macOS/AppDelegate.swift b/Examples/GAppAuth-macOS/AppDelegate.swift new file mode 100644 index 0000000..7abfe3c --- /dev/null +++ b/Examples/GAppAuth-macOS/AppDelegate.swift @@ -0,0 +1,33 @@ +// +// AppDelegate.swift +// GAppAuth-macOS +// +// Created by Jonas-Taha El Sesiy on 07.03.18. +// Copyright © 2018 Jonas-Taha El Sesiy. All rights reserved. +// + +import Cocoa +import GAppAuth + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + + func applicationDidFinishLaunching(_ aNotification: Notification) { + + // Handle URL event + NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(handleEvent(event:replyEvent:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL)) + + GAppAuth.shared.appendAuthorizationRealm(OIDScopeEmail) + + // Retrieve existing auth + GAppAuth.shared.retrieveExistingAuthorizationState() + } + + @objc private func handleEvent(event: NSAppleEventDescriptor, replyEvent: NSAppleEventDescriptor) { + let urlString = event.paramDescriptor(forKeyword: keyDirectObject)?.stringValue ?? "" + let url = URL(string: urlString)! + + _ = GAppAuth.shared.continueAuthorization(with: url, callback: nil) + } + +} diff --git a/Examples/GAppAuth-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/GAppAuth-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2db2b1c --- /dev/null +++ b/Examples/GAppAuth-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/GAppAuth-macOS/Assets.xcassets/Contents.json b/Examples/GAppAuth-macOS/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Examples/GAppAuth-macOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/GAppAuth-macOS/Base.lproj/Main.storyboard b/Examples/GAppAuth-macOS/Base.lproj/Main.storyboard new file mode 100644 index 0000000..d616393 --- /dev/null +++ b/Examples/GAppAuth-macOS/Base.lproj/Main.storyboard @@ -0,0 +1,851 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/GAppAuth-macOS/GAppAuth_macOS.entitlements b/Examples/GAppAuth-macOS/GAppAuth_macOS.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/Examples/GAppAuth-macOS/GAppAuth_macOS.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/Examples/GAppAuth-macOS/Info.plist b/Examples/GAppAuth-macOS/Info.plist new file mode 100644 index 0000000..ab298f9 --- /dev/null +++ b/Examples/GAppAuth-macOS/Info.plist @@ -0,0 +1,50 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.YOUR-CLIENT + + + + CFBundleVersion + 1 + GAppAuth + + ClientId + YOUR-CLIENT.apps.googleusercontent.com + ClientSecret + YOUR-SECRET + RedirectUri + com.googleusercontent.apps.YOUR-CLIENT:/oauthredirect + + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/Examples/GAppAuth-macOS/ViewControllerMacOS.swift b/Examples/GAppAuth-macOS/ViewControllerMacOS.swift new file mode 100644 index 0000000..694b2dc --- /dev/null +++ b/Examples/GAppAuth-macOS/ViewControllerMacOS.swift @@ -0,0 +1,69 @@ +// +// ViewControllerMacOS.swift +// GAppAuth-macOS +// +// Created by Jonas-Taha El Sesiy on 07.03.18. +// Copyright © 2018 Jonas-Taha El Sesiy. All rights reserved. +// + +import Cocoa +import GAppAuth + +class ViewControllerMacOS: NSViewController { + + @IBOutlet weak var accessToken: NSTextField! + @IBOutlet weak var refreshToken: NSTextField! + @IBOutlet weak var scopes: NSTextField! + @IBOutlet weak var email: NSTextField! + + override func viewDidLoad() { + super.viewDidLoad() + + GAppAuth.shared.retrieveExistingAuthorizationState() + + if GAppAuth.shared.isAuthorized() { + let authorization = GAppAuth.shared.getCurrentAuthorization() + self.updateUI(authorization) + } + } + + override var representedObject: Any? { + didSet { + if GAppAuth.shared.isAuthorized() { + let authorization = GAppAuth.shared.getCurrentAuthorization() + self.updateUI(authorization) + } + } + } + + @IBAction func click(_ sender: NSButton?) { + do { + try GAppAuth.shared.authorize { auth in + if auth { + if GAppAuth.shared.isAuthorized() { + let authorization = GAppAuth.shared.getCurrentAuthorization() + self.updateUI(authorization) + } + } + } + } catch let error { + print(error.localizedDescription) + updateUI(nil) + } + + } + + @IBAction func logout(_ sender: NSButton?) { + GAppAuth.shared.resetAuthorizationState() + updateUI(nil) + } + + private func updateUI(_ authorization: GTMAppAuthFetcherAuthorization?) { + let tokenResponse = authorization?.authState.lastTokenResponse + + self.accessToken.stringValue = tokenResponse?.accessToken ?? "" + self.refreshToken.stringValue = tokenResponse?.refreshToken ?? "" + self.scopes.stringValue = tokenResponse?.scope ?? "" + self.email.stringValue = authorization?.userEmail ?? "" + } +} diff --git a/Examples/Podfile b/Examples/Podfile new file mode 100644 index 0000000..44ce747 --- /dev/null +++ b/Examples/Podfile @@ -0,0 +1,16 @@ +source 'https://github.com/CocoaPods/Specs.git' +use_frameworks! + +def shared_pods + pod 'GAppAuth', :path => '../' +end + +target "GAppAuth-iOS" do + platform :ios, '12.0' + shared_pods +end + +target "GAppAuth-macOS" do + platform :osx, '10.13' + shared_pods +end diff --git a/Examples/Podfile.lock b/Examples/Podfile.lock new file mode 100644 index 0000000..a24bba1 --- /dev/null +++ b/Examples/Podfile.lock @@ -0,0 +1,35 @@ +PODS: + - AppAuth (0.95.0) + - GAppAuth (1.3.0): + - GTMAppAuth (~> 0.7.0) + - GTMAppAuth (0.7.1): + - AppAuth (~> 0.95) + - GTMSessionFetcher (~> 1.1) + - GTMSessionFetcher (1.2.1): + - GTMSessionFetcher/Full (= 1.2.1) + - GTMSessionFetcher/Core (1.2.1) + - GTMSessionFetcher/Full (1.2.1): + - GTMSessionFetcher/Core (= 1.2.1) + +DEPENDENCIES: + - GAppAuth (from `../`) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - AppAuth + - GTMAppAuth + - GTMSessionFetcher + +EXTERNAL SOURCES: + GAppAuth: + :path: "../" + +SPEC CHECKSUMS: + AppAuth: 137f6bb6fc9dfbaf2cf9f6fcff1d336ff0163bc6 + GAppAuth: 0fbe3e008aa5248bc6adaba033c1117740778927 + GTMAppAuth: c5e41aaf039ac1ccc41543e6ea2ef7abd255ad41 + GTMSessionFetcher: 32aeca0aa144acea523e1c8e053089dec2cb98ca + +PODFILE CHECKSUM: 9cbcc14c6fa2ef3042c58f9c2a05c31f7e6dd274 + +COCOAPODS: 1.5.3 diff --git a/Examples/README.md b/Examples/README.md new file mode 100644 index 0000000..ea3e262 --- /dev/null +++ b/Examples/README.md @@ -0,0 +1,4 @@ +# GAppAuth-Examples + +This folder contains a project with two targets for iOS and macOS. +To make it work on your machine, just follow the instructions on the parent [README](https://github.com/elsesiy/GAppAuth/blob/master/README.md) on how to create the OAuth Client info, `pod install` and replace them in the respective `Info.plist`. \ No newline at end of file From e12a0ccd54343290549b32f5887f713f0684aa6a Mon Sep 17 00:00:00 2001 From: Jonas-Taha El Sesiy Date: Fri, 21 Dec 2018 02:36:53 +0100 Subject: [PATCH 6/6] Minor Readme change --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 21568c3..081f563 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ GAppAuth ===== ![pod](https://img.shields.io/cocoapods/v/GAppAuth.svg) -![dependency](https://img.shields.io/cocoapods/v/GTMAppAuth.svg) [![License](https://img.shields.io/cocoapods/l/GAppAuth.svg)](http://cocoapods.org/pods/GAppAuth) [![Twitter](https://img.shields.io/badge/twitter-@elsesiy-blue.svg)](http://twitter.com/elsesiy)