Skip to content

Commit 11d3acd

Browse files
committed
Commit updates from SimplicityMobile#41
Last updated Mon 14 May 2018
1 parent 4a82578 commit 11d3acd

File tree

8 files changed

+94
-25
lines changed

8 files changed

+94
-25
lines changed

Simplicity.xcodeproj/project.pbxproj

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,12 @@
151151
DF74EC271CE2A8BB008F16BF /* Project object */ = {
152152
isa = PBXProject;
153153
attributes = {
154-
LastUpgradeCheck = 0800;
154+
LastUpgradeCheck = 0930;
155155
ORGANIZATIONNAME = Stormpath;
156156
TargetAttributes = {
157157
DF74EC2F1CE2A8BB008F16BF = {
158158
CreatedOnToolsVersion = 7.3.1;
159-
LastSwiftMigration = 0800;
159+
LastSwiftMigration = 0930;
160160
};
161161
};
162162
};
@@ -218,14 +218,22 @@
218218
CLANG_CXX_LIBRARY = "libc++";
219219
CLANG_ENABLE_MODULES = YES;
220220
CLANG_ENABLE_OBJC_ARC = YES;
221+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
221222
CLANG_WARN_BOOL_CONVERSION = YES;
223+
CLANG_WARN_COMMA = YES;
222224
CLANG_WARN_CONSTANT_CONVERSION = YES;
225+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
223226
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
224227
CLANG_WARN_EMPTY_BODY = YES;
225228
CLANG_WARN_ENUM_CONVERSION = YES;
226229
CLANG_WARN_INFINITE_RECURSION = YES;
227230
CLANG_WARN_INT_CONVERSION = YES;
231+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
232+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
233+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
228234
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
235+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
236+
CLANG_WARN_STRICT_PROTOTYPES = YES;
229237
CLANG_WARN_SUSPICIOUS_MOVE = YES;
230238
CLANG_WARN_UNREACHABLE_CODE = YES;
231239
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -270,14 +278,22 @@
270278
CLANG_CXX_LIBRARY = "libc++";
271279
CLANG_ENABLE_MODULES = YES;
272280
CLANG_ENABLE_OBJC_ARC = YES;
281+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
273282
CLANG_WARN_BOOL_CONVERSION = YES;
283+
CLANG_WARN_COMMA = YES;
274284
CLANG_WARN_CONSTANT_CONVERSION = YES;
285+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
275286
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
276287
CLANG_WARN_EMPTY_BODY = YES;
277288
CLANG_WARN_ENUM_CONVERSION = YES;
278289
CLANG_WARN_INFINITE_RECURSION = YES;
279290
CLANG_WARN_INT_CONVERSION = YES;
291+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
292+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
293+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
280294
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
295+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
296+
CLANG_WARN_STRICT_PROTOTYPES = YES;
281297
CLANG_WARN_SUSPICIOUS_MOVE = YES;
282298
CLANG_WARN_UNREACHABLE_CODE = YES;
283299
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -324,7 +340,8 @@
324340
PRODUCT_NAME = "$(TARGET_NAME)";
325341
SKIP_INSTALL = YES;
326342
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
327-
SWIFT_VERSION = 3.0;
343+
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
344+
SWIFT_VERSION = 4.0;
328345
};
329346
name = Debug;
330347
};
@@ -344,7 +361,8 @@
344361
PRODUCT_BUNDLE_IDENTIFIER = com.stormpath.Simplicity;
345362
PRODUCT_NAME = "$(TARGET_NAME)";
346363
SKIP_INSTALL = YES;
347-
SWIFT_VERSION = 3.0;
364+
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
365+
SWIFT_VERSION = 4.0;
348366
};
349367
name = Release;
350368
};
@@ -372,4 +390,4 @@
372390
/* End XCConfigurationList section */
373391
};
374392
rootObject = DF74EC271CE2A8BB008F16BF /* Project object */;
375-
}
393+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>IDEDidComputeMac32BitWarning</key>
6+
<true/>
7+
</dict>
8+
</plist>

