├── CHANGELOG.md
├── Certificate SDK Sample App.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── xcshareddata
│ └── xcschemes
│ ├── Certificate SDK Sample iOS.xcscheme
│ └── Certificate SDK Sample visionOS.xcscheme
├── Certificate SDK Sample Shared
├── CertRequestConfiguration.swift
├── CertificateRequestManager.swift
├── KeychainHandler.swift
├── LocalNotificationService.swift
└── test_certificate.p12
├── Certificate SDK Sample iOS
├── ActionLogViewController.swift
├── AppDelegate.swift
├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── icon-jamf-certificate-SDK-20x20@1x.png
│ │ ├── icon-jamf-certificate-SDK-20x20@2x-1.png
│ │ ├── icon-jamf-certificate-SDK-20x20@2x.png
│ │ ├── icon-jamf-certificate-SDK-20x20@3x.png
│ │ ├── icon-jamf-certificate-SDK-29x29@1x.png
│ │ ├── icon-jamf-certificate-SDK-29x29@2x-1.png
│ │ ├── icon-jamf-certificate-SDK-29x29@2x.png
│ │ ├── icon-jamf-certificate-SDK-29x29@3x.png
│ │ ├── icon-jamf-certificate-SDK-40x40@1x.png
│ │ ├── icon-jamf-certificate-SDK-40x40@2x-1.png
│ │ ├── icon-jamf-certificate-SDK-40x40@2x.png
│ │ ├── icon-jamf-certificate-SDK-40x40@3x.png
│ │ ├── icon-jamf-certificate-SDK-512x512@2x.png
│ │ ├── icon-jamf-certificate-SDK-60x60@2x.png
│ │ ├── icon-jamf-certificate-SDK-60x60@3x.png
│ │ ├── icon-jamf-certificate-SDK-76x76@1x.png
│ │ ├── icon-jamf-certificate-SDK-76x76@2x.png
│ │ └── icon-jamf-certificate-SDK-83.5x83.5@2x.png
│ └── Contents.json
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── Info.plist
├── Jamf-one-color-knockout.png
└── SetupTestViewController.swift
├── Certificate SDK Sample visionOS
├── Assets.xcassets
│ ├── AppIcon.solidimagestack
│ │ ├── Back.solidimagestacklayer
│ │ │ ├── Content.imageset
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── Front.solidimagestacklayer
│ │ │ ├── Content.imageset
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ └── Middle.solidimagestacklayer
│ │ │ ├── Content.imageset
│ │ │ └── Contents.json
│ │ │ └── Contents.json
│ └── Contents.json
├── CertificateSDKSampleVisionOSApp.swift
├── ContentView.swift
├── Info.plist
├── RequestTypeModel.swift
└── RequestTypeView.swift
├── CertificateSDK.xcframework
├── Info.plist
├── _CodeSignature
│ ├── CodeDirectory
│ ├── CodeRequirements
│ ├── CodeRequirements-1
│ ├── CodeResources
│ └── CodeSignature
├── ios-arm64
│ └── CertificateSDK.framework
│ │ ├── CertificateSDK
│ │ ├── Headers
│ │ ├── CertificateRequestBase.h
│ │ ├── CertificateRequestDelegate.h
│ │ ├── CertificateRequestEmbeddedP12.h
│ │ ├── CertificateRequestErrorDomain.h
│ │ ├── CertificateRequestProtocol.h
│ │ ├── CertificateRequestWorkflow.h
│ │ └── CertificateSDK.h
│ │ ├── Info.plist
│ │ └── Modules
│ │ └── module.modulemap
├── ios-arm64_x86_64-simulator
│ └── CertificateSDK.framework
│ │ ├── CertificateSDK
│ │ ├── Headers
│ │ ├── CertificateRequestBase.h
│ │ ├── CertificateRequestDelegate.h
│ │ ├── CertificateRequestEmbeddedP12.h
│ │ ├── CertificateRequestErrorDomain.h
│ │ ├── CertificateRequestProtocol.h
│ │ ├── CertificateRequestWorkflow.h
│ │ └── CertificateSDK.h
│ │ ├── Info.plist
│ │ ├── Modules
│ │ └── module.modulemap
│ │ └── _CodeSignature
│ │ └── CodeResources
├── xros-arm64
│ └── CertificateSDK.framework
│ │ ├── CertificateSDK
│ │ ├── Headers
│ │ ├── CertificateRequestBase.h
│ │ ├── CertificateRequestDelegate.h
│ │ ├── CertificateRequestEmbeddedP12.h
│ │ ├── CertificateRequestErrorDomain.h
│ │ ├── CertificateRequestProtocol.h
│ │ ├── CertificateRequestWorkflow.h
│ │ └── CertificateSDK.h
│ │ ├── Info.plist
│ │ └── Modules
│ │ └── module.modulemap
└── xros-arm64_x86_64-simulator
│ └── CertificateSDK.framework
│ ├── CertificateSDK
│ ├── Headers
│ ├── CertificateRequestBase.h
│ ├── CertificateRequestDelegate.h
│ ├── CertificateRequestEmbeddedP12.h
│ ├── CertificateRequestErrorDomain.h
│ ├── CertificateRequestProtocol.h
│ ├── CertificateRequestWorkflow.h
│ └── CertificateSDK.h
│ ├── Info.plist
│ ├── Modules
│ └── module.modulemap
│ └── _CodeSignature
│ └── CodeResources
├── LICENSE
├── Package.swift
├── README.md
└── sample-app-specfile.xml
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 | All notable changes to this project will be documented in this file.
3 |
4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6 |
7 | ## [2.1.0] - 2025-05-01
8 | ### Added
9 | - `keySize` support in the Managed App Config.
10 | - Support for arrays of SAN type/value pairs in the Managed App Config.
11 |
12 | ## [2.0.0] - 2024-06-14
13 | ### Added
14 | - visionOS support! The compiled framework now includes support for visionOS v1.1 and
15 | visionOS Simulator. There is also a native visionOS sample app that works just like
16 | the iOS sample app.
17 | - The CertificateSDK.xcframework is now signed by Jamf for added security.
18 | ### Changed
19 | - Moved the Package.swift tool version from Swift 5.3 to Swift v5.9 in order to support visionOS.
20 | - Moved the iOS minimum deployment target from v10 to v12.
21 | - Described how to use `$MANAGEMENTID` to support BYOD devices with Jamf Pro v11.5.1 and newer.
22 | ### Removed
23 | - Removed PDF file titled "Integrating the Jamf Certificate SDK into your iOS App". This information
24 | is now available online. See the bottom of the README file for a link.
25 |
26 | ## [1.1.1] - 2022-03-11
27 | ### Changed
28 | - Modified the name of the target in the `Package.swift` file so that Xcode 13.3 can find the artifact.
29 |
30 | ## [1.1.0] - 2021-01-08
31 | ### Added
32 | - The compiled framework now includes simulator code for simulators running on Macs with Apple Silicon.
33 | - Added a `Package.swift` file for integration with Swift Package Manager.
34 |
35 | ### Changed
36 | - The compiled framework is now an XCFramework to allow easy integration with Xcode 12 projects.
37 |
38 | ### Fixed
39 | - Fixed an issue that caused two `certificate(request:error:)` calls to be made to the delegate if the SDK could not reach Jamf Pro to request a new AppConfig.
40 |
41 | ## [1.0.1] - 2020-02-11
42 | ### Added
43 | - This CHANGELOG.md file.
44 |
45 | ### Changed
46 | - The Jamf Certificate SDK now adds an interval to the time specified in the pollingTimeout setting. This enables the SDK to retrieve the Managed App Configuration prior to starting the specified pollingTimeout seconds.
47 | - The Jamf Certificate SDK has been re-licensed under the MIT License.
48 |
49 | ### Fixed
50 | - The Jamf Certificate SDK now properly handles network errors and status updates when making requests for a new Managed App Configuration.
51 | - Fixed an issue that prevented the progress of steps from starting at zero and incrementing by one up to the maxNumberOfSteps.
52 | - Fixed an issue that prevented the NSError object from being correctly sent into the `certificateRequest:errorOccurred:` delegate method.
53 |
54 | ## [1.0.0] - 2018-07-24
55 | ### Added
56 | - Initial release.
57 |
--------------------------------------------------------------------------------
/Certificate SDK Sample App.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Certificate SDK Sample App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Certificate SDK Sample App.xcodeproj/xcshareddata/xcschemes/Certificate SDK Sample iOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
9 |
10 |
16 |
22 |
23 |
24 |
25 |
26 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/Certificate SDK Sample App.xcodeproj/xcshareddata/xcschemes/Certificate SDK Sample visionOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
9 |
10 |
16 |
22 |
23 |
24 |
25 |
26 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/Certificate SDK Sample Shared/CertRequestConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 |
8 | /// Contains the selected options for the test run
9 | struct CertRequestConfiguration {
10 | var isActual: Bool
11 | var slowSpeed: Bool
12 | var simulateError: Bool
13 |
14 | var description: String {
15 | if isActual {
16 | return "Actual"
17 | }
18 |
19 | return "Simulated" + (slowSpeed ? " slow" : "") + (simulateError ? " with error" : "")
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Certificate SDK Sample Shared/CertificateRequestManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import CertificateSDK
8 |
9 | class CertificateRequestManager: NSObject {
10 | let keychainHelper = KeychainHandler()
11 |
12 | var textOutputHandler: ((String) -> Void)?
13 | var progressHandler: ((Float) -> Void)?
14 |
15 | private var certificateRequest: CertificateRequestProtocol?
16 |
17 | /// Starts a new request with the given configuration; does nothing if a request is currently pending.
18 | ///
19 | /// - Parameter configuration: The type of certificate request to start
20 | func startRequest(with configuration: CertRequestConfiguration) {
21 | guard certificateRequest == nil else {
22 | // do nothing. Let the user try to run the test or re-run the test once the request is nil.
23 | return
24 | }
25 |
26 | if configuration.isActual {
27 | certificateRequest = CertificateRequestWorkflow(delegate: self)
28 | } else {
29 | var localRequest: CertificateRequestEmbeddedP12?
30 | if !configuration.simulateError, let p12 = Bundle.main.url(forResource: "test_certificate",
31 | withExtension: "p12") {
32 | localRequest = CertificateRequestEmbeddedP12(delegate: self, p12File: p12, p12Password: "abc123")
33 | } else {
34 | localRequest = CertificateRequestEmbeddedP12(delegate: self,
35 | p12File: URL(fileURLWithPath: ""),
36 | p12Password: "a")
37 | }
38 |
39 | if configuration.slowSpeed {
40 | localRequest?.secondsBetweenSteps = 2
41 | }
42 | certificateRequest = localRequest
43 | }
44 |
45 | certificateRequest?.startNewCertificateRequest()
46 | }
47 |
48 | /// Stop any pending certificate request.
49 | func cancelPendingRequest() {
50 | certificateRequest?.cancelRequest()
51 | certificateRequest = nil
52 | }
53 | }
54 |
55 | typealias CertificateRequestHandler = CertificateRequestManager
56 |
57 | extension CertificateRequestHandler: CertificateRequestDelegate {
58 |
59 | func certificate(request: CertificateRequestProtocol, error: Error) {
60 | self.textOutputHandler?("Error: \(error.localizedDescription)")
61 | }
62 |
63 | func certificate(request: CertificateRequestProtocol, completedWith identity: SecIdentity?) {
64 | certificateRequest = nil
65 |
66 | if let actualIdentity = identity {
67 | self.textOutputHandler?("Request completed with identity \(actualIdentity)")
68 | self.textOutputHandler?(self.keychainHelper.addKeychain(identity: actualIdentity))
69 | } else {
70 | self.textOutputHandler?("Request completed with identity nil")
71 | }
72 |
73 | self.textOutputHandler?(self.keychainHelper.showCertificateInfo())
74 | }
75 |
76 | func certificateRequest(_ request: CertificateRequestProtocol, progress current: UInt) {
77 | self.textOutputHandler?("Progress: \(current) of \(request.maxNumberOfSteps)")
78 |
79 | self.progressHandler?(Float(current) / Float(request.maxNumberOfSteps))
80 | }
81 |
82 | func certificateRequest(_ request: CertificateRequestProtocol, isUsingNetwork: Bool) {
83 | self.textOutputHandler?("Using network: \(isUsingNetwork)")
84 | }
85 |
86 | func certificateRequest(_ request: CertificateRequestProtocol, isWaitingForMAC waitingForMAC: Bool) {
87 | self.textOutputHandler?("Waiting for AppConfig: \(waitingForMAC)")
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/Certificate SDK Sample Shared/KeychainHandler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import Foundation
8 |
9 | struct KeychainHandler {
10 | let kMyIdentityLabel = "Jamf Sample App Identity Label"
11 |
12 | func addKeychain(identity: SecIdentity) -> String {
13 | // This specifies the identity is added only if the device has a passcode and it will not sync to other devices.
14 | // If this should be used in other apps signed by your Developer ID, add a kSecAttrAccessGroup key and value.
15 | let query = [kSecValueRef: identity,
16 | kSecAttrLabel: kMyIdentityLabel,
17 | kSecAttrAccessible: kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly] as CFDictionary
18 | let status = SecItemAdd(query, nil)
19 | switch status {
20 | case errSecDuplicateItem:
21 | return "Keychain item already exists"
22 | case errSecSuccess:
23 | return "Keychain item added"
24 | case errSecNotAvailable:
25 | var result = "Keychain item could not be added. Your device probably does not have a passcode."
26 | result += "Set a passcode and try again."
27 | return result
28 | default:
29 | return "Keychain add resulted in status: \(status)"
30 | }
31 | }
32 |
33 | func clearKeychain() -> String {
34 | var resultString = ""
35 | let query = [kSecMatchLimit: kSecMatchLimitAll,
36 | kSecReturnAttributes: true,
37 | kSecReturnRef: true,
38 | kSecClass: kSecClassIdentity] as CFDictionary
39 | var result: CFTypeRef?
40 | let resultCode = SecItemCopyMatching(query, &result)
41 |
42 | if resultCode == errSecSuccess {
43 | let actualResult = result!
44 | if CFArrayGetTypeID() == CFGetTypeID(actualResult) {
45 | let array = (actualResult as? NSArray) as? [NSDictionary]
46 | array?.forEach { (item) in
47 | resultString += self.deleteIdentity(item)
48 | }
49 | } else {
50 | resultString += self.deleteIdentity((result as? NSDictionary)!)
51 | }
52 | }
53 |
54 | return resultString
55 | }
56 |
57 | func deleteIdentity(_ identity: NSDictionary) -> String {
58 | if let label = identity[kSecAttrLabel] as? String, label == kMyIdentityLabel {
59 | let query = [kSecValueRef: identity[kSecValueRef]] as CFDictionary
60 | let status = SecItemDelete(query)
61 | if status != errSecSuccess {
62 | return "Item delete result: \(status)\n"
63 | }
64 | }
65 | return ""
66 | }
67 |
68 | func showCertificateInfo() -> String {
69 | var resultString = "--- Certificates in Keychain ---\n"
70 | var outputACert = false
71 | let query = [kSecMatchLimit: kSecMatchLimitAll,
72 | kSecReturnRef: true,
73 | kSecClass: kSecClassCertificate] as CFDictionary
74 | var result: CFTypeRef?
75 | let resultCode = SecItemCopyMatching(query, &result)
76 |
77 | if resultCode == errSecSuccess {
78 | if CFArrayGetTypeID() == CFGetTypeID(result) {
79 | let array = (result as? NSArray) as? [SecCertificate]
80 | array?.forEach { (item) in
81 | resultString += self.displayCertificate(item)
82 | outputACert = true
83 | }
84 | } else {
85 | // swiftlint:disable force_cast
86 | resultString += self.displayCertificate(result as! SecCertificate)
87 | // swiftlint:enable force_cast
88 | outputACert = true
89 | }
90 | }
91 |
92 | if !outputACert {
93 | resultString += "None\n"
94 | }
95 | resultString += "-------------------------------"
96 | return resultString
97 | }
98 |
99 | func displayCertificate(_ certificate: SecCertificate) -> String {
100 | let subject = SecCertificateCopySubjectSummary(certificate) as String?
101 | return "Cert Subject: \(subject ?? "nil")\n"
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/Certificate SDK Sample Shared/LocalNotificationService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import UserNotifications
8 |
9 | class LocalNotificationService: NSObject, UNUserNotificationCenterDelegate {
10 | static let shared = LocalNotificationService()
11 |
12 | weak var requestManager: CertificateRequestManager?
13 |
14 | static private let kRenewalCategory = "com.jamf.certificate-sdk.sample.renewal.category"
15 | static private let kRenewalIdentifier = "com.jamf.certificate-sdk.sample.renewal"
16 | static private let kDelayInSeconds = 5.0
17 |
18 | /// These are custom actions that we put onto the notification for the user to choose how to proceed
19 | /// without launching the entire app.
20 | ///
21 | /// - renew: This is the renew button; we will try to renew the certificate in the background.
22 | /// - decline: The is the decline button; we schedule another notification to remind the user to renew later.
23 | private enum CertificateNotificationAction: String {
24 | case renew = "com.jamf.certificate-sdk.sample.renew"
25 | case decline = "com.jamf.certificate-sdk.sample.decline"
26 | }
27 |
28 | /// Register for notifications and set up the notification delegate
29 | func registerForNotifications() {
30 | let center = UNUserNotificationCenter.current()
31 |
32 | // First, set ourselves as the delegate to handle incoming notifications.
33 | center.delegate = self
34 |
35 | // Second, request authorization from the user for alerts
36 | center.requestAuthorization(options: [.alert]) { (_, error) in
37 | // enable or disable features based on authorization.
38 | // We check for authorization later anyway so...nothing to do in this callback.
39 | if error != nil {
40 | self.requestManager?.textOutputHandler?("Error requesting notification authorization: \(error!)")
41 | }
42 | }
43 |
44 | // Third, set up our two custom actions on our category.
45 | let renewText = NSLocalizedString("Renew", comment: "Action button to renew from a notification")
46 | let declineText = NSLocalizedString("Decline", comment: "Action button to decline renewal from a notification")
47 | let renewAction = UNNotificationAction(identifier: CertificateNotificationAction.renew.rawValue,
48 | title: renewText,
49 | options: .init(rawValue: 0))
50 | let declineAction = UNNotificationAction(identifier: CertificateNotificationAction.decline.rawValue,
51 | title: declineText,
52 | options: .init(rawValue: 0))
53 | let renewalCategory = UNNotificationCategory(identifier: Self.kRenewalCategory,
54 | actions: [renewAction, declineAction],
55 | intentIdentifiers: [],
56 | options: .customDismissAction)
57 |
58 | center.setNotificationCategories([renewalCategory])
59 | }
60 |
61 | func scheduleLocalNotificationForRenewal(_ expirationDate: Date) {
62 | let center = UNUserNotificationCenter.current()
63 |
64 | // First, remove any pending renewal local notifications.
65 | center.removePendingNotificationRequests(withIdentifiers:
66 | [Self.kRenewalIdentifier])
67 |
68 | center.getNotificationSettings { (settings) in
69 | // Do not schedule notifications if not authorized.
70 | guard settings.authorizationStatus == .authorized else { return }
71 |
72 | let dateFormatter = DateFormatter()
73 | dateFormatter.dateStyle = .short
74 | dateFormatter.timeStyle = .none
75 | let dateAsString = dateFormatter.string(from: expirationDate)
76 |
77 | // Schedule the new local notification.
78 | let content = UNMutableNotificationContent()
79 | content.categoryIdentifier = Self.kRenewalCategory
80 | content.title = NSLocalizedString("Renew SSO Cert",
81 | comment: "Short title of the notification to renew the user certificate")
82 | content.subtitle = String(format: NSLocalizedString("Expires: %@",
83 | comment: """
84 | Subtitle of notification to renew the user certificate;
85 | the expiration date will be substituted for %@
86 | """),
87 | dateAsString)
88 | // swiftlint:disable line_length
89 | if expirationDate < Date(timeIntervalSinceNow: 0) {
90 | content.body = NSLocalizedString("Your Single Sign On certificate has expired. Renew your certificate to restore SSO functionality.",
91 | comment: "Notification text to renew the user certificate if it has expired.")
92 | } else {
93 | content.body = NSLocalizedString("Your Single Sign On certificate will expire soon. Renew your certificate to continue enjoying SSO functionality.",
94 | comment: "Notification text to renew the user certificate if it will expire in the future.")
95 | }
96 | // swiftlint:enable line_length
97 |
98 | content.userInfo = ["CustomData": "Anything else you want to keep track of can go here"]
99 |
100 | // This is going to schedule a notification for 5 seconds from now (for testing)
101 | // In a real app, you probably want to examine the certificate expiration date, pick a day a
102 | // couple weeks in advance of that and use a UNCalendarNotificationTrigger instead.
103 |
104 | let trigger = UNTimeIntervalNotificationTrigger(timeInterval: Self.kDelayInSeconds,
105 | repeats: false)
106 |
107 | let request = UNNotificationRequest(identifier: Self.kRenewalIdentifier,
108 | content: content,
109 | trigger: trigger)
110 |
111 | center.add(request) { error in
112 | guard let actualError = error else { return }
113 | // Could do better error handling to let user know the notification to renew failed to be scheduled.
114 | self.requestManager?.textOutputHandler?("Scheduling error: \(actualError)")
115 | }
116 | }
117 | }
118 |
119 | // MARK: -
120 |
121 | /// If the application is in the foreground when the notification fires, this method is called first.
122 | /// This gives us the opportunity to do things automatically and not show an alert to the user.
123 | /// NOTE: This method is called on a background thread.
124 | ///
125 | /// - Parameters:
126 | /// - center: The notification center.
127 | /// - notification: The notification itself.
128 | /// - completionHandler: A completion handler that must be called once during this method to let the system
129 | /// know how to display the notification (or to NOT display the notification at all).
130 | func userNotificationCenter(_ center: UNUserNotificationCenter,
131 | willPresent notification: UNNotification,
132 | withCompletionHandler
133 | completionHandler: @escaping (UNNotificationPresentationOptions)
134 | -> Void) {
135 | if notification.request.identifier == Self.kRenewalIdentifier {
136 | // Since we're in the foreground already, we can automatically do this renewal and not show the alert.
137 | self.requestManager?.textOutputHandler?("Auto renew in foreground")
138 | self.requestManager?.startRequest(with:
139 | CertRequestConfiguration(isActual: false, slowSpeed: false, simulateError: false))
140 |
141 | completionHandler(.init(rawValue: 0))
142 | } else {
143 | // Some other kind of notification; we should show it.
144 | if #available(iOS 14.0, *) {
145 | completionHandler(.banner)
146 | } else {
147 | completionHandler(.alert)
148 | }
149 | }
150 | }
151 |
152 | /// Called when a notification comes in. The user may have tapped the notification itself,
153 | /// or one of our two custom actions (Renew and Decline).
154 | ///
155 | /// - Parameters:
156 | /// - center: The notification center.
157 | /// - response: The response the user choose
158 | /// - completionHandler: A completion handler that must be called after finished processing the notification.
159 | func userNotificationCenter(_ center: UNUserNotificationCenter,
160 | didReceive response: UNNotificationResponse,
161 | withCompletionHandler completionHandler: @escaping () -> Void) {
162 |
163 | let action = CertificateNotificationAction(rawValue: response.actionIdentifier) ?? .renew
164 |
165 | switch action {
166 | case .renew:
167 | if CertificateNotificationAction(rawValue: response.actionIdentifier) == nil {
168 | self.requestManager?.textOutputHandler?("User did not choose an action")
169 | } else {
170 | self.requestManager?.textOutputHandler?("User tapped renew")
171 | }
172 | self.requestManager?.startRequest(with:
173 | CertRequestConfiguration(isActual: false, slowSpeed: false, simulateError: false))
174 |
175 | case .decline:
176 | // Could schedule another local notification here to nag the user again.
177 | self.requestManager?.textOutputHandler?("User tapped decline; scheduling again")
178 | // Again, the real app should pick some useful date here.
179 | self.scheduleLocalNotificationForRenewal(Date(timeIntervalSinceNow: 60))
180 | }
181 |
182 | completionHandler()
183 | }
184 | }
185 |
--------------------------------------------------------------------------------
/Certificate SDK Sample Shared/test_certificate.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample Shared/test_certificate.p12
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/ActionLogViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import CertificateSDK
8 | import UIKit
9 |
10 | class ActionLogViewController: UIViewController {
11 |
12 | @IBOutlet weak var progressView: UIProgressView!
13 | @IBOutlet weak var actionLogTextView: UITextView!
14 |
15 | let keychainHelper = KeychainHandler()
16 | let requestManager = (UIApplication.shared.delegate as? AppDelegate)?.requestManager
17 |
18 | var testConfiguration: CertRequestConfiguration?
19 |
20 | override func viewDidAppear(_ animated: Bool) {
21 | super.viewDidAppear(animated)
22 |
23 | requestManager?.textOutputHandler = { [weak self] (newText) in
24 | self?.append(newText)
25 | }
26 |
27 | requestManager?.progressHandler = { [weak self] (progressPercent) in
28 | self?.updateProgress(progressPercent)
29 | }
30 |
31 | resetBaseTextView()
32 | runTest()
33 | }
34 |
35 | // MARK: -
36 |
37 | /// Runs the same test that has already been defined.
38 | ///
39 | /// - Parameter sender: unused
40 | @IBAction func rerunTest(_ sender: Any) {
41 | runTest()
42 | }
43 |
44 | /// Stop any current request; clear the keychain; clear the action log
45 | ///
46 | /// - Parameter sender: unused
47 | @IBAction func reset(_ sender: Any) {
48 | requestManager?.cancelPendingRequest()
49 | _ = keychainHelper.clearKeychain()
50 | self.resetBaseTextView()
51 | self.progressView.progress = 0
52 | }
53 |
54 | // MARK: -
55 |
56 | /// Start a new certificate request.
57 | func runTest() {
58 | if let configuration = testConfiguration {
59 | requestManager?.cancelPendingRequest()
60 | requestManager?.startRequest(with: configuration)
61 | }
62 | }
63 |
64 | /// Update the user interface for the detail item.
65 | func resetBaseTextView() {
66 | if let configuration = testConfiguration, let textView = actionLogTextView {
67 | textView.text = "Setup: \(configuration.description)"
68 |
69 | self.append( keychainHelper.showCertificateInfo() )
70 | }
71 | }
72 |
73 | func append(_ logText: String) {
74 | DispatchQueue.main.async {
75 | if let textView = self.actionLogTextView {
76 | let existingText = textView.text ?? ""
77 | let newText = "\(existingText)\n\(logText)"
78 | textView.text = newText
79 |
80 | // Autoscroll as text is added to the bottom.
81 | let lastChar = NSRange(location: (newText as NSString).length - 1, length: 1)
82 | textView.scrollRangeToVisible(lastChar)
83 | }
84 | }
85 | }
86 |
87 | func updateProgress(_ progress: Float) {
88 | DispatchQueue.main.async {
89 | self.progressView.progress = progress
90 | }
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import UIKit
8 | import UserNotifications
9 |
10 | @UIApplicationMain
11 | class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
12 |
13 | var window: UIWindow?
14 |
15 | let requestManager = CertificateRequestManager()
16 |
17 | func application(_ application: UIApplication,
18 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
19 | // Override point for customization after application launch.
20 | if let splitViewController = window!.rootViewController as? UISplitViewController {
21 | let navController = splitViewController.viewControllers[splitViewController.viewControllers.count-1]
22 | as? UINavigationController
23 | navController?.topViewController!.navigationItem.leftBarButtonItem
24 | = splitViewController.displayModeButtonItem
25 |
26 | if UIDevice.current.userInterfaceIdiom == .pad {
27 | splitViewController.preferredDisplayMode = .allVisible
28 | }
29 | splitViewController.delegate = self
30 | }
31 |
32 | // Register for notifications in this app delegate method to ensure all notifications are properly sent to us.
33 | let notificationService = LocalNotificationService.shared
34 | notificationService.requestManager = self.requestManager
35 | notificationService.registerForNotifications()
36 |
37 | return true
38 | }
39 |
40 | // MARK: - Split view
41 |
42 | func splitViewController(_ splitViewController: UISplitViewController,
43 | collapseSecondary secondaryViewController: UIViewController,
44 | onto primaryViewController: UIViewController) -> Bool {
45 | guard let navController = secondaryViewController as? UINavigationController else {
46 | return false
47 | }
48 | guard let actionLogController = navController.topViewController as? ActionLogViewController else {
49 | return false
50 | }
51 |
52 | if actionLogController.testConfiguration == nil {
53 | // Return true to indicate that we have handled the collapse by doing nothing.
54 | // The secondary controller will be discarded.
55 | return true
56 | }
57 | return false
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "icon-jamf-certificate-SDK-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "icon-jamf-certificate-SDK-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "icon-jamf-certificate-SDK-29x29@2x.png",
19 | "scale" : "2x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "icon-jamf-certificate-SDK-29x29@3x.png",
25 | "scale" : "3x"
26 | },
27 | {
28 | "size" : "40x40",
29 | "idiom" : "iphone",
30 | "filename" : "icon-jamf-certificate-SDK-40x40@2x.png",
31 | "scale" : "2x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "icon-jamf-certificate-SDK-40x40@3x.png",
37 | "scale" : "3x"
38 | },
39 | {
40 | "size" : "60x60",
41 | "idiom" : "iphone",
42 | "filename" : "icon-jamf-certificate-SDK-60x60@2x.png",
43 | "scale" : "2x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "icon-jamf-certificate-SDK-60x60@3x.png",
49 | "scale" : "3x"
50 | },
51 | {
52 | "size" : "20x20",
53 | "idiom" : "ipad",
54 | "filename" : "icon-jamf-certificate-SDK-20x20@1x.png",
55 | "scale" : "1x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "icon-jamf-certificate-SDK-20x20@2x-1.png",
61 | "scale" : "2x"
62 | },
63 | {
64 | "size" : "29x29",
65 | "idiom" : "ipad",
66 | "filename" : "icon-jamf-certificate-SDK-29x29@1x.png",
67 | "scale" : "1x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "icon-jamf-certificate-SDK-29x29@2x-1.png",
73 | "scale" : "2x"
74 | },
75 | {
76 | "size" : "40x40",
77 | "idiom" : "ipad",
78 | "filename" : "icon-jamf-certificate-SDK-40x40@1x.png",
79 | "scale" : "1x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "icon-jamf-certificate-SDK-40x40@2x-1.png",
85 | "scale" : "2x"
86 | },
87 | {
88 | "size" : "76x76",
89 | "idiom" : "ipad",
90 | "filename" : "icon-jamf-certificate-SDK-76x76@1x.png",
91 | "scale" : "1x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "icon-jamf-certificate-SDK-76x76@2x.png",
97 | "scale" : "2x"
98 | },
99 | {
100 | "size" : "83.5x83.5",
101 | "idiom" : "ipad",
102 | "filename" : "icon-jamf-certificate-SDK-83.5x83.5@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "1024x1024",
107 | "idiom" : "ios-marketing",
108 | "filename" : "icon-jamf-certificate-SDK-512x512@2x.png",
109 | "scale" : "1x"
110 | }
111 | ],
112 | "info" : {
113 | "version" : 1,
114 | "author" : "xcode"
115 | }
116 | }
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@1x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@2x-1.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@2x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@3x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@1x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@2x-1.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@2x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@3x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@1x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@2x-1.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@2x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@3x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-512x512@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-512x512@2x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-60x60@2x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-60x60@3x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-76x76@1x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-76x76@2x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
32 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
46 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Jamf Cert SDK
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0.1
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UIStatusBarTintParameters
34 |
35 | UINavigationBar
36 |
37 | Style
38 | UIBarStyleDefault
39 | Translucent
40 |
41 |
42 |
43 | UISupportedInterfaceOrientations
44 |
45 | UIInterfaceOrientationPortrait
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 | UIInterfaceOrientationPortraitUpsideDown
49 |
50 | UISupportedInterfaceOrientations~ipad
51 |
52 | UIInterfaceOrientationPortrait
53 | UIInterfaceOrientationPortraitUpsideDown
54 | UIInterfaceOrientationLandscapeLeft
55 | UIInterfaceOrientationLandscapeRight
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/Jamf-one-color-knockout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Jamf-one-color-knockout.png
--------------------------------------------------------------------------------
/Certificate SDK Sample iOS/SetupTestViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import UIKit
8 |
9 | class SegmentedCellView: UITableViewCell {
10 | @IBOutlet weak var segmentedControl: UISegmentedControl!
11 | }
12 |
13 | class ButtonCellView: UITableViewCell {
14 | @IBOutlet weak var button: UIButton!
15 | }
16 |
17 | class OptionCellView: UITableViewCell {
18 | @IBOutlet weak var detailLabel: UILabel!
19 | @IBOutlet weak var label: UILabel!
20 | @IBOutlet weak var optionSwitch: UISwitch!
21 |
22 | override var detailTextLabel: UILabel? {
23 | return detailLabel
24 | }
25 |
26 | override var textLabel: UILabel? {
27 | return label
28 | }
29 | }
30 |
31 | class SetupTestViewController: UITableViewController {
32 |
33 | var detailViewController: ActionLogViewController?
34 |
35 | var testConfiguration = CertRequestConfiguration(isActual: false,
36 | slowSpeed: true,
37 | simulateError: false)
38 |
39 | override func viewDidLoad() {
40 | super.viewDidLoad()
41 |
42 | // Do any additional setup after loading the view, typically from a nib.
43 | if let split = splitViewController {
44 | let controllers = split.viewControllers
45 | let navController = controllers[controllers.count-1] as? UINavigationController
46 | detailViewController = navController?.topViewController as? ActionLogViewController
47 | }
48 | }
49 |
50 | override func viewWillAppear(_ animated: Bool) {
51 | clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed
52 | super.viewWillAppear(animated)
53 | }
54 |
55 | // MARK: - Segues
56 |
57 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
58 | if segue.identifier == "showDetail",
59 | let navController = segue.destination as? UINavigationController,
60 | let controller = navController.topViewController as? ActionLogViewController {
61 |
62 | controller.testConfiguration = testConfiguration
63 | controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
64 | controller.navigationItem.leftItemsSupplementBackButton = true
65 | }
66 | }
67 |
68 | // MARK: - Actions
69 |
70 | /// The user has switched which type of test they want to perform.
71 | ///
72 | /// - Parameter sender: The control that the user has switchde
73 | @IBAction func selectType(_ sender: UISegmentedControl) {
74 | let newActual = (sender.selectedSegmentIndex == 1)
75 |
76 | if newActual != testConfiguration.isActual {
77 | testConfiguration.isActual = newActual
78 | // reload the table with a nice animation.
79 | if let table = self.tableView {
80 | let rowsToAddOrDelete = [IndexPath(row: SetupRowIndices.optionSpeed.rawValue, section: 0),
81 | IndexPath(row: SetupRowIndices.optionError.rawValue, section: 0)]
82 | table.beginUpdates()
83 | table.reloadRows(at: [IndexPath(row: SetupRowIndices.descriptionOfTestType.rawValue, section: 0)],
84 | with: .fade)
85 | if testConfiguration.isActual {
86 | table.deleteRows(at: rowsToAddOrDelete, with: .left)
87 | } else {
88 | table.insertRows(at: rowsToAddOrDelete, with: .left)
89 | }
90 | table.endUpdates()
91 | }
92 | }
93 | }
94 |
95 | /// The user has turned on/off an option within the testConfiguration.
96 | ///
97 | /// - Parameter sender: The switch the user has toggled
98 | @IBAction func toggleOption(_ sender: UISwitch) {
99 | guard let index = SetupRowIndices(rawValue: sender.tag) else {
100 | // Some unknown option?
101 | return
102 | }
103 |
104 | switch index {
105 | case .optionSpeed:
106 | testConfiguration.slowSpeed = sender.isOn
107 |
108 | case .optionError:
109 | testConfiguration.simulateError = sender.isOn
110 |
111 | default: // do nothing
112 | break
113 | }
114 | }
115 |
116 | /// User wants to schedule a notification for renewal.
117 | ///
118 | /// - Parameter _: Unused
119 | @IBAction func scheduleNotification(_ sender: UIButton) {
120 | let notificationService = LocalNotificationService.shared
121 | // A real app should schedule the notification to renew on some date in the future.
122 | notificationService.scheduleLocalNotificationForRenewal(Date(timeIntervalSinceNow: 60))
123 |
124 | // Let the user know it's scheduled.
125 | sender.setTitle("Scheduled", for: .normal)
126 |
127 | // Reset the title back to "Schedule Notification" after 4.5 seconds.
128 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 4.5, qos: .background) {
129 | sender.setTitle("Schedule Notification", for: .normal)
130 | }
131 | }
132 |
133 | // MARK: - Table View
134 |
135 | private enum SetupRowIndices: Int {
136 | case typeOfTest
137 | case descriptionOfTestType
138 | case optionSpeed
139 | case optionError
140 | case runTestButton
141 | case descriptionOfNotification
142 | case scheduleNotification
143 | }
144 | private enum SetupNumberOfRows: Int {
145 | case simulatedTest = 7
146 | case actualTest = 5
147 | }
148 |
149 | override func numberOfSections(in tableView: UITableView) -> Int {
150 | return 1
151 | }
152 |
153 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
154 | return (testConfiguration.isActual ? SetupNumberOfRows.actualTest : SetupNumberOfRows.simulatedTest).rawValue
155 | }
156 |
157 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
158 | guard let index = SetupRowIndices(rawValue: indexPath.row) else {
159 | // Some unknown row?
160 | return UITableViewCell()
161 | }
162 |
163 | return self.cell(for: index, at: indexPath)
164 | }
165 |
166 | private func cell(for index: SetupRowIndices, at indexPath: IndexPath) -> UITableViewCell {
167 | switch index {
168 | case .typeOfTest:
169 | let cell = tableView.dequeueReusableCell(withIdentifier: "TypeSelection",
170 | for: indexPath) as? SegmentedCellView
171 |
172 | cell?.segmentedControl.selectedSegmentIndex = (testConfiguration.isActual ? 1 : 0)
173 | return cell!
174 | case .descriptionOfTestType:
175 | let cell = tableView.dequeueReusableCell(withIdentifier: "Description", for: indexPath)
176 |
177 | if testConfiguration.isActual {
178 | cell.textLabel!.text = "Makes the network calls to the Jamf Pro server to request a certificate"
179 | } else {
180 | cell.textLabel!.text = "Uses the embedded example .p12 for local testing"
181 | }
182 | return cell
183 | case .optionSpeed:
184 | let cell = tableView.dequeueReusableCell(withIdentifier: "Option", for: indexPath) as? OptionCellView
185 |
186 | // This lets our action know which option is being switched on/off
187 | cell?.optionSwitch.tag = index.rawValue
188 |
189 | cell?.textLabel!.text = "Slow speed"
190 | cell?.detailTextLabel!.text = "Simulates a slow server"
191 | cell?.optionSwitch.isOn = testConfiguration.slowSpeed
192 | return cell!
193 | case .optionError:
194 | let cell = tableView.dequeueReusableCell(withIdentifier: "Option", for: indexPath) as? OptionCellView
195 |
196 | // This lets our action know which option is being switched on/off
197 | cell?.optionSwitch.tag = index.rawValue
198 |
199 | cell?.textLabel!.text = "Error simulation"
200 | cell?.detailTextLabel!.text = "Results in an error"
201 | cell?.optionSwitch.isOn = testConfiguration.simulateError
202 | return cell!
203 | case .runTestButton:
204 | let cell = tableView.dequeueReusableCell(withIdentifier: "RunTest", for: indexPath)
205 | return cell
206 | case .descriptionOfNotification:
207 | let cell = tableView.dequeueReusableCell(withIdentifier: "Description", for: indexPath)
208 |
209 | cell.textLabel?.text = "Schedule a local notification to renew the certificate in five seconds"
210 | return cell
211 | case .scheduleNotification:
212 | let cell = tableView.dequeueReusableCell(withIdentifier: "RunTest", for: indexPath) as? ButtonCellView
213 | cell?.button.setTitle("Schedule Notification", for: .normal)
214 | cell?.button.removeTarget(nil, action: nil, for: .allEvents)
215 | cell?.button.addTarget(self, action: #selector(scheduleNotification(_:)), for: .primaryActionTriggered)
216 | return cell!
217 | }
218 | }
219 | }
220 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "vision",
5 | "scale" : "2x"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | },
6 | "layers" : [
7 | {
8 | "filename" : "Front.solidimagestacklayer"
9 | },
10 | {
11 | "filename" : "Middle.solidimagestacklayer"
12 | },
13 | {
14 | "filename" : "Back.solidimagestacklayer"
15 | }
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "vision",
5 | "scale" : "2x"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "vision",
5 | "scale" : "2x"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/CertificateSDKSampleVisionOSApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import SwiftUI
8 |
9 | @main
10 | struct CertificateSDKSampleVisionOSApp: App {
11 | var body: some Scene {
12 | WindowGroup {
13 | ContentView()
14 | .frame(minWidth: 700, minHeight: 600)
15 | }
16 | .windowResizability(.contentMinSize)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import SwiftUI
8 |
9 | struct ContentView: View {
10 | @ObservedObject var model = RequestTypeModel()
11 | var body: some View {
12 | NavigationSplitView {
13 | RequestTypeView(model: model)
14 | .navigationTitle("Select Test Type")
15 | } detail: {
16 | RightArea(model: model)
17 | .navigationTitle("Action Log")
18 | }
19 | .onAppear {
20 | LocalNotificationService.shared.registerForNotifications()
21 | }
22 | }
23 | }
24 |
25 | struct RightArea: View {
26 | @ObservedObject var model: RequestTypeModel
27 |
28 | var body: some View {
29 | ProgressView(value: model.progress, total: 1.0)
30 | ScrollView {
31 | Text(model.completeOutput)
32 | .lineLimit(nil)
33 | .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
34 | }
35 | .padding(.leading)
36 | .defaultScrollAnchor(.bottom)
37 | HStack {
38 | Button("Reset") {
39 | model.reset()
40 | }
41 | Button("Rerun Test") {
42 | model.runTest(resetOutput: false)
43 | }
44 | }
45 | }
46 | }
47 |
48 | #Preview(windowStyle: .automatic) {
49 | ContentView()
50 | }
51 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIApplicationSceneManifest
6 |
7 | UIApplicationPreferredDefaultSceneSessionRole
8 | UIWindowSceneSessionRoleApplication
9 | UIApplicationSupportsMultipleScenes
10 |
11 | UISceneConfigurations
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/RequestTypeModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import Foundation
8 |
9 | /// Contains the selected options for the test run for use with visionOS
10 | class RequestTypeModel: ObservableObject {
11 | /// Whether to make actual network requests for the certificate or to use the built-in p12 file
12 | @Published var isActual: Bool
13 | /// If true, simulates a slower network speed.
14 | @Published var slowSpeed: Bool
15 | /// If true, ends the certificate request in an error.
16 | @Published var simulateError: Bool
17 | /// The complete output text shown in the Action Log
18 | @Published var completeOutput = ""
19 | /// The progress (from 0.0 to 1.0) of the network request
20 | @Published var progress = 0.0
21 | /// True when the local notification has been scheduled
22 | @Published var notificationScheduled = false
23 |
24 | /// The certificate request manager; the ``RequestTypeModel`` owns the
25 | /// instance of the ``CertificateRequestManager``.
26 | let requestManager: CertificateRequestManager
27 |
28 | init(isActual: Bool = false, slowSpeed: Bool = true, simulateError: Bool = false) {
29 | self.isActual = isActual
30 | self.slowSpeed = slowSpeed
31 | self.simulateError = simulateError
32 | self.completeOutput = ""
33 | self.progress = 0.0
34 | self.requestManager = CertificateRequestManager()
35 | LocalNotificationService.shared.requestManager = self.requestManager
36 | }
37 |
38 | var description: String {
39 | if isActual {
40 | return "Actual"
41 | }
42 |
43 | return "Simulated" + (slowSpeed ? " slow" : "") + (simulateError ? " with error" : "")
44 | }
45 |
46 | func runTest(resetOutput: Bool) {
47 | requestManager.textOutputHandler = { (text: String) in
48 | self.append(text: text)
49 | }
50 |
51 | requestManager.progressHandler = { (progress: Float) in
52 | DispatchQueue.main.async {
53 | self.progress = Double(progress)
54 | }
55 | }
56 |
57 | if resetOutput {
58 | completeOutput = "Setup: \(description)"
59 | progress = 0.0
60 | }
61 |
62 | let testConfiguration = CertRequestConfiguration(isActual: isActual,
63 | slowSpeed: slowSpeed,
64 | simulateError: simulateError)
65 | requestManager.cancelPendingRequest()
66 | requestManager.startRequest(with: testConfiguration)
67 | }
68 |
69 | func reset() {
70 | requestManager.cancelPendingRequest()
71 | _ = requestManager.keychainHelper.clearKeychain()
72 |
73 | progress = 0.0
74 |
75 | completeOutput = "Setup: \(description)"
76 | append(text: requestManager.keychainHelper.showCertificateInfo())
77 | }
78 |
79 | func scheduleNotification() {
80 | notificationScheduled = true
81 |
82 | let notificationService = LocalNotificationService.shared
83 |
84 | // A real app should schedule the notification to renew on some date in the future.
85 | notificationService.scheduleLocalNotificationForRenewal(Date(timeIntervalSinceNow: 60))
86 |
87 | // Reset back to schedule notification after 4 seconds.
88 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 4.0, qos: .background) {
89 | self.notificationScheduled = false
90 | }
91 | }
92 |
93 | private func append(text: String) {
94 | DispatchQueue.main.async {
95 | self.completeOutput += "\n\(text)"
96 | }
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/Certificate SDK Sample visionOS/RequestTypeView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | import SwiftUI
8 |
9 | struct RequestTypeView: View {
10 | @ObservedObject var model: RequestTypeModel
11 |
12 | var body: some View {
13 | List {
14 | Picker("Simulated/Actual", selection: $model.isActual) {
15 | Text("Simulated")
16 | .tag(false)
17 | Text("Actual")
18 | .tag(true)
19 | }
20 | .pickerStyle(.segmented)
21 | if model.isActual {
22 | Text("Makes network calls to the Jamf Pro server to request a certificate")
23 | .font(.footnote)
24 | } else {
25 | Text("Uses the embedded example .p12 for local testing")
26 | .font(.footnote)
27 | SidebarSwitch(title: "Slow speed",
28 | descriptiveText: "Simulates a slow server",
29 | switchIsOn: $model.slowSpeed)
30 | SidebarSwitch(title: "Error simulation",
31 | descriptiveText: "Results in an error",
32 | switchIsOn: $model.simulateError)
33 | }
34 | Button("Run Text", systemImage: "play") {
35 | model.runTest(resetOutput: true)
36 | }
37 | Text("Schedule a local notification to renew the certificate in five seconds")
38 | .font(.footnote)
39 | Button(model.notificationScheduled ? "Scheduled" : "Schedule Notification",
40 | systemImage: "play") {
41 | model.scheduleNotification()
42 | }
43 | .disabled(model.notificationScheduled)
44 | }
45 | .listStyle(.sidebar)
46 | }
47 | }
48 |
49 | /// This view has a Toggle with a title and descriptive text.
50 | struct SidebarSwitch: View {
51 | let title: String
52 | let descriptiveText: String
53 | @Binding var switchIsOn: Bool
54 |
55 | var body: some View {
56 | Toggle(isOn: $switchIsOn) {
57 | VStack(alignment: .leading) {
58 | Text(title)
59 | .font(.title)
60 | Text(descriptiveText)
61 | .font(.footnote)
62 | }
63 | }
64 | }
65 | }
66 |
67 | #Preview(windowStyle: .automatic) {
68 | let model = RequestTypeModel()
69 | NavigationSplitView {
70 | RequestTypeView(model: model)
71 | } detail: {
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | AvailableLibraries
6 |
7 |
8 | BinaryPath
9 | CertificateSDK.framework/CertificateSDK
10 | LibraryIdentifier
11 | ios-arm64
12 | LibraryPath
13 | CertificateSDK.framework
14 | SupportedArchitectures
15 |
16 | arm64
17 |
18 | SupportedPlatform
19 | ios
20 |
21 |
22 | BinaryPath
23 | CertificateSDK.framework/CertificateSDK
24 | LibraryIdentifier
25 | xros-arm64
26 | LibraryPath
27 | CertificateSDK.framework
28 | SupportedArchitectures
29 |
30 | arm64
31 |
32 | SupportedPlatform
33 | xros
34 |
35 |
36 | BinaryPath
37 | CertificateSDK.framework/CertificateSDK
38 | LibraryIdentifier
39 | ios-arm64_x86_64-simulator
40 | LibraryPath
41 | CertificateSDK.framework
42 | SupportedArchitectures
43 |
44 | arm64
45 | x86_64
46 |
47 | SupportedPlatform
48 | ios
49 | SupportedPlatformVariant
50 | simulator
51 |
52 |
53 | BinaryPath
54 | CertificateSDK.framework/CertificateSDK
55 | LibraryIdentifier
56 | xros-arm64_x86_64-simulator
57 | LibraryPath
58 | CertificateSDK.framework
59 | SupportedArchitectures
60 |
61 | arm64
62 | x86_64
63 |
64 | SupportedPlatform
65 | xros
66 | SupportedPlatformVariant
67 | simulator
68 |
69 |
70 | CFBundlePackageType
71 | XFWK
72 | XCFrameworkFormatVersion
73 | 1.0
74 |
75 |
76 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/_CodeSignature/CodeDirectory:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/_CodeSignature/CodeDirectory
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/_CodeSignature/CodeRequirements:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/_CodeSignature/CodeRequirements
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/_CodeSignature/CodeRequirements-1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/_CodeSignature/CodeRequirements-1
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/_CodeSignature/CodeResources:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | files
6 |
7 | ios-arm64/CertificateSDK.framework/CertificateSDK
8 |
9 | EYFWs7hQ8RuuzcFOK5O+e1HKTXY=
10 |
11 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h
12 |
13 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
14 |
15 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h
16 |
17 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
18 |
19 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h
20 |
21 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
22 |
23 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h
24 |
25 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
26 |
27 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h
28 |
29 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
30 |
31 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h
32 |
33 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
34 |
35 | ios-arm64/CertificateSDK.framework/Headers/CertificateSDK.h
36 |
37 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
38 |
39 | ios-arm64/CertificateSDK.framework/Info.plist
40 |
41 | oKKx3xO67HXJqIuryrZX9Zm31gI=
42 |
43 | ios-arm64/CertificateSDK.framework/Modules/module.modulemap
44 |
45 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
46 |
47 | ios-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK
48 |
49 | tPPEICETVk3NBYa4xWgFocnVra4=
50 |
51 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h
52 |
53 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
54 |
55 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h
56 |
57 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
58 |
59 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h
60 |
61 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
62 |
63 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h
64 |
65 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
66 |
67 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h
68 |
69 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
70 |
71 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h
72 |
73 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
74 |
75 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h
76 |
77 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
78 |
79 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist
80 |
81 | yR5ER88z8vsXQdXlQliEpMowX/Q=
82 |
83 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap
84 |
85 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
86 |
87 | ios-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources
88 |
89 | MHDKTDprm8Sz4kxOPKiTYEuYdzg=
90 |
91 | xros-arm64/CertificateSDK.framework/CertificateSDK
92 |
93 | F436YTswVmacc/k+0DJ8lNObFL8=
94 |
95 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h
96 |
97 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
98 |
99 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h
100 |
101 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
102 |
103 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h
104 |
105 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
106 |
107 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h
108 |
109 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
110 |
111 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h
112 |
113 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
114 |
115 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h
116 |
117 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
118 |
119 | xros-arm64/CertificateSDK.framework/Headers/CertificateSDK.h
120 |
121 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
122 |
123 | xros-arm64/CertificateSDK.framework/Info.plist
124 |
125 | RRagTUFEOIYwMm4MHoZkgN8HNf4=
126 |
127 | xros-arm64/CertificateSDK.framework/Modules/module.modulemap
128 |
129 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
130 |
131 | xros-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK
132 |
133 | gexrUlFOV20GK34xaGc8OACmtLw=
134 |
135 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h
136 |
137 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
138 |
139 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h
140 |
141 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
142 |
143 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h
144 |
145 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
146 |
147 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h
148 |
149 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
150 |
151 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h
152 |
153 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
154 |
155 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h
156 |
157 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
158 |
159 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h
160 |
161 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
162 |
163 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist
164 |
165 | n+VlnCTVs9HVPBlZ8bY2aBzcCUI=
166 |
167 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap
168 |
169 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
170 |
171 | xros-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources
172 |
173 | VKq4ypCBYivwqChIgiQlO9dqmBE=
174 |
175 |
176 | files2
177 |
178 | ios-arm64/CertificateSDK.framework/CertificateSDK
179 |
180 | hash
181 |
182 | EYFWs7hQ8RuuzcFOK5O+e1HKTXY=
183 |
184 | hash2
185 |
186 | yDmiZgUCFlXJ949fzR2ANO5BTJMcdNp0xssqsLip4xo=
187 |
188 |
189 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h
190 |
191 | hash
192 |
193 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
194 |
195 | hash2
196 |
197 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc=
198 |
199 |
200 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h
201 |
202 | hash
203 |
204 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
205 |
206 | hash2
207 |
208 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k=
209 |
210 |
211 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h
212 |
213 | hash
214 |
215 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
216 |
217 | hash2
218 |
219 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA=
220 |
221 |
222 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h
223 |
224 | hash
225 |
226 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
227 |
228 | hash2
229 |
230 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48=
231 |
232 |
233 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h
234 |
235 | hash
236 |
237 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
238 |
239 | hash2
240 |
241 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI=
242 |
243 |
244 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h
245 |
246 | hash
247 |
248 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
249 |
250 | hash2
251 |
252 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE=
253 |
254 |
255 | ios-arm64/CertificateSDK.framework/Headers/CertificateSDK.h
256 |
257 | hash
258 |
259 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
260 |
261 | hash2
262 |
263 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA=
264 |
265 |
266 | ios-arm64/CertificateSDK.framework/Info.plist
267 |
268 | hash
269 |
270 | oKKx3xO67HXJqIuryrZX9Zm31gI=
271 |
272 | hash2
273 |
274 | StaKZfvqIn6QngholYv+Yz7GOfg4KmEDMAz9awahsxk=
275 |
276 |
277 | ios-arm64/CertificateSDK.framework/Modules/module.modulemap
278 |
279 | hash
280 |
281 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
282 |
283 | hash2
284 |
285 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck=
286 |
287 |
288 | ios-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK
289 |
290 | hash
291 |
292 | tPPEICETVk3NBYa4xWgFocnVra4=
293 |
294 | hash2
295 |
296 | 3TmEMGxKiZt38+LaaziudGPg6xSILsRDGCCDO2/Ydnk=
297 |
298 |
299 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h
300 |
301 | hash
302 |
303 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
304 |
305 | hash2
306 |
307 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc=
308 |
309 |
310 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h
311 |
312 | hash
313 |
314 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
315 |
316 | hash2
317 |
318 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k=
319 |
320 |
321 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h
322 |
323 | hash
324 |
325 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
326 |
327 | hash2
328 |
329 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA=
330 |
331 |
332 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h
333 |
334 | hash
335 |
336 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
337 |
338 | hash2
339 |
340 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48=
341 |
342 |
343 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h
344 |
345 | hash
346 |
347 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
348 |
349 | hash2
350 |
351 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI=
352 |
353 |
354 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h
355 |
356 | hash
357 |
358 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
359 |
360 | hash2
361 |
362 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE=
363 |
364 |
365 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h
366 |
367 | hash
368 |
369 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
370 |
371 | hash2
372 |
373 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA=
374 |
375 |
376 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist
377 |
378 | hash
379 |
380 | yR5ER88z8vsXQdXlQliEpMowX/Q=
381 |
382 | hash2
383 |
384 | /5oI8EYke/uHcDkI/us8JtJFAWwzfCCRmmTWoEHg3PE=
385 |
386 |
387 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap
388 |
389 | hash
390 |
391 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
392 |
393 | hash2
394 |
395 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck=
396 |
397 |
398 | ios-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources
399 |
400 | hash
401 |
402 | MHDKTDprm8Sz4kxOPKiTYEuYdzg=
403 |
404 | hash2
405 |
406 | 73G1bP4ycLZMWMbWxagOxunhG7Rn6E3C2A9bZool2gQ=
407 |
408 |
409 | xros-arm64/CertificateSDK.framework/CertificateSDK
410 |
411 | hash
412 |
413 | F436YTswVmacc/k+0DJ8lNObFL8=
414 |
415 | hash2
416 |
417 | 6mNWltv/Nt9/QeKJrDuQS0Z0wZjSo1VpRGPSlyTBgwY=
418 |
419 |
420 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h
421 |
422 | hash
423 |
424 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
425 |
426 | hash2
427 |
428 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc=
429 |
430 |
431 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h
432 |
433 | hash
434 |
435 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
436 |
437 | hash2
438 |
439 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k=
440 |
441 |
442 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h
443 |
444 | hash
445 |
446 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
447 |
448 | hash2
449 |
450 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA=
451 |
452 |
453 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h
454 |
455 | hash
456 |
457 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
458 |
459 | hash2
460 |
461 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48=
462 |
463 |
464 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h
465 |
466 | hash
467 |
468 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
469 |
470 | hash2
471 |
472 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI=
473 |
474 |
475 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h
476 |
477 | hash
478 |
479 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
480 |
481 | hash2
482 |
483 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE=
484 |
485 |
486 | xros-arm64/CertificateSDK.framework/Headers/CertificateSDK.h
487 |
488 | hash
489 |
490 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
491 |
492 | hash2
493 |
494 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA=
495 |
496 |
497 | xros-arm64/CertificateSDK.framework/Info.plist
498 |
499 | hash
500 |
501 | RRagTUFEOIYwMm4MHoZkgN8HNf4=
502 |
503 | hash2
504 |
505 | pkp60rhJVwX7ho3UTHMQj/9a9YD+x6tgBTYWC4oTapg=
506 |
507 |
508 | xros-arm64/CertificateSDK.framework/Modules/module.modulemap
509 |
510 | hash
511 |
512 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
513 |
514 | hash2
515 |
516 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck=
517 |
518 |
519 | xros-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK
520 |
521 | hash
522 |
523 | gexrUlFOV20GK34xaGc8OACmtLw=
524 |
525 | hash2
526 |
527 | NZKOlQSq+s3q9LrYDHXfSspwERANMsbm3JypeLvo6yg=
528 |
529 |
530 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h
531 |
532 | hash
533 |
534 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
535 |
536 | hash2
537 |
538 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc=
539 |
540 |
541 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h
542 |
543 | hash
544 |
545 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
546 |
547 | hash2
548 |
549 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k=
550 |
551 |
552 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h
553 |
554 | hash
555 |
556 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
557 |
558 | hash2
559 |
560 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA=
561 |
562 |
563 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h
564 |
565 | hash
566 |
567 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
568 |
569 | hash2
570 |
571 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48=
572 |
573 |
574 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h
575 |
576 | hash
577 |
578 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
579 |
580 | hash2
581 |
582 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI=
583 |
584 |
585 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h
586 |
587 | hash
588 |
589 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
590 |
591 | hash2
592 |
593 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE=
594 |
595 |
596 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h
597 |
598 | hash
599 |
600 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
601 |
602 | hash2
603 |
604 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA=
605 |
606 |
607 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist
608 |
609 | hash
610 |
611 | n+VlnCTVs9HVPBlZ8bY2aBzcCUI=
612 |
613 | hash2
614 |
615 | 35qRMKMr+NctBfZDK7xwnQ51nHrmstRjO8eyaXvzftY=
616 |
617 |
618 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap
619 |
620 | hash
621 |
622 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
623 |
624 | hash2
625 |
626 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck=
627 |
628 |
629 | xros-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources
630 |
631 | hash
632 |
633 | VKq4ypCBYivwqChIgiQlO9dqmBE=
634 |
635 | hash2
636 |
637 | 3EXJVzHA+inZivDKoH/PTvl+yN4cRuroH5l7XMZGRWY=
638 |
639 |
640 |
641 | rules
642 |
643 | ^.*
644 |
645 | ^.*\.lproj/
646 |
647 | optional
648 |
649 | weight
650 | 1000
651 |
652 | ^.*\.lproj/locversion.plist$
653 |
654 | omit
655 |
656 | weight
657 | 1100
658 |
659 | ^Base\.lproj/
660 |
661 | weight
662 | 1010
663 |
664 | ^version.plist$
665 |
666 |
667 | rules2
668 |
669 | .*\.dSYM($|/)
670 |
671 | weight
672 | 11
673 |
674 | ^(.*/)?\.DS_Store$
675 |
676 | omit
677 |
678 | weight
679 | 2000
680 |
681 | ^.*
682 |
683 | ^.*\.lproj/
684 |
685 | optional
686 |
687 | weight
688 | 1000
689 |
690 | ^.*\.lproj/locversion.plist$
691 |
692 | omit
693 |
694 | weight
695 | 1100
696 |
697 | ^Base\.lproj/
698 |
699 | weight
700 | 1010
701 |
702 | ^Info\.plist$
703 |
704 | omit
705 |
706 | weight
707 | 20
708 |
709 | ^PkgInfo$
710 |
711 | omit
712 |
713 | weight
714 | 20
715 |
716 | ^embedded\.provisionprofile$
717 |
718 | weight
719 | 20
720 |
721 | ^version\.plist$
722 |
723 | weight
724 | 20
725 |
726 |
727 |
728 |
729 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/_CodeSignature/CodeSignature:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/_CodeSignature/CodeSignature
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/CertificateSDK:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/CertificateSDK
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestBase_h
8 | #define CertificateRequestBase_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class is the base class for all CertificateRequestProtocol objects.
18 | Subclasses will have a concrete implementation of requesting certificates.
19 | */
20 | NS_CLASS_AVAILABLE_IOS(10_0)
21 | @interface CertificateRequestBase : NSObject
22 |
23 | /**
24 | The object that will be called back with progress, errors, and completion.
25 | */
26 | @property (weak, readonly) id delegate;
27 |
28 | /**
29 | This is the maximum number of steps in the progress of a certificate request.
30 | May be approximate until the actual call of -startNewCertificateRequest
31 | */
32 | @property (assign, readonly) NSUInteger maxNumberOfSteps;
33 |
34 | /**
35 | Create an object.
36 |
37 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
38 | @return An initialized object; may be nil if memory is full
39 | */
40 | - (nullable instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER;
41 |
42 | @end
43 |
44 | NS_ASSUME_NONNULL_END
45 |
46 | #endif /* CertificateRequestBase_h */
47 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestDelegate_h
8 | #define CertificateRequestDelegate_h
9 |
10 | NS_ASSUME_NONNULL_BEGIN
11 |
12 | @protocol CertificateRequestProtocol;
13 |
14 | /**
15 | Third party apps should have a class that implements these methods for notification on progress, errors, and completion.
16 | */
17 | @protocol CertificateRequestDelegate
18 |
19 | @required
20 | /**
21 | When any kind of error occurs in the process for requesting certificates, this delegate method will be called.
22 |
23 | @param request The object that initiated the request
24 | @param error An error object
25 | */
26 | - (void)certificateRequest:(id)request errorOccurred:(NSError *)error NS_SWIFT_NAME(certificate(request:error:));
27 |
28 | @required
29 | /**
30 | When the request to Jamf Pro is completed, this method will be called. If there were errors, the identity will be nil.
31 |
32 | @param request The object that started the request.
33 | @param identity An identity that encapsulates the info from the server.
34 | */
35 | - (void)certificateRequest:(id)request completedWithIdentity:(nullable SecIdentityRef)identity
36 | NS_SWIFT_NAME(certificate(request:completedWith:));
37 |
38 | @optional
39 | /**
40 | As the steps are completed during the request to Jamf Pro, this method can be called. The current progress can be checked
41 | against the request.maxNumberOfSteps to show progress percentage.
42 | NOTE: Each step may take a different (unknown) amount of time as the actual request will be using network resources.
43 |
44 | @param request The object that started the request.
45 | @param current The current progress
46 | */
47 | - (void)certificateRequest:(id)request progress:(NSUInteger)current;
48 |
49 | @optional
50 | /**
51 | When the CertificateRequest SDK begins accessing the network and when it ends accessing the network, this method
52 | is called if implemented.
53 |
54 | @param request The object that started the request.
55 | @param isUsingNetwork Whether or not the request is currently using the network.
56 | */
57 | - (void)certificateRequest:(id)request isUsingNetwork:(BOOL)isUsingNetwork;
58 |
59 |
60 | @optional
61 | /**
62 | When the CertificateRequest SDK detects no settings in the Managed App Config key, or if the invitation in the
63 | Managed App Config has expired this will be called to let you know that it is waiting for a new MAC to be delivered
64 | from the Jamf Pro server. Will be called again when the MAC comes in; the timing on this can vary greatly.
65 |
66 | @param request The object that started the request.
67 | @param waitingForMAC Whether or not the request is currently waiting for settings in the Managed App Config.
68 | */
69 | - (void)certificateRequest:(id)request isWaitingForMAC:(BOOL)waitingForMAC;
70 |
71 | @end
72 |
73 | NS_ASSUME_NONNULL_END
74 |
75 | #endif /* CertificateRequestDelegate_h */
76 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestEmbeddedP12_h
8 | #define CertificateRequestEmbeddedP12_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class reads the certificate from an embedded p12 file, and can force errors for testing.
18 | */
19 | NS_CLASS_AVAILABLE_IOS(10_0)
20 | @interface CertificateRequestEmbeddedP12 : CertificateRequestBase
21 |
22 | /**
23 | Create an object.
24 |
25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
26 | @param p12URL A URL to a file with a .p12 certificate that will be returned
27 | @param pwd The password for the .p12 file
28 | @return An initialized object; may be nil if memory is full
29 | */
30 | - (nullable instancetype)initWithDelegate:(id)delegate
31 | p12File:(NSURL *)p12URL
32 | p12Password:(NSString *)pwd;
33 |
34 | /**
35 | Use this option to artificially delay the completion of each step. Each step up to maxNumberOfSteps will take this many seconds.
36 | This allows you to test things that are hard to test otherwise, such as progress.
37 | Defaults to zero (full speed).
38 | */
39 | @property (assign) NSUInteger secondsBetweenSteps;
40 |
41 | @end
42 |
43 | NS_ASSUME_NONNULL_END
44 |
45 | #endif /* CertificateRequestEmbeddedP12_h */
46 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateErrorDomain_h
8 | #define CertificateErrorDomain_h
9 |
10 | /**
11 | The error domain specific to the Jamf Certificate SDK.
12 | */
13 | extern NSString * const kCertificateRequestErrorDomain;
14 |
15 | /**
16 | Errors specific to the Jamf Certificate SDK
17 |
18 | - kErrorBadInitializationParams: A CertificateRequestEmbeddedP12 object was initialized with bad parameters.
19 | - kErrorCertificateMalformed: Unlikely to happen. The certificate coming from Jamf Pro has been mangled in transit.
20 | - kErrorCertificateWrongAutomaticPassword: Unlikely to happen. Occurs when the .p12 from the server was encrypted with a different password than the SDK has chosen.
21 | - kErrorIncorrectManagedAppConfigData: The Managed App Config info does not contain enough information to contact Jamf Pro.
22 | - kErrorInvalidResponseFromJamfProServer: Unlikely to happen. The Jamf Pro server responded with info that the SDK does not understand.
23 | - kErrorTestingP12LoadFailed: Unlikely to happen. When using the testing class CertificateRequestEmbeddedP12 this is a generic error that the p12 failed to load.
24 | */
25 | NS_ERROR_ENUM(kCertificateRequestErrorDomain) {
26 | kErrorBadInitializationParams = 1,
27 | kErrorCertificateMalformed = 2,
28 | kErrorCertificateWrongAutomaticPassword = 3,
29 | kErrorIncorrectManagedAppConfigData = 4,
30 | kErrorInvalidResponseFromJamfProServer = 5,
31 | kErrorTestingP12LoadFailed = 6
32 | };
33 |
34 | #endif /* CertificateErrorDomain_h */
35 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestProtocol_h
8 | #define CertificateRequestProtocol_h
9 |
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | /**
15 | This is the protocol used for requesting and renewing certificates from Jamf Pro.
16 | */
17 | @protocol CertificateRequestProtocol
18 |
19 | /**
20 | This is the maximum number of steps in the progress of a certificate request.
21 | May be approximate until the actual call of -startNewCertificateRequest
22 | */
23 | @property (assign, readonly) NSUInteger maxNumberOfSteps;
24 |
25 | /**
26 | This will start a request to the Jamf Pro server for a new certificate.
27 | The delegate will be called with progress, errors, and the new identity.
28 | NOTE: Only one such request should be in progress at a given time for a single CertificateRequest object.
29 | */
30 | - (void)startNewCertificateRequest;
31 |
32 | /**
33 | Cancels the current request, if any. The completion handler WILL be called on the delegate.
34 | */
35 | - (void)cancelRequest;
36 |
37 | @end
38 |
39 | NS_ASSUME_NONNULL_END
40 |
41 | #endif /* CertificateRequestProtocol_h */
42 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestWorkflow_h
8 | #define CertificateRequestWorkflow_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class is the main class that should be instantiated to make a certificate request.
18 | */
19 | NS_CLASS_AVAILABLE_IOS(10_0)
20 | @interface CertificateRequestWorkflow : CertificateRequestBase
21 |
22 | /**
23 | Create an object.
24 |
25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
26 | @return An initialized object; may be nil if memory is full
27 | */
28 | - (nullable instancetype)initWithDelegate:(id)delegate;
29 |
30 | /**
31 | Create an object with given settings instead of relying on Managed App Config. This is a testing method.
32 |
33 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
34 | @param testSettings The settings that would otherwise be provided by Managed App Config.
35 | @return An initialized object; may be nil if memory is full
36 | */
37 | - (nullable instancetype)initWithDelegate:(id)delegate testSettings:(NSDictionary *)testSettings;
38 |
39 | /**
40 | Use this option to specify a custom timeout in seconds for individual network requests.
41 | Defaults to 30 seconds.
42 | */
43 | @property (assign) NSUInteger networkingTimeout;
44 |
45 | /**
46 | Use this option to specify a custom interval in seconds to poll for certificate creation.
47 | The first retrieval will happen after this interval, which means this also specifies the minimum
48 | amount of time required for the certificate request. Minimum value is one second.
49 | Defaults to 5 seconds.
50 | */
51 | @property (assign) NSUInteger pollingInterval;
52 |
53 | /**
54 | Use this option to specify an overall timeout in seconds to poll for certificate creation.
55 | After this much time, if the server has still not returned a certificate then the certificate request
56 | will fail with a timeout error.
57 | Defaults to 180 seconds.
58 | */
59 | @property (assign) NSUInteger pollingTimeout;
60 |
61 | @end
62 |
63 | NS_ASSUME_NONNULL_END
64 |
65 | #endif /* CertificateRequestWorkflow_h */
66 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateSDK.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #import
8 |
9 | //! Project version number for CertificateSDK.
10 | FOUNDATION_EXPORT double CertificateSDKVersionNumber;
11 |
12 | //! Project version string for CertificateSDK.
13 | FOUNDATION_EXPORT const unsigned char CertificateSDKVersionString[];
14 |
15 |
16 | #import
17 | #import
18 | #import
19 |
20 | #import
21 | #import
22 | #import
23 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Info.plist:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Info.plist
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Modules/module.modulemap:
--------------------------------------------------------------------------------
1 | framework module CertificateSDK {
2 | umbrella header "CertificateSDK.h"
3 | export *
4 |
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestBase_h
8 | #define CertificateRequestBase_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class is the base class for all CertificateRequestProtocol objects.
18 | Subclasses will have a concrete implementation of requesting certificates.
19 | */
20 | NS_CLASS_AVAILABLE_IOS(10_0)
21 | @interface CertificateRequestBase : NSObject
22 |
23 | /**
24 | The object that will be called back with progress, errors, and completion.
25 | */
26 | @property (weak, readonly) id delegate;
27 |
28 | /**
29 | This is the maximum number of steps in the progress of a certificate request.
30 | May be approximate until the actual call of -startNewCertificateRequest
31 | */
32 | @property (assign, readonly) NSUInteger maxNumberOfSteps;
33 |
34 | /**
35 | Create an object.
36 |
37 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
38 | @return An initialized object; may be nil if memory is full
39 | */
40 | - (nullable instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER;
41 |
42 | @end
43 |
44 | NS_ASSUME_NONNULL_END
45 |
46 | #endif /* CertificateRequestBase_h */
47 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestDelegate_h
8 | #define CertificateRequestDelegate_h
9 |
10 | NS_ASSUME_NONNULL_BEGIN
11 |
12 | @protocol CertificateRequestProtocol;
13 |
14 | /**
15 | Third party apps should have a class that implements these methods for notification on progress, errors, and completion.
16 | */
17 | @protocol CertificateRequestDelegate
18 |
19 | @required
20 | /**
21 | When any kind of error occurs in the process for requesting certificates, this delegate method will be called.
22 |
23 | @param request The object that initiated the request
24 | @param error An error object
25 | */
26 | - (void)certificateRequest:(id)request errorOccurred:(NSError *)error NS_SWIFT_NAME(certificate(request:error:));
27 |
28 | @required
29 | /**
30 | When the request to Jamf Pro is completed, this method will be called. If there were errors, the identity will be nil.
31 |
32 | @param request The object that started the request.
33 | @param identity An identity that encapsulates the info from the server.
34 | */
35 | - (void)certificateRequest:(id)request completedWithIdentity:(nullable SecIdentityRef)identity
36 | NS_SWIFT_NAME(certificate(request:completedWith:));
37 |
38 | @optional
39 | /**
40 | As the steps are completed during the request to Jamf Pro, this method can be called. The current progress can be checked
41 | against the request.maxNumberOfSteps to show progress percentage.
42 | NOTE: Each step may take a different (unknown) amount of time as the actual request will be using network resources.
43 |
44 | @param request The object that started the request.
45 | @param current The current progress
46 | */
47 | - (void)certificateRequest:(id)request progress:(NSUInteger)current;
48 |
49 | @optional
50 | /**
51 | When the CertificateRequest SDK begins accessing the network and when it ends accessing the network, this method
52 | is called if implemented.
53 |
54 | @param request The object that started the request.
55 | @param isUsingNetwork Whether or not the request is currently using the network.
56 | */
57 | - (void)certificateRequest:(id)request isUsingNetwork:(BOOL)isUsingNetwork;
58 |
59 |
60 | @optional
61 | /**
62 | When the CertificateRequest SDK detects no settings in the Managed App Config key, or if the invitation in the
63 | Managed App Config has expired this will be called to let you know that it is waiting for a new MAC to be delivered
64 | from the Jamf Pro server. Will be called again when the MAC comes in; the timing on this can vary greatly.
65 |
66 | @param request The object that started the request.
67 | @param waitingForMAC Whether or not the request is currently waiting for settings in the Managed App Config.
68 | */
69 | - (void)certificateRequest:(id)request isWaitingForMAC:(BOOL)waitingForMAC;
70 |
71 | @end
72 |
73 | NS_ASSUME_NONNULL_END
74 |
75 | #endif /* CertificateRequestDelegate_h */
76 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestEmbeddedP12_h
8 | #define CertificateRequestEmbeddedP12_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class reads the certificate from an embedded p12 file, and can force errors for testing.
18 | */
19 | NS_CLASS_AVAILABLE_IOS(10_0)
20 | @interface CertificateRequestEmbeddedP12 : CertificateRequestBase
21 |
22 | /**
23 | Create an object.
24 |
25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
26 | @param p12URL A URL to a file with a .p12 certificate that will be returned
27 | @param pwd The password for the .p12 file
28 | @return An initialized object; may be nil if memory is full
29 | */
30 | - (nullable instancetype)initWithDelegate:(id)delegate
31 | p12File:(NSURL *)p12URL
32 | p12Password:(NSString *)pwd;
33 |
34 | /**
35 | Use this option to artificially delay the completion of each step. Each step up to maxNumberOfSteps will take this many seconds.
36 | This allows you to test things that are hard to test otherwise, such as progress.
37 | Defaults to zero (full speed).
38 | */
39 | @property (assign) NSUInteger secondsBetweenSteps;
40 |
41 | @end
42 |
43 | NS_ASSUME_NONNULL_END
44 |
45 | #endif /* CertificateRequestEmbeddedP12_h */
46 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateErrorDomain_h
8 | #define CertificateErrorDomain_h
9 |
10 | /**
11 | The error domain specific to the Jamf Certificate SDK.
12 | */
13 | extern NSString * const kCertificateRequestErrorDomain;
14 |
15 | /**
16 | Errors specific to the Jamf Certificate SDK
17 |
18 | - kErrorBadInitializationParams: A CertificateRequestEmbeddedP12 object was initialized with bad parameters.
19 | - kErrorCertificateMalformed: Unlikely to happen. The certificate coming from Jamf Pro has been mangled in transit.
20 | - kErrorCertificateWrongAutomaticPassword: Unlikely to happen. Occurs when the .p12 from the server was encrypted with a different password than the SDK has chosen.
21 | - kErrorIncorrectManagedAppConfigData: The Managed App Config info does not contain enough information to contact Jamf Pro.
22 | - kErrorInvalidResponseFromJamfProServer: Unlikely to happen. The Jamf Pro server responded with info that the SDK does not understand.
23 | - kErrorTestingP12LoadFailed: Unlikely to happen. When using the testing class CertificateRequestEmbeddedP12 this is a generic error that the p12 failed to load.
24 | */
25 | NS_ERROR_ENUM(kCertificateRequestErrorDomain) {
26 | kErrorBadInitializationParams = 1,
27 | kErrorCertificateMalformed = 2,
28 | kErrorCertificateWrongAutomaticPassword = 3,
29 | kErrorIncorrectManagedAppConfigData = 4,
30 | kErrorInvalidResponseFromJamfProServer = 5,
31 | kErrorTestingP12LoadFailed = 6
32 | };
33 |
34 | #endif /* CertificateErrorDomain_h */
35 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestProtocol_h
8 | #define CertificateRequestProtocol_h
9 |
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | /**
15 | This is the protocol used for requesting and renewing certificates from Jamf Pro.
16 | */
17 | @protocol CertificateRequestProtocol
18 |
19 | /**
20 | This is the maximum number of steps in the progress of a certificate request.
21 | May be approximate until the actual call of -startNewCertificateRequest
22 | */
23 | @property (assign, readonly) NSUInteger maxNumberOfSteps;
24 |
25 | /**
26 | This will start a request to the Jamf Pro server for a new certificate.
27 | The delegate will be called with progress, errors, and the new identity.
28 | NOTE: Only one such request should be in progress at a given time for a single CertificateRequest object.
29 | */
30 | - (void)startNewCertificateRequest;
31 |
32 | /**
33 | Cancels the current request, if any. The completion handler WILL be called on the delegate.
34 | */
35 | - (void)cancelRequest;
36 |
37 | @end
38 |
39 | NS_ASSUME_NONNULL_END
40 |
41 | #endif /* CertificateRequestProtocol_h */
42 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestWorkflow_h
8 | #define CertificateRequestWorkflow_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class is the main class that should be instantiated to make a certificate request.
18 | */
19 | NS_CLASS_AVAILABLE_IOS(10_0)
20 | @interface CertificateRequestWorkflow : CertificateRequestBase
21 |
22 | /**
23 | Create an object.
24 |
25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
26 | @return An initialized object; may be nil if memory is full
27 | */
28 | - (nullable instancetype)initWithDelegate:(id)delegate;
29 |
30 | /**
31 | Create an object with given settings instead of relying on Managed App Config. This is a testing method.
32 |
33 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
34 | @param testSettings The settings that would otherwise be provided by Managed App Config.
35 | @return An initialized object; may be nil if memory is full
36 | */
37 | - (nullable instancetype)initWithDelegate:(id)delegate testSettings:(NSDictionary *)testSettings;
38 |
39 | /**
40 | Use this option to specify a custom timeout in seconds for individual network requests.
41 | Defaults to 30 seconds.
42 | */
43 | @property (assign) NSUInteger networkingTimeout;
44 |
45 | /**
46 | Use this option to specify a custom interval in seconds to poll for certificate creation.
47 | The first retrieval will happen after this interval, which means this also specifies the minimum
48 | amount of time required for the certificate request. Minimum value is one second.
49 | Defaults to 5 seconds.
50 | */
51 | @property (assign) NSUInteger pollingInterval;
52 |
53 | /**
54 | Use this option to specify an overall timeout in seconds to poll for certificate creation.
55 | After this much time, if the server has still not returned a certificate then the certificate request
56 | will fail with a timeout error.
57 | Defaults to 180 seconds.
58 | */
59 | @property (assign) NSUInteger pollingTimeout;
60 |
61 | @end
62 |
63 | NS_ASSUME_NONNULL_END
64 |
65 | #endif /* CertificateRequestWorkflow_h */
66 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #import
8 |
9 | //! Project version number for CertificateSDK.
10 | FOUNDATION_EXPORT double CertificateSDKVersionNumber;
11 |
12 | //! Project version string for CertificateSDK.
13 | FOUNDATION_EXPORT const unsigned char CertificateSDKVersionString[];
14 |
15 |
16 | #import
17 | #import
18 | #import
19 |
20 | #import
21 | #import
22 | #import
23 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap:
--------------------------------------------------------------------------------
1 | framework module CertificateSDK {
2 | umbrella header "CertificateSDK.h"
3 | export *
4 |
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | files
6 |
7 | Headers/CertificateRequestBase.h
8 |
9 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
10 |
11 | Headers/CertificateRequestDelegate.h
12 |
13 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
14 |
15 | Headers/CertificateRequestEmbeddedP12.h
16 |
17 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
18 |
19 | Headers/CertificateRequestErrorDomain.h
20 |
21 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
22 |
23 | Headers/CertificateRequestProtocol.h
24 |
25 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
26 |
27 | Headers/CertificateRequestWorkflow.h
28 |
29 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
30 |
31 | Headers/CertificateSDK.h
32 |
33 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
34 |
35 | Info.plist
36 |
37 | yR5ER88z8vsXQdXlQliEpMowX/Q=
38 |
39 | Modules/module.modulemap
40 |
41 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
42 |
43 |
44 | files2
45 |
46 | Headers/CertificateRequestBase.h
47 |
48 | hash2
49 |
50 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc=
51 |
52 |
53 | Headers/CertificateRequestDelegate.h
54 |
55 | hash2
56 |
57 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k=
58 |
59 |
60 | Headers/CertificateRequestEmbeddedP12.h
61 |
62 | hash2
63 |
64 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA=
65 |
66 |
67 | Headers/CertificateRequestErrorDomain.h
68 |
69 | hash2
70 |
71 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48=
72 |
73 |
74 | Headers/CertificateRequestProtocol.h
75 |
76 | hash2
77 |
78 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI=
79 |
80 |
81 | Headers/CertificateRequestWorkflow.h
82 |
83 | hash2
84 |
85 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE=
86 |
87 |
88 | Headers/CertificateSDK.h
89 |
90 | hash2
91 |
92 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA=
93 |
94 |
95 | Modules/module.modulemap
96 |
97 | hash2
98 |
99 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck=
100 |
101 |
102 |
103 | rules
104 |
105 | ^.*
106 |
107 | ^.*\.lproj/
108 |
109 | optional
110 |
111 | weight
112 | 1000
113 |
114 | ^.*\.lproj/locversion.plist$
115 |
116 | omit
117 |
118 | weight
119 | 1100
120 |
121 | ^Base\.lproj/
122 |
123 | weight
124 | 1010
125 |
126 | ^version.plist$
127 |
128 |
129 | rules2
130 |
131 | .*\.dSYM($|/)
132 |
133 | weight
134 | 11
135 |
136 | ^(.*/)?\.DS_Store$
137 |
138 | omit
139 |
140 | weight
141 | 2000
142 |
143 | ^.*
144 |
145 | ^.*\.lproj/
146 |
147 | optional
148 |
149 | weight
150 | 1000
151 |
152 | ^.*\.lproj/locversion.plist$
153 |
154 | omit
155 |
156 | weight
157 | 1100
158 |
159 | ^Base\.lproj/
160 |
161 | weight
162 | 1010
163 |
164 | ^Info\.plist$
165 |
166 | omit
167 |
168 | weight
169 | 20
170 |
171 | ^PkgInfo$
172 |
173 | omit
174 |
175 | weight
176 | 20
177 |
178 | ^embedded\.provisionprofile$
179 |
180 | weight
181 | 20
182 |
183 | ^version\.plist$
184 |
185 | weight
186 | 20
187 |
188 |
189 |
190 |
191 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/CertificateSDK:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/CertificateSDK
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestBase_h
8 | #define CertificateRequestBase_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class is the base class for all CertificateRequestProtocol objects.
18 | Subclasses will have a concrete implementation of requesting certificates.
19 | */
20 | NS_CLASS_AVAILABLE_IOS(10_0)
21 | @interface CertificateRequestBase : NSObject
22 |
23 | /**
24 | The object that will be called back with progress, errors, and completion.
25 | */
26 | @property (weak, readonly) id delegate;
27 |
28 | /**
29 | This is the maximum number of steps in the progress of a certificate request.
30 | May be approximate until the actual call of -startNewCertificateRequest
31 | */
32 | @property (assign, readonly) NSUInteger maxNumberOfSteps;
33 |
34 | /**
35 | Create an object.
36 |
37 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
38 | @return An initialized object; may be nil if memory is full
39 | */
40 | - (nullable instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER;
41 |
42 | @end
43 |
44 | NS_ASSUME_NONNULL_END
45 |
46 | #endif /* CertificateRequestBase_h */
47 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestDelegate_h
8 | #define CertificateRequestDelegate_h
9 |
10 | NS_ASSUME_NONNULL_BEGIN
11 |
12 | @protocol CertificateRequestProtocol;
13 |
14 | /**
15 | Third party apps should have a class that implements these methods for notification on progress, errors, and completion.
16 | */
17 | @protocol CertificateRequestDelegate
18 |
19 | @required
20 | /**
21 | When any kind of error occurs in the process for requesting certificates, this delegate method will be called.
22 |
23 | @param request The object that initiated the request
24 | @param error An error object
25 | */
26 | - (void)certificateRequest:(id)request errorOccurred:(NSError *)error NS_SWIFT_NAME(certificate(request:error:));
27 |
28 | @required
29 | /**
30 | When the request to Jamf Pro is completed, this method will be called. If there were errors, the identity will be nil.
31 |
32 | @param request The object that started the request.
33 | @param identity An identity that encapsulates the info from the server.
34 | */
35 | - (void)certificateRequest:(id)request completedWithIdentity:(nullable SecIdentityRef)identity
36 | NS_SWIFT_NAME(certificate(request:completedWith:));
37 |
38 | @optional
39 | /**
40 | As the steps are completed during the request to Jamf Pro, this method can be called. The current progress can be checked
41 | against the request.maxNumberOfSteps to show progress percentage.
42 | NOTE: Each step may take a different (unknown) amount of time as the actual request will be using network resources.
43 |
44 | @param request The object that started the request.
45 | @param current The current progress
46 | */
47 | - (void)certificateRequest:(id)request progress:(NSUInteger)current;
48 |
49 | @optional
50 | /**
51 | When the CertificateRequest SDK begins accessing the network and when it ends accessing the network, this method
52 | is called if implemented.
53 |
54 | @param request The object that started the request.
55 | @param isUsingNetwork Whether or not the request is currently using the network.
56 | */
57 | - (void)certificateRequest:(id)request isUsingNetwork:(BOOL)isUsingNetwork;
58 |
59 |
60 | @optional
61 | /**
62 | When the CertificateRequest SDK detects no settings in the Managed App Config key, or if the invitation in the
63 | Managed App Config has expired this will be called to let you know that it is waiting for a new MAC to be delivered
64 | from the Jamf Pro server. Will be called again when the MAC comes in; the timing on this can vary greatly.
65 |
66 | @param request The object that started the request.
67 | @param waitingForMAC Whether or not the request is currently waiting for settings in the Managed App Config.
68 | */
69 | - (void)certificateRequest:(id)request isWaitingForMAC:(BOOL)waitingForMAC;
70 |
71 | @end
72 |
73 | NS_ASSUME_NONNULL_END
74 |
75 | #endif /* CertificateRequestDelegate_h */
76 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestEmbeddedP12_h
8 | #define CertificateRequestEmbeddedP12_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class reads the certificate from an embedded p12 file, and can force errors for testing.
18 | */
19 | NS_CLASS_AVAILABLE_IOS(10_0)
20 | @interface CertificateRequestEmbeddedP12 : CertificateRequestBase
21 |
22 | /**
23 | Create an object.
24 |
25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
26 | @param p12URL A URL to a file with a .p12 certificate that will be returned
27 | @param pwd The password for the .p12 file
28 | @return An initialized object; may be nil if memory is full
29 | */
30 | - (nullable instancetype)initWithDelegate:(id)delegate
31 | p12File:(NSURL *)p12URL
32 | p12Password:(NSString *)pwd;
33 |
34 | /**
35 | Use this option to artificially delay the completion of each step. Each step up to maxNumberOfSteps will take this many seconds.
36 | This allows you to test things that are hard to test otherwise, such as progress.
37 | Defaults to zero (full speed).
38 | */
39 | @property (assign) NSUInteger secondsBetweenSteps;
40 |
41 | @end
42 |
43 | NS_ASSUME_NONNULL_END
44 |
45 | #endif /* CertificateRequestEmbeddedP12_h */
46 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateErrorDomain_h
8 | #define CertificateErrorDomain_h
9 |
10 | /**
11 | The error domain specific to the Jamf Certificate SDK.
12 | */
13 | extern NSString * const kCertificateRequestErrorDomain;
14 |
15 | /**
16 | Errors specific to the Jamf Certificate SDK
17 |
18 | - kErrorBadInitializationParams: A CertificateRequestEmbeddedP12 object was initialized with bad parameters.
19 | - kErrorCertificateMalformed: Unlikely to happen. The certificate coming from Jamf Pro has been mangled in transit.
20 | - kErrorCertificateWrongAutomaticPassword: Unlikely to happen. Occurs when the .p12 from the server was encrypted with a different password than the SDK has chosen.
21 | - kErrorIncorrectManagedAppConfigData: The Managed App Config info does not contain enough information to contact Jamf Pro.
22 | - kErrorInvalidResponseFromJamfProServer: Unlikely to happen. The Jamf Pro server responded with info that the SDK does not understand.
23 | - kErrorTestingP12LoadFailed: Unlikely to happen. When using the testing class CertificateRequestEmbeddedP12 this is a generic error that the p12 failed to load.
24 | */
25 | NS_ERROR_ENUM(kCertificateRequestErrorDomain) {
26 | kErrorBadInitializationParams = 1,
27 | kErrorCertificateMalformed = 2,
28 | kErrorCertificateWrongAutomaticPassword = 3,
29 | kErrorIncorrectManagedAppConfigData = 4,
30 | kErrorInvalidResponseFromJamfProServer = 5,
31 | kErrorTestingP12LoadFailed = 6
32 | };
33 |
34 | #endif /* CertificateErrorDomain_h */
35 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestProtocol_h
8 | #define CertificateRequestProtocol_h
9 |
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | /**
15 | This is the protocol used for requesting and renewing certificates from Jamf Pro.
16 | */
17 | @protocol CertificateRequestProtocol
18 |
19 | /**
20 | This is the maximum number of steps in the progress of a certificate request.
21 | May be approximate until the actual call of -startNewCertificateRequest
22 | */
23 | @property (assign, readonly) NSUInteger maxNumberOfSteps;
24 |
25 | /**
26 | This will start a request to the Jamf Pro server for a new certificate.
27 | The delegate will be called with progress, errors, and the new identity.
28 | NOTE: Only one such request should be in progress at a given time for a single CertificateRequest object.
29 | */
30 | - (void)startNewCertificateRequest;
31 |
32 | /**
33 | Cancels the current request, if any. The completion handler WILL be called on the delegate.
34 | */
35 | - (void)cancelRequest;
36 |
37 | @end
38 |
39 | NS_ASSUME_NONNULL_END
40 |
41 | #endif /* CertificateRequestProtocol_h */
42 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestWorkflow_h
8 | #define CertificateRequestWorkflow_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class is the main class that should be instantiated to make a certificate request.
18 | */
19 | NS_CLASS_AVAILABLE_IOS(10_0)
20 | @interface CertificateRequestWorkflow : CertificateRequestBase
21 |
22 | /**
23 | Create an object.
24 |
25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
26 | @return An initialized object; may be nil if memory is full
27 | */
28 | - (nullable instancetype)initWithDelegate:(id)delegate;
29 |
30 | /**
31 | Create an object with given settings instead of relying on Managed App Config. This is a testing method.
32 |
33 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
34 | @param testSettings The settings that would otherwise be provided by Managed App Config.
35 | @return An initialized object; may be nil if memory is full
36 | */
37 | - (nullable instancetype)initWithDelegate:(id)delegate testSettings:(NSDictionary *)testSettings;
38 |
39 | /**
40 | Use this option to specify a custom timeout in seconds for individual network requests.
41 | Defaults to 30 seconds.
42 | */
43 | @property (assign) NSUInteger networkingTimeout;
44 |
45 | /**
46 | Use this option to specify a custom interval in seconds to poll for certificate creation.
47 | The first retrieval will happen after this interval, which means this also specifies the minimum
48 | amount of time required for the certificate request. Minimum value is one second.
49 | Defaults to 5 seconds.
50 | */
51 | @property (assign) NSUInteger pollingInterval;
52 |
53 | /**
54 | Use this option to specify an overall timeout in seconds to poll for certificate creation.
55 | After this much time, if the server has still not returned a certificate then the certificate request
56 | will fail with a timeout error.
57 | Defaults to 180 seconds.
58 | */
59 | @property (assign) NSUInteger pollingTimeout;
60 |
61 | @end
62 |
63 | NS_ASSUME_NONNULL_END
64 |
65 | #endif /* CertificateRequestWorkflow_h */
66 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateSDK.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #import
8 |
9 | //! Project version number for CertificateSDK.
10 | FOUNDATION_EXPORT double CertificateSDKVersionNumber;
11 |
12 | //! Project version string for CertificateSDK.
13 | FOUNDATION_EXPORT const unsigned char CertificateSDKVersionString[];
14 |
15 |
16 | #import
17 | #import
18 | #import
19 |
20 | #import
21 | #import
22 | #import
23 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Info.plist:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Info.plist
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Modules/module.modulemap:
--------------------------------------------------------------------------------
1 | framework module CertificateSDK {
2 | umbrella header "CertificateSDK.h"
3 | export *
4 |
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestBase_h
8 | #define CertificateRequestBase_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class is the base class for all CertificateRequestProtocol objects.
18 | Subclasses will have a concrete implementation of requesting certificates.
19 | */
20 | NS_CLASS_AVAILABLE_IOS(10_0)
21 | @interface CertificateRequestBase : NSObject
22 |
23 | /**
24 | The object that will be called back with progress, errors, and completion.
25 | */
26 | @property (weak, readonly) id delegate;
27 |
28 | /**
29 | This is the maximum number of steps in the progress of a certificate request.
30 | May be approximate until the actual call of -startNewCertificateRequest
31 | */
32 | @property (assign, readonly) NSUInteger maxNumberOfSteps;
33 |
34 | /**
35 | Create an object.
36 |
37 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
38 | @return An initialized object; may be nil if memory is full
39 | */
40 | - (nullable instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER;
41 |
42 | @end
43 |
44 | NS_ASSUME_NONNULL_END
45 |
46 | #endif /* CertificateRequestBase_h */
47 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestDelegate_h
8 | #define CertificateRequestDelegate_h
9 |
10 | NS_ASSUME_NONNULL_BEGIN
11 |
12 | @protocol CertificateRequestProtocol;
13 |
14 | /**
15 | Third party apps should have a class that implements these methods for notification on progress, errors, and completion.
16 | */
17 | @protocol CertificateRequestDelegate
18 |
19 | @required
20 | /**
21 | When any kind of error occurs in the process for requesting certificates, this delegate method will be called.
22 |
23 | @param request The object that initiated the request
24 | @param error An error object
25 | */
26 | - (void)certificateRequest:(id)request errorOccurred:(NSError *)error NS_SWIFT_NAME(certificate(request:error:));
27 |
28 | @required
29 | /**
30 | When the request to Jamf Pro is completed, this method will be called. If there were errors, the identity will be nil.
31 |
32 | @param request The object that started the request.
33 | @param identity An identity that encapsulates the info from the server.
34 | */
35 | - (void)certificateRequest:(id)request completedWithIdentity:(nullable SecIdentityRef)identity
36 | NS_SWIFT_NAME(certificate(request:completedWith:));
37 |
38 | @optional
39 | /**
40 | As the steps are completed during the request to Jamf Pro, this method can be called. The current progress can be checked
41 | against the request.maxNumberOfSteps to show progress percentage.
42 | NOTE: Each step may take a different (unknown) amount of time as the actual request will be using network resources.
43 |
44 | @param request The object that started the request.
45 | @param current The current progress
46 | */
47 | - (void)certificateRequest:(id)request progress:(NSUInteger)current;
48 |
49 | @optional
50 | /**
51 | When the CertificateRequest SDK begins accessing the network and when it ends accessing the network, this method
52 | is called if implemented.
53 |
54 | @param request The object that started the request.
55 | @param isUsingNetwork Whether or not the request is currently using the network.
56 | */
57 | - (void)certificateRequest:(id)request isUsingNetwork:(BOOL)isUsingNetwork;
58 |
59 |
60 | @optional
61 | /**
62 | When the CertificateRequest SDK detects no settings in the Managed App Config key, or if the invitation in the
63 | Managed App Config has expired this will be called to let you know that it is waiting for a new MAC to be delivered
64 | from the Jamf Pro server. Will be called again when the MAC comes in; the timing on this can vary greatly.
65 |
66 | @param request The object that started the request.
67 | @param waitingForMAC Whether or not the request is currently waiting for settings in the Managed App Config.
68 | */
69 | - (void)certificateRequest:(id)request isWaitingForMAC:(BOOL)waitingForMAC;
70 |
71 | @end
72 |
73 | NS_ASSUME_NONNULL_END
74 |
75 | #endif /* CertificateRequestDelegate_h */
76 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestEmbeddedP12_h
8 | #define CertificateRequestEmbeddedP12_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class reads the certificate from an embedded p12 file, and can force errors for testing.
18 | */
19 | NS_CLASS_AVAILABLE_IOS(10_0)
20 | @interface CertificateRequestEmbeddedP12 : CertificateRequestBase
21 |
22 | /**
23 | Create an object.
24 |
25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
26 | @param p12URL A URL to a file with a .p12 certificate that will be returned
27 | @param pwd The password for the .p12 file
28 | @return An initialized object; may be nil if memory is full
29 | */
30 | - (nullable instancetype)initWithDelegate:(id)delegate
31 | p12File:(NSURL *)p12URL
32 | p12Password:(NSString *)pwd;
33 |
34 | /**
35 | Use this option to artificially delay the completion of each step. Each step up to maxNumberOfSteps will take this many seconds.
36 | This allows you to test things that are hard to test otherwise, such as progress.
37 | Defaults to zero (full speed).
38 | */
39 | @property (assign) NSUInteger secondsBetweenSteps;
40 |
41 | @end
42 |
43 | NS_ASSUME_NONNULL_END
44 |
45 | #endif /* CertificateRequestEmbeddedP12_h */
46 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateErrorDomain_h
8 | #define CertificateErrorDomain_h
9 |
10 | /**
11 | The error domain specific to the Jamf Certificate SDK.
12 | */
13 | extern NSString * const kCertificateRequestErrorDomain;
14 |
15 | /**
16 | Errors specific to the Jamf Certificate SDK
17 |
18 | - kErrorBadInitializationParams: A CertificateRequestEmbeddedP12 object was initialized with bad parameters.
19 | - kErrorCertificateMalformed: Unlikely to happen. The certificate coming from Jamf Pro has been mangled in transit.
20 | - kErrorCertificateWrongAutomaticPassword: Unlikely to happen. Occurs when the .p12 from the server was encrypted with a different password than the SDK has chosen.
21 | - kErrorIncorrectManagedAppConfigData: The Managed App Config info does not contain enough information to contact Jamf Pro.
22 | - kErrorInvalidResponseFromJamfProServer: Unlikely to happen. The Jamf Pro server responded with info that the SDK does not understand.
23 | - kErrorTestingP12LoadFailed: Unlikely to happen. When using the testing class CertificateRequestEmbeddedP12 this is a generic error that the p12 failed to load.
24 | */
25 | NS_ERROR_ENUM(kCertificateRequestErrorDomain) {
26 | kErrorBadInitializationParams = 1,
27 | kErrorCertificateMalformed = 2,
28 | kErrorCertificateWrongAutomaticPassword = 3,
29 | kErrorIncorrectManagedAppConfigData = 4,
30 | kErrorInvalidResponseFromJamfProServer = 5,
31 | kErrorTestingP12LoadFailed = 6
32 | };
33 |
34 | #endif /* CertificateErrorDomain_h */
35 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestProtocol_h
8 | #define CertificateRequestProtocol_h
9 |
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | /**
15 | This is the protocol used for requesting and renewing certificates from Jamf Pro.
16 | */
17 | @protocol CertificateRequestProtocol
18 |
19 | /**
20 | This is the maximum number of steps in the progress of a certificate request.
21 | May be approximate until the actual call of -startNewCertificateRequest
22 | */
23 | @property (assign, readonly) NSUInteger maxNumberOfSteps;
24 |
25 | /**
26 | This will start a request to the Jamf Pro server for a new certificate.
27 | The delegate will be called with progress, errors, and the new identity.
28 | NOTE: Only one such request should be in progress at a given time for a single CertificateRequest object.
29 | */
30 | - (void)startNewCertificateRequest;
31 |
32 | /**
33 | Cancels the current request, if any. The completion handler WILL be called on the delegate.
34 | */
35 | - (void)cancelRequest;
36 |
37 | @end
38 |
39 | NS_ASSUME_NONNULL_END
40 |
41 | #endif /* CertificateRequestProtocol_h */
42 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #ifndef CertificateRequestWorkflow_h
8 | #define CertificateRequestWorkflow_h
9 |
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | /**
17 | This class is the main class that should be instantiated to make a certificate request.
18 | */
19 | NS_CLASS_AVAILABLE_IOS(10_0)
20 | @interface CertificateRequestWorkflow : CertificateRequestBase
21 |
22 | /**
23 | Create an object.
24 |
25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
26 | @return An initialized object; may be nil if memory is full
27 | */
28 | - (nullable instancetype)initWithDelegate:(id)delegate;
29 |
30 | /**
31 | Create an object with given settings instead of relying on Managed App Config. This is a testing method.
32 |
33 | @param delegate Your delegate that will be called as the certificate request workflow proceeds
34 | @param testSettings The settings that would otherwise be provided by Managed App Config.
35 | @return An initialized object; may be nil if memory is full
36 | */
37 | - (nullable instancetype)initWithDelegate:(id)delegate testSettings:(NSDictionary *)testSettings;
38 |
39 | /**
40 | Use this option to specify a custom timeout in seconds for individual network requests.
41 | Defaults to 30 seconds.
42 | */
43 | @property (assign) NSUInteger networkingTimeout;
44 |
45 | /**
46 | Use this option to specify a custom interval in seconds to poll for certificate creation.
47 | The first retrieval will happen after this interval, which means this also specifies the minimum
48 | amount of time required for the certificate request. Minimum value is one second.
49 | Defaults to 5 seconds.
50 | */
51 | @property (assign) NSUInteger pollingInterval;
52 |
53 | /**
54 | Use this option to specify an overall timeout in seconds to poll for certificate creation.
55 | After this much time, if the server has still not returned a certificate then the certificate request
56 | will fail with a timeout error.
57 | Defaults to 180 seconds.
58 | */
59 | @property (assign) NSUInteger pollingTimeout;
60 |
61 | @end
62 |
63 | NS_ASSUME_NONNULL_END
64 |
65 | #endif /* CertificateRequestWorkflow_h */
66 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h:
--------------------------------------------------------------------------------
1 | //
2 | // SPDX-License-Identifier: MIT
3 | // https://github.com/jamf/CertificateSDK
4 | //
5 | // Copyright 2024, Jamf
6 | //
7 | #import
8 |
9 | //! Project version number for CertificateSDK.
10 | FOUNDATION_EXPORT double CertificateSDKVersionNumber;
11 |
12 | //! Project version string for CertificateSDK.
13 | FOUNDATION_EXPORT const unsigned char CertificateSDKVersionString[];
14 |
15 |
16 | #import
17 | #import
18 | #import
19 |
20 | #import
21 | #import
22 | #import
23 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap:
--------------------------------------------------------------------------------
1 | framework module CertificateSDK {
2 | umbrella header "CertificateSDK.h"
3 | export *
4 |
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | files
6 |
7 | Headers/CertificateRequestBase.h
8 |
9 | hLjW9WyUJS+8jyVUmK1qoWpduqk=
10 |
11 | Headers/CertificateRequestDelegate.h
12 |
13 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ=
14 |
15 | Headers/CertificateRequestEmbeddedP12.h
16 |
17 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo=
18 |
19 | Headers/CertificateRequestErrorDomain.h
20 |
21 | 0tufHVLiYUxzA4jOkXxCA6DSSi4=
22 |
23 | Headers/CertificateRequestProtocol.h
24 |
25 | j4gMIOdnBKmA7QBIbZpPbbDo/88=
26 |
27 | Headers/CertificateRequestWorkflow.h
28 |
29 | qVckvekXlnjMDZ4JZkYtrKr1nO0=
30 |
31 | Headers/CertificateSDK.h
32 |
33 | mawIEG5HK+qAG8KcrxXRcf0DMJo=
34 |
35 | Info.plist
36 |
37 | n+VlnCTVs9HVPBlZ8bY2aBzcCUI=
38 |
39 | Modules/module.modulemap
40 |
41 | tClFj0ge1TQaXuYCRNTIZQgBu0s=
42 |
43 |
44 | files2
45 |
46 | Headers/CertificateRequestBase.h
47 |
48 | hash2
49 |
50 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc=
51 |
52 |
53 | Headers/CertificateRequestDelegate.h
54 |
55 | hash2
56 |
57 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k=
58 |
59 |
60 | Headers/CertificateRequestEmbeddedP12.h
61 |
62 | hash2
63 |
64 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA=
65 |
66 |
67 | Headers/CertificateRequestErrorDomain.h
68 |
69 | hash2
70 |
71 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48=
72 |
73 |
74 | Headers/CertificateRequestProtocol.h
75 |
76 | hash2
77 |
78 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI=
79 |
80 |
81 | Headers/CertificateRequestWorkflow.h
82 |
83 | hash2
84 |
85 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE=
86 |
87 |
88 | Headers/CertificateSDK.h
89 |
90 | hash2
91 |
92 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA=
93 |
94 |
95 | Modules/module.modulemap
96 |
97 | hash2
98 |
99 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck=
100 |
101 |
102 |
103 | rules
104 |
105 | ^.*
106 |
107 | ^.*\.lproj/
108 |
109 | optional
110 |
111 | weight
112 | 1000
113 |
114 | ^.*\.lproj/locversion.plist$
115 |
116 | omit
117 |
118 | weight
119 | 1100
120 |
121 | ^Base\.lproj/
122 |
123 | weight
124 | 1010
125 |
126 | ^version.plist$
127 |
128 |
129 | rules2
130 |
131 | .*\.dSYM($|/)
132 |
133 | weight
134 | 11
135 |
136 | ^(.*/)?\.DS_Store$
137 |
138 | omit
139 |
140 | weight
141 | 2000
142 |
143 | ^.*
144 |
145 | ^.*\.lproj/
146 |
147 | optional
148 |
149 | weight
150 | 1000
151 |
152 | ^.*\.lproj/locversion.plist$
153 |
154 | omit
155 |
156 | weight
157 | 1100
158 |
159 | ^Base\.lproj/
160 |
161 | weight
162 | 1010
163 |
164 | ^Info\.plist$
165 |
166 | omit
167 |
168 | weight
169 | 20
170 |
171 | ^PkgInfo$
172 |
173 | omit
174 |
175 | weight
176 | 20
177 |
178 | ^embedded\.provisionprofile$
179 |
180 | weight
181 | 20
182 |
183 | ^version\.plist$
184 |
185 | weight
186 | 20
187 |
188 |
189 |
190 |
191 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Jamf
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.9
2 | import PackageDescription
3 |
4 | let package = Package(
5 | name: "CertificateSDK",
6 | platforms: [
7 | .iOS(.v12),
8 | .visionOS(.v1)
9 | ],
10 | products: [
11 | .library(
12 | name: "CertificateSDK", targets: ["CertificateSDK"]
13 | )
14 | ],
15 | targets: [
16 | .binaryTarget(
17 | name: "CertificateSDK", path: "CertificateSDK.xcframework"
18 | )
19 | ]
20 | )
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Jamf Certificate SDK
2 |
3 | When the Jamf Certificate SDK is integrated with your iOS or visionOS app, it provides a secure process
4 | that allows the app to request a certificate from a certificate authority (CA) via Jamf Pro. Certificates
5 | can be used to establish identities that support certificate-based authentication to perform Single Sign-On
6 | (SSO) or other actions specific to your environment.
7 |
8 | See [Distributing an In-House App Developed with the Jamf Certificate SDK](https://learn.jamf.com/en-US/bundle/technical-paper-integrating-ad-cs-current/page/Distributing_an_In-House_App_Developed_with_the_Jamf_Certificate_SDK.html) for more details.
9 |
10 | --------
11 |
12 | ### Installation
13 |
14 | Jamf Certificate SDK is available through the [Swift Package Manager](https://swift.org/package-manager/).
15 |
16 | To install via the Swift Package Manager add the following line to your `Package.swift` file's `dependencies`:
17 |
18 | ```swift
19 | .package(url: "https://github.com/jamf/CertificateSDK.git", from: "2.0.0")
20 | ```
21 |
22 | --------
23 |
24 | #### Framework Architectures
25 |
26 | The included XCFramework ships with support for the iOS and visionOS simulators on Apple Silicon and
27 | Intel-based Mac computers, and iOS and visionOS devices using the arm64 architecture. This allows app
28 | developers to use the framework on actual iOS and visionOS devices and in the simulators while
29 | developing and testing their apps.
30 |
31 | --------
32 |
33 | ### Managed App Configuration Required Settings
34 |
35 | To ensure proper use of the SDK, the app is required to be distributed by Jamf Pro. During distribution,
36 | a managed app configuration can be specified that will let the SDK communicate with Jamf Pro and request
37 | the proper certificate. Here is a sample managed app configuration that can be used as a basis for your own app.
38 |
39 | *Note that you can add your own key/value pairs to the managed app configuration to configure other parts of your app.* Jamf's keys are all prefixed
40 | with `com.jamf.config.` so they will not clash with your own naming conventions for keys.
41 |
42 |
43 | com.jamf.config.jamfpro.invitation
44 | $MOBILEDEVICEAPPINVITE
45 | com.jamf.config.device.udid
46 | $MANAGEMENTID
47 | com.jamf.config.jamfpro.url
48 | https://the_jamf_pro_server_url_goes_here/
49 | com.jamf.config.certificate-request.pkiId
50 | 1
51 | com.jamf.config.certificate-request.template
52 | User2
53 | com.jamf.config.certificate-request.keySize
54 | 4096
55 | com.jamf.config.certificate-request.subject
56 | cn=something
57 | com.jamf.config.certificate-request.subjectAlternativeNames
58 |
59 |
60 | com.jamf.config.certificate-request.sanType
61 | rfc822Name
62 | com.jamf.config.certificate-request.sanValue
63 | somebody@example.com
64 |
65 |
66 | com.jamf.config.certificate-request.sanType
67 | userPrincipalName
68 | com.jamf.config.certificate-request.sanValue
69 | somebody@example.com
70 |
71 |
72 | com.jamf.config.certificate-request.signature
73 | $JAMF_SIGNATURE_com.jamf.config.certificate-request
74 |
75 |
76 | ###### MAC key discussion
77 |
78 | `com.jamf.config.device.udid`: The device identifier of the device the app is installed on. Starting with
79 | Jamf Pro 11.5.1, the value must be `$MANAGEMENTID` to support both company-owned and BYOD devices. In Jamf
80 | Pro 11.5.0 and earlier, the value must instead be `$UDID` and only company-owned devices are supported.
81 |
82 | `com.jamf.config.jamfpro.url`: The value should be filled in with your Jamf Pro Server's URL.
83 |
84 | The keys prefixed with `com.jamf.config.certificate-request` are used during certificate generation. They
85 | will be specific to your organization. You should confer with those responsible for Jamf Pro and your
86 | Certificate Authority to ensure the proper settings are configured for your app.
87 |
88 | * `pkiId`: (an integer but typed as string in the MAC) Jamf Pro ID of the PKI Integration/Certificate Authority to be used; find this in the Jamf Pro
89 | web UI at Settings > PKI Certificates > Your ADCS CA settings and then look in the URL bar for the number after "id=". You should have a URL something like "adcsSettings.html?id=3" and enter the number `3` in the AppConfig
90 | * `template`: (string) Certificate template name as defined in your CA.
91 | * `subject`: (string) Subject to include in the certificate signing request.
92 | * `keySize`: (integer) The number of bits used in cryptographic algorithm of the certificate. Must be one of `2048`, `4096` or `8192`; defaults to `2048` if not specified.
93 | * `subjectAlternativeNames`: (array) Available starting in Jamf Pro 11.17.0. An array of subject alternative name dictionaries.
94 | * `sanType`: (string) One of 'rfc822Name', 'dNSName', 'uniformResourceIdentifier', or 'userPrincipalName.'
95 | * `sanValue`: (string) Subject Alternative Name to include in the certificate signing request.
96 |
97 | With the `subject` and `sanValue` fields, variable substitution is available as discussed under [Payload Variables for Configuration Profiles](https://learn.jamf.com/en-US/bundle/jamf-pro-documentation-current/page/Mobile_Device_Configuration_Profiles.html#ariaid-title3).
98 |
99 | Jamf Pro 11.17.0 added the `keySize` and `subjectAlternativeNames` top level keys. Jamf Pro 11.16 and earlier do not support `keySize`, and the `sanType` and `sanValue` keys should be specified at the top level instead of within the `subjectAlternativeNames` array. See earlier versions of the CertificateSDK for details.
100 |
101 | --
102 |
103 | Additional reference documentation is available in
104 | [Integrating the Jamf Certificate SDK with Mobile Device Apps Deployed by Jamf Pro](https://learn.jamf.com/bundle/jamf-certificate-sdk/page/Overview.html).
105 |
--------------------------------------------------------------------------------
/sample-app-specfile.xml:
--------------------------------------------------------------------------------
1 |
2 | 1.0.0
3 | com.jamf.certificate-sdk.sample
4 |
5 |
6 |
7 | https://example.com/
8 |
9 |
10 |
11 |
12 | $MOBILEDEVICEAPPINVITE
13 |
14 |
15 |
16 |
17 | $MANAGEMENTID
18 |
19 |
20 |
21 |
22 | 3
23 |
24 |
25 |
26 |
27 | cn=something
28 |
29 |
30 |
31 |
32 |
33 | rfc822Name
34 |
35 |
36 |
37 |
38 |
39 | somebody@example.com
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | Jamf Certificate SDK
51 |
52 |
53 |
56 |
57 | URL of your Jamf Pro server
58 |
59 |
60 |
61 |
64 |
65 | A one time use code to connect to Jamf Pro's API.
66 |
67 |
68 |
69 |
72 |
73 | The device's UDID
74 |
75 |
76 |
77 |
80 |
81 | The id value of the PKI record to use in Jamf Pro
82 |
83 |
84 |
85 |
88 |
89 | The subject value for defining your cert. Likely will contain user/device variables.
90 |
91 |
92 |
93 |
96 |
97 | The type of the Subject Alternative Name
98 |
99 |
100 |
101 |
104 |
105 | The SAN in a format specified by the type. Likely will contain user/device variables.
106 |
107 |
108 |
109 |
112 |
113 | The name of the ADCS CA template to use (leave blank if no template is needed).
114 |
115 |
116 |
117 |
118 |
--------------------------------------------------------------------------------