Преглед на файлове

Fix 2020 and 2021 Deprecation Warnings (#3555)

* Fix deprecations on newer OSes.

* Update formatting.

* Add documentation note.

* Add fallback for newer mime type code.

* Expose newer APIs only when building for Xcode 13.
Jon Shier преди 4 години
родител
ревизия
4e1103600b
променени са 5 файла, в които са добавени 66 реда и са изтрити 19 реда
  1. 41 14
      Source/MultipartFormData.swift
  2. 22 2
      Source/ServerTrustEvaluation.swift
  3. 1 1
      Tests/Bundle+AlamofireTests.swift
  4. 1 1
      Tests/DataStreamTests.swift
  5. 1 1
      Tests/Request+AlamofireTests.swift

+ 41 - 14
Source/MultipartFormData.swift

@@ -508,20 +508,6 @@ open class MultipartFormData {
         }
     }
 
-    // MARK: - Private - Mime Type
-
-    private func mimeType(forPathExtension pathExtension: String) -> String {
-        #if !(os(Linux) || os(Windows))
-        if
-            let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(),
-            let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() {
-            return contentType as String
-        }
-        #endif
-
-        return "application/octet-stream"
-    }
-
     // MARK: - Private - Content Headers
 
     private func contentHeaders(withName name: String, fileName: String? = nil, mimeType: String? = nil) -> HTTPHeaders {
@@ -555,3 +541,44 @@ open class MultipartFormData {
         bodyPartError = AFError.multipartEncodingFailed(reason: reason)
     }
 }
+
+#if canImport(UniformTypeIdentifiers)
+import UniformTypeIdentifiers
+
+extension MultipartFormData {
+    // MARK: - Private - Mime Type
+
+    private func mimeType(forPathExtension pathExtension: String) -> String {
+        if #available(iOS 14, macOS 11, tvOS 14, watchOS 7, *) {
+            return UTType(filenameExtension: pathExtension)?.preferredMIMEType ?? "application/octet-stream"
+        } else {
+            if
+                let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(),
+                let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() {
+                return contentType as String
+            }
+
+            return "application/octet-stream"
+        }
+    }
+}
+
+#else
+
+extension MultipartFormData {
+    // MARK: - Private - Mime Type
+
+    private func mimeType(forPathExtension pathExtension: String) -> String {
+        #if !(os(Linux) || os(Windows))
+        if
+            let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(),
+            let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() {
+            return contentType as String
+        }
+        #endif
+
+        return "application/octet-stream"
+    }
+}
+
+#endif

+ 22 - 2
Source/ServerTrustEvaluation.swift

@@ -604,12 +604,25 @@ extension AlamofireExtension where ExtendedType == SecTrust {
         certificates.af.publicKeys
     }
 
-    /// The `SecCertificate`s contained i `self`.
+    #if swift(>=5.5) // Xcode 13 / 2021 SDKs.
+    /// The `SecCertificate`s contained in `self`.
+    public var certificates: [SecCertificate] {
+        if #available(iOS 15, macOS 12, tvOS 15, watchOS 8, *) {
+            return (SecTrustCopyCertificateChain(type) as? [SecCertificate]) ?? []
+        } else {
+            return (0..<SecTrustGetCertificateCount(type)).compactMap { index in
+                SecTrustGetCertificateAtIndex(type, index)
+            }
+        }
+    }
+    #else
+    /// The `SecCertificate`s contained in `self`.
     public var certificates: [SecCertificate] {
         (0..<SecTrustGetCertificateCount(type)).compactMap { index in
             SecTrustGetCertificateAtIndex(type, index)
         }
     }
+    #endif
 
     /// The `Data` values for all certificates contained in `self`.
     public var certificateData: [Data] {
@@ -692,6 +705,9 @@ extension AlamofireExtension where ExtendedType == [SecCertificate] {
 extension SecCertificate: AlamofireExtended {}
 extension AlamofireExtension where ExtendedType == SecCertificate {
     /// The public key for `self`, if it can be extracted.
+    ///
+    /// - Note: On 2020 OSes and newer, only RSA and ECDSA keys are supported.
+    ///
     public var publicKey: SecKey? {
         let policy = SecPolicyCreateBasicX509()
         var trust: SecTrust?
@@ -699,7 +715,11 @@ extension AlamofireExtension where ExtendedType == SecCertificate {
 
         guard let createdTrust = trust, trustCreationStatus == errSecSuccess else { return nil }
 
-        return SecTrustCopyPublicKey(createdTrust)
+        if #available(iOS 14, macOS 11, tvOS 14, watchOS 7, *) {
+            return SecTrustCopyKey(createdTrust)
+        } else {
+            return SecTrustCopyPublicKey(createdTrust)
+        }
     }
 }
 

+ 1 - 1
Tests/Bundle+AlamofireTests.swift

@@ -32,7 +32,7 @@ extension Bundle {
         #else
         bundle = Bundle(for: BaseTestCase.self)
         #endif
-        
+
         return bundle
     }
 }

+ 1 - 1
Tests/DataStreamTests.swift

@@ -113,7 +113,7 @@ final class DataStreamTests: BaseTestCase {
         guard #available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) else {
             throw XCTSkip("Older OSes do not separate chunked payloads in callbacks.")
         }
-        
+
         // Given
         let expectedSize = 10
         var responses: [TestResponse] = []

+ 1 - 1
Tests/Request+AlamofireTests.swift

@@ -32,7 +32,7 @@ extension DataRequest {
     func validate(performing closure: @escaping () -> Void) -> Self {
         validate { _, _, _ in
             closure()
-            
+
             return .success(())
         }
         .validate()