Skip to content

Commit 4464a93

Browse files
committed
Merge branch 'feature/swift-ui' into develop
2 parents 5cb837b + 419f1f4 commit 4464a93

File tree

4 files changed

+157
-38
lines changed

4 files changed

+157
-38
lines changed

Package.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import PackageDescription
66
let package = Package(
77
name: "PassLibrary",
88
platforms: [
9-
.iOS(.v8)
9+
.iOS(.v9)
1010
],
1111
products: [
1212
.library(
@@ -17,9 +17,9 @@ let package = Package(
1717
targets: [
1818
.target(
1919
name: "PassLibrary",
20-
dependencies: [])
20+
dependencies: []),
2121
.testTarget(
2222
name: "PassLibraryTests",
23-
dependencies: ["PassLibrary"])
23+
dependencies: ["PassLibrary"]),
2424
]
2525
)

PassLibrary.xcodeproj/project.pbxproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
/* End PBXAggregateTarget section */
2222

2323
/* Begin PBXBuildFile section */
24+
6004D8E424C4A1FD00ACDCE0 /* AddPKPassView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6004D8E324C4A1FD00ACDCE0 /* AddPKPassView.swift */; };
2425
OBJ_23 /* Networker.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_9 /* Networker.swift */; };
2526
OBJ_24 /* PassLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* PassLibrary.swift */; };
2627
OBJ_31 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };
@@ -47,6 +48,7 @@
4748
/* End PBXContainerItemProxy section */
4849

4950
/* Begin PBXFileReference section */
51+
6004D8E324C4A1FD00ACDCE0 /* AddPKPassView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddPKPassView.swift; sourceTree = "<group>"; };
5052
OBJ_10 /* PassLibrary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PassLibrary.swift; sourceTree = "<group>"; };
5153
OBJ_13 /* PassLibraryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PassLibraryTests.swift; sourceTree = "<group>"; };
5254
OBJ_14 /* XCTestManifests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTestManifests.swift; sourceTree = "<group>"; };
@@ -125,6 +127,7 @@
125127
children = (
126128
OBJ_9 /* Networker.swift */,
127129
OBJ_10 /* PassLibrary.swift */,
130+
6004D8E324C4A1FD00ACDCE0 /* AddPKPassView.swift */,
128131
);
129132
name = PassLibrary;
130133
path = Sources/PassLibrary;
@@ -237,6 +240,7 @@
237240
files = (
238241
OBJ_23 /* Networker.swift in Sources */,
239242
OBJ_24 /* PassLibrary.swift in Sources */,
243+
6004D8E424C4A1FD00ACDCE0 /* AddPKPassView.swift in Sources */,
240244
);
241245
runOnlyForDeploymentPostprocessing = 0;
242246
};
@@ -283,7 +287,7 @@
283287
);
284288
HEADER_SEARCH_PATHS = "$(inherited)";
285289
INFOPLIST_FILE = PassLibrary.xcodeproj/PassLibrary_Info.plist;
286-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
290+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
287291
LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx";
288292
MACOSX_DEPLOYMENT_TARGET = 10.10;
289293
OTHER_CFLAGS = "$(inherited)";
@@ -311,7 +315,7 @@
311315
);
312316
HEADER_SEARCH_PATHS = "$(inherited)";
313317
INFOPLIST_FILE = PassLibrary.xcodeproj/PassLibrary_Info.plist;
314-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
318+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
315319
LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx";
316320
MACOSX_DEPLOYMENT_TARGET = 10.10;
317321
OTHER_CFLAGS = "$(inherited)";

