Skip to content

Commit 4761643

Browse files
committed
MacOS support for RxSwift subspec. Swift 4 migration.
1 parent 7d2d164 commit 4761643

15 files changed

+501
-65
lines changed

.swift-version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.2
1+
4.0

AppRouter.podspec

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Pod::Spec.new do |s|
33
s.name = "AppRouter"
4-
s.version = "4.0.2"
4+
s.version = "4.1.0"
55
s.summary = "UIViewController creation, navigation, utility methods for easy routing"
66

77
s.homepage = "https://github.com/MLSDev/AppRouter"
@@ -21,8 +21,8 @@ Pod::Spec.new do |s|
2121
end
2222

2323
s.subspec 'RxSwift' do |rxswift|
24-
rxswift.dependency 'AppRouter/Core'
25-
rxswift.dependency 'RxSwift', '~> 3.0'
24+
s.osx.deployment_target = "10.10"
25+
rxswift.dependency 'RxSwift', '~> 4.0'
2626
rxswift.source_files = 'Sources/RxSwift/*.swift'
2727
end
2828
end

AppRouter.xcodeproj/project.pbxproj

+169-30
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Scheme
3+
LastUpgradeVersion = "0910"
4+
version = "1.3">
5+
<BuildAction
6+
parallelizeBuildables = "YES"
7+
buildImplicitDependencies = "YES">
8+
<BuildActionEntries>
9+
<BuildActionEntry
10+
buildForTesting = "YES"
11+
buildForRunning = "YES"
12+
buildForProfiling = "YES"
13+
buildForArchiving = "YES"
14+
buildForAnalyzing = "YES">
15+
<BuildableReference
16+
BuildableIdentifier = "primary"
17+
BlueprintIdentifier = "C0D64FC11FB44E25003B6B89"
18+
BuildableName = "AppRouterRx.framework"
19+
BlueprintName = "AppRouterRx"
20+
ReferencedContainer = "container:AppRouter.xcodeproj">
21+
</BuildableReference>
22+
</BuildActionEntry>
23+
</BuildActionEntries>
24+
</BuildAction>
25+
<TestAction
26+
buildConfiguration = "Debug"
27+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29+
language = ""
30+
shouldUseLaunchSchemeArgsEnv = "YES">
31+
<Testables>
32+
</Testables>
33+
<AdditionalOptions>
34+
</AdditionalOptions>
35+
</TestAction>
36+
<LaunchAction
37+
buildConfiguration = "Debug"
38+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
39+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
40+
language = ""
41+
launchStyle = "0"
42+
useCustomWorkingDirectory = "NO"
43+
ignoresPersistentStateOnLaunch = "NO"
44+
debugDocumentVersioning = "YES"
45+
debugServiceExtension = "internal"
46+
allowLocationSimulation = "YES">
47+
<MacroExpansion>
48+
<BuildableReference
49+
BuildableIdentifier = "primary"
50+
BlueprintIdentifier = "C0D64FC11FB44E25003B6B89"
51+
BuildableName = "AppRouterRx.framework"
52+
BlueprintName = "AppRouterRx"
53+
ReferencedContainer = "container:AppRouter.xcodeproj">
54+
</BuildableReference>
55+
</MacroExpansion>
56+
<AdditionalOptions>
57+
</AdditionalOptions>
58+
</LaunchAction>
59+
<ProfileAction
60+
buildConfiguration = "Release"
61+
shouldUseLaunchSchemeArgsEnv = "YES"
62+
savedToolIdentifier = ""
63+
useCustomWorkingDirectory = "NO"
64+
debugDocumentVersioning = "YES">
65+
<MacroExpansion>
66+
<BuildableReference
67+
BuildableIdentifier = "primary"
68+
BlueprintIdentifier = "C0D64FC11FB44E25003B6B89"
69+
BuildableName = "AppRouterRx.framework"
70+
BlueprintName = "AppRouterRx"
71+
ReferencedContainer = "container:AppRouter.xcodeproj">
72+
</BuildableReference>
73+
</MacroExpansion>
74+
</ProfileAction>
75+
<AnalyzeAction
76+
buildConfiguration = "Debug">
77+
</AnalyzeAction>
78+
<ArchiveAction
79+
buildConfiguration = "Release"
80+
revealArchiveInOrganizer = "YES">
81+
</ArchiveAction>
82+
</Scheme>

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [4.1.0](https://github.com/MLSDev/AppRouter/releases/tag/4.1.0)
6+
7+
Swift 4 migration.
8+
MacOS support for RxSwift subspec
9+
RxSwift subspec does not include Core automatically to allow usage in Cocoa applications.
10+
11+
512
## [4.0.2](https://github.com/MLSDev/AppRouter/releases/tag/4.0.2)
613

714
Swift 3.2 migration.

Cartfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
github "ReactiveX/RxSwift" "rxswift4.0-swift4.0"
1+
github "ReactiveX/RxSwift"

Plists/AppRouter.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<key>CFBundlePackageType</key>
1616
<string>FMWK</string>
1717
<key>CFBundleShortVersionString</key>
18-
<string>4.0.2</string>
18+
<string>4.1.0</string>
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>

Plists/AppRouterRx.plist

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>CFBundleDevelopmentRegion</key>
6+
<string>en</string>
7+
<key>CFBundleExecutable</key>
8+
<string>$(EXECUTABLE_NAME)</string>
9+
<key>CFBundleIdentifier</key>
10+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11+
<key>CFBundleInfoDictionaryVersion</key>
12+
<string>6.0</string>
13+
<key>CFBundleName</key>
14+
<string>$(PRODUCT_NAME)</string>
15+
<key>CFBundlePackageType</key>
16+
<string>FMWK</string>
17+
<key>CFBundleShortVersionString</key>
18+
<string>4.0.2</string>
19+
<key>CFBundleSignature</key>
20+
<string>????</string>
21+
<key>CFBundleVersion</key>
22+
<string>$(CURRENT_PROJECT_VERSION)</string>
23+
<key>NSPrincipalClass</key>
24+
<string></string>
25+
</dict>
26+
</plist>

README.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ Extremely easy way to handle controller creation / presentation / navigation and
1111
## Requirements
1212

1313
- iOS 8.0+
14+
- macOS 10.10+ (RxSwift subspec only)
1415
- Xcode 9+
15-
- Swift 3.2
16+
- Swift 4
1617

1718
## Installation
1819

@@ -22,9 +23,11 @@ Extremely easy way to handle controller creation / presentation / navigation and
2223
pod 'AppRouter'
2324
```
2425

25-
RxSwift extension for AppRouter with lifeCircle observables:
26+
RxSwift extension for AppRouter with life cycle observables:
27+
**Warrning:** RxSwift subspec does not include `Core` anymore.
2628

2729
```ruby
30+
pod 'AppRouter'
2831
pod 'AppRouter/RxSwift'
2932
```
3033

Sources/Core/AppRouter+accessors.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ extension UIViewController : ARToppestControllerProvider {
4949
/// ARToppestControllerProvider implementation
5050
///
5151
/// - returns: presentedViewController
52-
open func toppestControllerFromCurrent() -> UIViewController? {
52+
@objc open func toppestControllerFromCurrent() -> UIViewController? {
5353
return self.presentedViewController
5454
}
5555
}

Sources/Core/AppRouter+navigations.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,10 @@ extension UINavigationController {
197197
fileprivate func _сoordinator(_ animated: Bool, completion: Func<Void, Void>?) {
198198
if let coordinator = transitionCoordinator , animated {
199199
coordinator.animate(alongsideTransition: nil) { _ in
200-
completion?()
200+
completion?(())
201201
}
202202
} else {
203-
completion?()
203+
completion?(())
204204
}
205205
}
206206
}

Sources/RxSwift/AppRouter+reactive.swift renamed to Sources/RxSwift/AppRouter+reactive_ios.swift

+27-23
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,44 @@
66
// Copyright © 2016 Artem Antihevich. All rights reserved.
77
//
88

9-
import Foundation
10-
import UIKit
11-
import RxSwift
9+
#if os(iOS) || os(tvOS)
10+
import UIKit
11+
#if !RX_NO_MODULE
12+
import RxSwift
13+
#endif
1214

1315
public extension Reactive where Base: UIViewController {
1416
/// Observe viewDidLoad calls on current instance
1517
public func onViewDidLoad() -> Observable<Void> {
16-
return ARViewControllerLifeCircleManager.instance.didLoad.filter{ [weak base] in $0 === base }.map{ _ in () }
18+
return ARViewControllerLifeCycleManager.instance.didLoad.filter{ [weak base] in $0 === base }.map{ _ in () }
1719
}
1820

1921
/// Observe viewWillAppear calls on current instance
2022
public func onViewWillAppear() -> Observable<Bool> {
21-
return ARViewControllerLifeCircleManager.instance.willAppear.filter{ [weak base] in $0.controller === base }.map{ $0.animated }
23+
return ARViewControllerLifeCycleManager.instance.willAppear.filter{ [weak base] in $0.controller === base }.map{ $0.animated }
2224
}
2325

2426
/// Observe viewDidAppear calls on current instance
2527
public func onViewDidAppear() -> Observable<Bool> {
26-
return ARViewControllerLifeCircleManager.instance.didAppear.filter{ [weak base] in $0.controller === base }.map{ $0.animated }
28+
return ARViewControllerLifeCycleManager.instance.didAppear.filter{ [weak base] in $0.controller === base }.map{ $0.animated }
2729
}
2830

2931
/// Observe viewWillDisappear calls on current instance
3032
public func onViewWillDisappear() -> Observable<Bool> {
31-
return ARViewControllerLifeCircleManager.instance.willDisappear.filter{ [weak base] in $0.controller === base }.map{ $0.animated }
33+
return ARViewControllerLifeCycleManager.instance.willDisappear.filter{ [weak base] in $0.controller === base }.map{ $0.animated }
3234
}
3335

3436
/// Observe viewDidDisappear calls on current instance
3537
public func onViewDidDisappear() -> Observable<Bool> {
36-
return ARViewControllerLifeCircleManager.instance.didDisappear.filter{ [weak base] in $0.controller === base }.map{ $0.animated }
38+
return ARViewControllerLifeCycleManager.instance.didDisappear.filter{ [weak base] in $0.controller === base }.map{ $0.animated }
3739
}
3840
}
3941

4042
public extension Reactive where Base: UIViewController {
4143
/// observe viewDidLoad calls on all instances of current type
4244
public static func onViewDidLoad() -> Observable<Base> {
4345
return Observable.create({ observer -> Disposable in
44-
return ARViewControllerLifeCircleManager.instance.didLoad.subscribe(onNext: { vc in
46+
return ARViewControllerLifeCycleManager.instance.didLoad.subscribe(onNext: { vc in
4547
if let required = vc as? Base {
4648
observer.onNext(required)
4749
}
@@ -52,7 +54,7 @@ public extension Reactive where Base: UIViewController {
5254
/// observe viewWillAppear calls on all instances of current type
5355
public static func onViewWillAppear() -> Observable<(controller: Base, animated: Bool)> {
5456
return Observable.create({ observer -> Disposable in
55-
return ARViewControllerLifeCircleManager.instance.willAppear.subscribe(onNext: { (vc, animated) in
57+
return ARViewControllerLifeCycleManager.instance.willAppear.subscribe(onNext: { (vc, animated) in
5658
if let required = vc as? Base {
5759
observer.onNext((required, animated))
5860
}
@@ -63,7 +65,7 @@ public extension Reactive where Base: UIViewController {
6365
/// observe viewDidAppear calls on all instances of current type
6466
public static func onViewDidAppear() -> Observable<(controller: Base, animated: Bool)> {
6567
return Observable.create({ observer -> Disposable in
66-
return ARViewControllerLifeCircleManager.instance.didAppear.subscribe(onNext: { (vc, animated) in
68+
return ARViewControllerLifeCycleManager.instance.didAppear.subscribe(onNext: { (vc, animated) in
6769
if let required = vc as? Base {
6870
observer.onNext((required, animated))
6971
}
@@ -74,7 +76,7 @@ public extension Reactive where Base: UIViewController {
7476
/// observe viewWillDisappear calls on all instances of current type
7577
public static func onViewWillDisappear() -> Observable<(controller: Base, animated: Bool)> {
7678
return Observable.create({ observer -> Disposable in
77-
return ARViewControllerLifeCircleManager.instance.willDisappear.subscribe(onNext: { (vc, animated) in
79+
return ARViewControllerLifeCycleManager.instance.willDisappear.subscribe(onNext: { (vc, animated) in
7880
if let required = vc as? Base {
7981
observer.onNext((required, animated))
8082
}
@@ -85,7 +87,7 @@ public extension Reactive where Base: UIViewController {
8587
/// observe viewDidDisappear calls on all instances of current type
8688
public static func onViewDidDisappear() -> Observable<(controller: Base, animated: Bool)> {
8789
return Observable.create({ observer -> Disposable in
88-
return ARViewControllerLifeCircleManager.instance.didDisappear.subscribe(onNext: { (vc, animated) in
90+
return ARViewControllerLifeCycleManager.instance.didDisappear.subscribe(onNext: { (vc, animated) in
8991
if let required = vc as? Base {
9092
observer.onNext((required, animated))
9193
}
@@ -94,17 +96,17 @@ public extension Reactive where Base: UIViewController {
9496
}
9597
}
9698

97-
private class ARViewControllerLifeCircleManager {
99+
private class ARViewControllerLifeCycleManager {
98100
private static var __once: () = {
99101
swapMethods(#selector(UIViewController.viewDidLoad), swizzled: #selector(UIViewController.ar_viewDidLoad))
100102
swapMethods(#selector(UIViewController.viewWillAppear(_:)), swizzled: #selector(UIViewController.ar_viewWillAppear(_:)))
101103
swapMethods(#selector(UIViewController.viewDidAppear(_:)), swizzled: #selector(UIViewController.ar_viewDidAppear(_:)))
102104
swapMethods(#selector(UIViewController.viewWillDisappear(_:)), swizzled: #selector(UIViewController.ar_viewWillDisappear(_:)))
103105
swapMethods(#selector(UIViewController.viewDidDisappear(_:)), swizzled: #selector(UIViewController.ar_viewDidDisappear(_:)))
104106
}()
105-
static let instance : ARViewControllerLifeCircleManager = {
107+
static let instance : ARViewControllerLifeCycleManager = {
106108
_ = __once
107-
return ARViewControllerLifeCircleManager()
109+
return ARViewControllerLifeCycleManager()
108110
}()
109111
fileprivate let didLoad = PublishSubject<UIViewController>()
110112
fileprivate let willAppear = PublishSubject<(controller: UIViewController,animated: Bool)>()
@@ -113,8 +115,8 @@ private class ARViewControllerLifeCircleManager {
113115
fileprivate let didDisappear = PublishSubject<(controller: UIViewController,animated: Bool)>()
114116

115117
fileprivate class func swapMethods(_ original: Selector, swizzled: Selector) {
116-
let originalMethod = class_getInstanceMethod(UIViewController.self, original)
117-
let swizzledMethod = class_getInstanceMethod(UIViewController.self, swizzled)
118+
guard let originalMethod = class_getInstanceMethod(UIViewController.self, original),
119+
let swizzledMethod = class_getInstanceMethod(UIViewController.self, swizzled) else { return }
118120
let didAddMethod = class_addMethod(UIViewController.self, original, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
119121
if didAddMethod { class_replaceMethod(UIViewController.self, swizzled, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) }
120122
else { method_exchangeImplementations(originalMethod, swizzledMethod) }
@@ -124,22 +126,24 @@ private class ARViewControllerLifeCircleManager {
124126
extension UIViewController {
125127
@objc fileprivate func ar_viewDidLoad() -> () {
126128
self.ar_viewDidLoad()
127-
ARViewControllerLifeCircleManager.instance.didLoad.onNext(self)
129+
ARViewControllerLifeCycleManager.instance.didLoad.onNext(self)
128130
}
129131
@objc fileprivate func ar_viewWillAppear(_ animated: Bool) -> () {
130132
self.ar_viewWillAppear(animated)
131-
ARViewControllerLifeCircleManager.instance.willAppear.onNext((self, animated))
133+
ARViewControllerLifeCycleManager.instance.willAppear.onNext((self, animated))
132134
}
133135
@objc fileprivate func ar_viewDidAppear(_ animated: Bool) -> () {
134136
self.ar_viewDidAppear(animated)
135-
ARViewControllerLifeCircleManager.instance.didAppear.onNext((self, animated: animated))
137+
ARViewControllerLifeCycleManager.instance.didAppear.onNext((self, animated: animated))
136138
}
137139
@objc fileprivate func ar_viewWillDisappear(_ animated: Bool) -> () {
138140
self.ar_viewWillDisappear(animated)
139-
ARViewControllerLifeCircleManager.instance.willDisappear.onNext((self, animated: animated))
141+
ARViewControllerLifeCycleManager.instance.willDisappear.onNext((self, animated: animated))
140142
}
141143
@objc fileprivate func ar_viewDidDisappear(_ animated: Bool) -> () {
142144
self.ar_viewDidDisappear(animated)
143-
ARViewControllerLifeCircleManager.instance.didDisappear.onNext((self, animated: animated))
145+
ARViewControllerLifeCycleManager.instance.didDisappear.onNext((self, animated: animated))
144146
}
145147
}
148+
149+
#endif

0 commit comments

Comments
 (0)