Simplicity.xcodeproj/xcshareddata/xcschemes/Simplicity.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "0800"
3+
LastUpgradeVersion = "0930"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

Simplicity/Helpers.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,20 @@ class Helpers {
1818
- returns: A list of URL Schemes that match the filter closure.
1919
*/
2020
static func registeredURLSchemes(filter closure: (String) -> Bool) -> [String] {
21+
// Retrieve url types from the main bundle
2122
guard let urlTypes = Bundle.main.infoDictionary?["CFBundleURLTypes"] as? [[String: AnyObject]] else {
2223
return [String]()
2324
}
2425

2526
// Convert the complex dictionary into an array of URL schemes
26-
let urlSchemes = urlTypes.flatMap({($0["CFBundleURLSchemes"] as? [String])?.first })
27+
let urlSchemes: [String] = urlTypes.reduce(into: []) { (result, component) in
28+
if let schemes = component["CFBundleURLSchemes"] as? [String] {
29+
result.append(contentsOf: schemes)
30+
}
31+
}
2732

28-
return urlSchemes.flatMap({closure($0) ? $0 : nil})
33+
// Filter schemes with parameter block
34+
return urlSchemes.compactMap({closure($0) ? $0 : nil})
2935
}
3036

3137
/**
@@ -36,7 +42,7 @@ class Helpers {
3642
- returns: A query string
3743
*/
3844
static func queryString(_ parts: [String: String?]) -> String? {
39-
return parts.flatMap { key, value -> String? in
45+
return parts.compactMap { key, value -> String? in
4046
if let value = value {
4147
return key + "=" + value
4248
} else {
@@ -83,4 +89,4 @@ extension URL {
8389
}
8490
return result
8591
}
86-
}
92+
}

Simplicity/LoginProviders/Facebook.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ public class Facebook: OAuth2 {
3838
/// An array with query string parameters for the authorization URL.
3939
override public var authorizationURLParameters: [String : String?] {
4040
var result = super.authorizationURLParameters
41+
// Required parameters to have the button to connect via the native fb app
4142
result["auth_type"] = authType.rawValue
43+
result["display"] = "touch"
44+
result["sdk"] = "ios"
45+
result["fbapp_pres"] = "1"
46+
result["sdk_version"] = "4.31.1"
4247
return result
4348
}
4449

@@ -53,7 +58,7 @@ public class Facebook: OAuth2 {
5358
let range = urlScheme.range(of: "\\d+", options: .regularExpression) else {
5459
preconditionFailure("You must configure your Facebook URL Scheme to use Facebook login.")
5560
}
56-
let clientId = urlScheme.substring(with: range)
61+
let clientId = String(urlScheme[range.lowerBound..<range.upperBound])
5762
let authorizationEndpoint = URL(string: "https://www.facebook.com/dialog/oauth")!
5863
let redirectEndpoint = URL(string: urlScheme + "://authorize")!
5964

@@ -77,4 +82,4 @@ public enum FacebookAuthType: String {
7782

7883
/// None
7984
None = ""
80-
}
85+
}

Simplicity/LoginProviders/VKontakte.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ public class VKontakte: OAuth2 {
3333
let range = urlScheme.range(of: "\\d+", options: .regularExpression) else {
3434
preconditionFailure("You must configure your VK URL Scheme to use VK login.")
3535
}
36-
let clientId = urlScheme.substring(with: range)
36+
let clientId = String(urlScheme[range.lowerBound..<range.upperBound])
3737
let authorizationEndpoint = URL(string: "https://oauth.vk.com/authorize")!
3838
let redirectEndpoint = URL(string: urlScheme + "://authorize")!
3939

4040
super.init(clientId: clientId, authorizationEndpoint: authorizationEndpoint, redirectEndpoint: redirectEndpoint, grantType: .Implicit)
4141
}
42-
}
42+
}

Simplicity/OAuth2.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public class OAuth2: LoginProvider {
6464

6565
var url = URLComponents(url: authorizationEndpoint, resolvingAgainstBaseURL: false)!
6666

67-
url.queryItems = authorizationURLParameters.flatMap({key, value -> URLQueryItem? in
67+
url.queryItems = authorizationURLParameters.compactMap({key, value -> URLQueryItem? in
6868
return value != nil ? URLQueryItem(name: key, value: value) : nil
6969
})
7070

Simplicity/Simplicity.swift

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,54 @@ import SafariServices
1212
/// Callback handler after an external login completes.
1313
public typealias ExternalLoginCallback = (String?, NSError?) -> Void
1414

15-
/**
15+
/**
1616
Simplicity is a framework for authenticating with external providers on iOS.
1717
*/
1818
public final class Simplicity {
1919
private static var currentLoginProvider: LoginProvider?
2020
private static var callback: ExternalLoginCallback?
2121
private static var safari: UIViewController?
22+
@available(iOS 11.0, *)
23+
private static var authSession: SFAuthenticationSession?
2224

2325
/**
2426
Begin the login flow by redirecting to the LoginProvider's website.
2527

2628
- parameters:
27-
- loginProvider: The login provider object configured to be used.
28-
- callback: A callback with the access token, or a SimplicityError.
29+
- loginProvider: The login provider object configured to be used.
30+
- callback: A callback with the access token, or a SimplicityError.
2931
*/
3032
public static func login(_ loginProvider: LoginProvider, callback: @escaping ExternalLoginCallback) {
3133
self.currentLoginProvider = loginProvider
3234
self.callback = callback
3335

34-
presentSafariView(loginProvider.authorizationURL)
36+
if #available(iOS 11, *) {
37+
if self.presentAuthentificationSession(url: loginProvider.authorizationURL, callbackURL: loginProvider.urlScheme) == false {
38+
self.presentSafariView(loginProvider.authorizationURL)
39+
}
40+
} else {
41+
self.presentSafariView(loginProvider.authorizationURL)
42+
}
3543
}
3644

3745
/// Deep link handler (iOS9)
3846
public static func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey: Any]) -> Bool {
39-
safari?.dismiss(animated: true, completion: nil)
40-
guard let callback = callback, url.scheme == currentLoginProvider?.urlScheme else {
41-
return false
47+
if let safari = self.safari {
48+
safari.dismiss(animated: true, completion: nil)
49+
self.safari = nil
4250
}
43-
currentLoginProvider?.linkHandler(url, callback: callback)
44-
currentLoginProvider = nil
51+
if #available(iOS 11.0, *) {
52+
if let auth = self.authSession {
53+
auth.cancel()
54+
self.authSession = nil
55+
}
56+
}
57+
guard let callback = self.callback,
58+
let currentLoginProvider = self.currentLoginProvider,
59+
url.scheme == currentLoginProvider.urlScheme
60+
else { return false }
61+
currentLoginProvider.linkHandler(url, callback: callback)
62+
self.currentLoginProvider = nil
4563

4664
return true
4765
}
@@ -63,4 +81,18 @@ public final class Simplicity {
6381
UIApplication.shared.openURL(url)
6482
}
6583
}
66-
}
84+
85+
@available(iOS 11.0, *)
86+
private static func presentAuthentificationSession(url: URL, callbackURL: String) -> Bool {
87+
88+
let session = SFAuthenticationSession(url: url, callbackURLScheme: nil) { (url, error) in
89+
self.authSession = nil
90+
if let url = url {
91+
self.application(UIApplication.shared, open: url, options: [:])
92+
}
93+
}
94+
self.authSession = session
95+
return session.start()
96+
97+
}
98+
}

0 commit comments

Comments
 (0)