README.md

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -125,42 +125,42 @@ import UIKit
125125
@objc(RNPassLibrary)
126126
class RNPassLibrary: NSObject {
127127

128-
private let passLibrary = PassLibrary()
128+
private let passLibrary = PassLibrary()
129129

130-
@objc
131-
func constantsToExport() -> [AnyHashable: Any]! {
132-
return ["name": "RNPassLibrary"]
133-
}
130+
@objc
131+
func constantsToExport() -> [AnyHashable: Any]! {
132+
return ["name": "RNPassLibrary"]
133+
}
134134

135-
@objc
136-
func getRemotePKPassAndPresentPKPassView(_ url: String,
137-
resolver resolve: @escaping RCTPromiseResolveBlock,
138-
rejecter reject: @escaping RCTPromiseRejectBlock) {
139-
self.passLibrary.getRemotePKPass(from: url) { (result: Result<Data, Error>) in
140-
switch result {
141-
case .failure(let failure):
142-
reject("error", failure.localizedDescription, NSError(domain: failure.localizedDescription, code: 400, userInfo: nil))
143-
case .success(let pkpassData):
144-
DispatchQueue.main.async {
145-
guard let keyWindow = UIApplication.shared.keyWindow else {
146-
reject("error", "Could not get key window", NSError(domain: "Could not get key window", code: 400, userInfo: nil))
147-
return
148-
}
149-
do {
150-
try self.passLibrary.presentAddPKPassViewController(window: keyWindow, pkpassData: pkpassData)
151-
resolve(true)
152-
} catch {
153-
reject("error", error.localizedDescription, NSError(domain: error.localizedDescription, code: 400, userInfo: nil))
154-
}
155-
}
156-
}
157-
}
158-
}
135+
@objc
136+
func getRemotePKPassAndPresentPKPassView(_ url: String,
137+
resolver resolve: @escaping RCTPromiseResolveBlock,
138+
rejecter reject: @escaping RCTPromiseRejectBlock) {
139+
self.passLibrary.getRemotePKPass(from: url) { (result: Result<Data, Error>) in
140+
switch result {
141+
case .failure(let failure):
142+
reject("error", failure.localizedDescription, NSError(domain: failure.localizedDescription, code: 400, userInfo: nil))
143+
case .success(let pkpassData):
144+
DispatchQueue.main.async {
145+
guard let keyWindow = UIApplication.shared.keyWindow else {
146+
reject("error", "Could not get key window", NSError(domain: "Could not get key window", code: 400, userInfo: nil))
147+
return
148+
}
149+
do {
150+
try self.passLibrary.presentAddPKPassViewController(window: keyWindow, pkpassData: pkpassData)
151+
resolve(true)
152+
} catch {
153+
reject("error", error.localizedDescription, NSError(domain: error.localizedDescription, code: 400, userInfo: nil))
154+
}
155+
}
156+
}
157+
}
158+
}
159159

160-
@objc
161-
static func requiresMainQueueSetup() -> Bool {
162-
return true
163-
}
160+
@objc
161+
static func requiresMainQueueSetup() -> Bool {
162+
return true
163+
}
164164

165165
}
166166
```
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
//
2+
// AddPKPassView.swift
3+
// PassLibrary
4+
//
5+
// Created by Kamaal Farah on 19/07/2020.
6+
//
7+
8+
import SwiftUI
9+
import PassKit
10+
11+
@available(iOS 13.0, *)
12+
public final class AddPKPassHandler: ObservableObject {
13+
@Published public var showAddPassView = false
14+
@Published public var pass: PKPass?
15+
@Published public var lastFailures: Error? {
16+
didSet {
17+
#if DEBUG
18+
if let lastFailures = self.lastFailures {
19+
print("AddPKPassHandler ERROR:", lastFailures)
20+
}
21+
#endif
22+
}
23+
}
24+
25+
private let networker = Networker()
26+
27+
public init() { }
28+
29+
public enum AddPKPassHandlerErrors: Error {
30+
case failedToUnwrap(message: String)
31+
}
32+
33+
public func getAndSetPKPass(from urlPath: String) {
34+
self.networker.getPKPass(from: urlPath) { (result: Result<Data, Error>) in
35+
switch result {
36+
case .failure(let error):
37+
self.lastFailures = error
38+
case .success(let data):
39+
var pass: PKPass?
40+
do {
41+
pass = try PKPass(data: data)
42+
} catch {
43+
self.lastFailures = error
44+
}
45+
guard pass != nil else {
46+
self.lastFailures = AddPKPassHandlerErrors.failedToUnwrap(message: "Failed to unwrap value of pass")
47+
return
48+
}
49+
DispatchQueue.main.async {
50+
self.pass = pass
51+
self.showAddPassView = true
52+
}
53+
}
54+
}
55+
}
56+
}
57+
58+
internal struct AddPKPassViewContent: UIViewControllerRepresentable {
59+
internal let passes: [PKPass]
60+
61+
internal init(passes: [PKPass]?) {
62+
self.passes = passes ?? []
63+
}
64+
65+
internal init(pass: PKPass?) {
66+
if let pass = pass {
67+
self.passes = [pass]
68+
} else {
69+
self.passes = []
70+
}
71+
}
72+
73+
func makeUIViewController(context: Context) -> UIViewControllerType {
74+
let pkAddPassViewController = PKAddPassesViewController(passes: self.passes)
75+
return pkAddPassViewController ?? PKAddPassesViewController()
76+
}
77+
78+
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }
79+
80+
typealias UIViewControllerType = PKAddPassesViewController
81+
}
82+
83+
@available(iOS 13.0, *)
84+
public struct AddPKPassView<Presenting>: View where Presenting: View {
85+
@Binding public var isShowing: Bool
86+
87+
public var presenting: () -> Presenting
88+
public var passes: [PKPass]?
89+
90+
public init(isShowing: Binding<Bool>, presenting: @escaping () -> Presenting, passes: [PKPass]?) {
91+
self._isShowing = isShowing
92+
self.presenting = presenting
93+
self.passes = passes
94+
}
95+
96+
public var body: some View {
97+
self.presenting()
98+
.sheet(isPresented: self.$isShowing) {
99+
ZStack {
100+
AddPKPassViewContent(passes: self.passes)
101+
}
102+
}
103+
}
104+
}
105+
106+
@available(iOS 13.0, *)
107+
public extension View {
108+
func addPKPassSheet(isShowing: Binding<Bool>, pass: PKPass? = nil) -> some View {
109+
var passes: [PKPass] = []
110+
if let pass = pass {
111+
passes.append(pass)
112+
}
113+
return AddPKPassView(isShowing: isShowing, presenting: { self }, passes: passes)
114+
}
115+
}

0 commit comments

Comments
 (0)