Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support hot reloading with Inject #1710

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Download and parse an author’s lists when viewing their profile. [#49](https://github.com/verse-pbc/issues/issues/49)
- Updated fastlane scripts to fix the TestFlight deployment pipeline. [#97](https://github.com/verse-pbc/issues/issues/97)
- Removed inactive accounts from Discover tab. [#94](https://github.com/verse-pbc/issues/issues/94)
- Added the Inject framework for hot reloading. [#1710](https://github.com/planetary-social/nos/pull/1710)

## [1.0.3] - 2024-12-04Z

Expand Down
4 changes: 4 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ For now `main` is the main branch and code improvements are made in topic branch

A maintainer will review your code and merge it when it has the required number of approvals.

## Hot Reloading

We make use of the [Inject](https://github.com/krzysztofzablocki/Inject) framework for hot reloading debug builds. To set up hot reloading, follow the [documentation](https://github.com/krzysztofzablocki/Inject?tab=readme-ov-file#individual-developer-setup-once-per-machine).
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe this documentation is too light, but I am kinda rushing to throw this PR out there. Maybe the reviewer can tell me if it's enough or document the steps they had to take.

For instance, the first thing their documentation says to do is add some linker flags which is already done. So at least that part is superfluous. It's been a while since I set this up so I don't remember what I did exactly.


## Dependency Management

We prefer to install dependencies using the Swift Package Manager.
Expand Down
26 changes: 26 additions & 0 deletions Nos.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,7 @@
C987F85429BA951E00B44E7A /* ClarityCity-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = C987F83129BA951E00B44E7A /* ClarityCity-Thin.otf */; };
C987F85529BA951E00B44E7A /* ClarityCity-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = C987F83129BA951E00B44E7A /* ClarityCity-Thin.otf */; };
C987F85B29BA9ED800B44E7A /* Font+Clarity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C987F85729BA981800B44E7A /* Font+Clarity.swift */; };
C9887D812D1EF3C400CF9101 /* Inject in Frameworks */ = {isa = PBXBuildFile; productRef = C98905A12CD3B8CF00C17EE0 /* Inject */; };
C98A32272A05795E00E3FA13 /* Task+Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98A32262A05795E00E3FA13 /* Task+Timeout.swift */; };
C98A32282A05795E00E3FA13 /* Task+Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98A32262A05795E00E3FA13 /* Task+Timeout.swift */; };
C98B8B4029FBF83B009789C8 /* NotificationCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98B8B3F29FBF83B009789C8 /* NotificationCard.swift */; };
Expand Down Expand Up @@ -1052,6 +1053,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C9887D812D1EF3C400CF9101 /* Inject in Frameworks */,
C9DEC068298965270078B43A /* Starscream in Frameworks */,
C9FD35132BCED5A6008F8D95 /* NostrSDK in Frameworks */,
C9B71DC02A8E9BAD0031ED9F /* SentrySwiftUI in Frameworks */,
Expand Down Expand Up @@ -2101,6 +2103,7 @@
C9FD35122BCED5A6008F8D95 /* NostrSDK */,
03C49ABF2C938A9C00502321 /* SwiftSoup */,
039389222CA4985C00698978 /* SDWebImageWebPCoder */,
C98905A12CD3B8CF00C17EE0 /* Inject */,
);
productName = Nos;
productReference = C9DEBFCE298941000078B43A /* Nos.app */;
Expand Down Expand Up @@ -2197,6 +2200,7 @@
C9FD35112BCED5A6008F8D95 /* XCRemoteSwiftPackageReference "nostr-sdk-ios" */,
03C49ABE2C938A9C00502321 /* XCRemoteSwiftPackageReference "SwiftSoup" */,
039389212CA4985C00698978 /* XCRemoteSwiftPackageReference "SDWebImageWebPCoder" */,
C98905A02CD3B8CF00C17EE0 /* XCRemoteSwiftPackageReference "Inject" */,
);
productRefGroup = C9DEBFCF298941000078B43A /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -2919,6 +2923,7 @@
MACOSX_DEPLOYMENT_TARGET = 13.3;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
OTHER_LDFLAGS = "";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
Expand Down Expand Up @@ -3089,6 +3094,7 @@
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
Expand Down Expand Up @@ -3139,6 +3145,11 @@
LOCALIZED_STRING_SWIFTUI_SUPPORT = NO;
MACOSX_DEPLOYMENT_TARGET = 13.3;
MARKETING_VERSION = 1.0.4;
OTHER_LDFLAGS = "";
"OTHER_LDFLAGS[sdk=iphonesimulator*]" = (
"-Xlinker",
"-interposable",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.verse.Nos-dev";
PRODUCT_MODULE_NAME = Nos;
PRODUCT_NAME = "$(TARGET_NAME) Dev";
Expand Down Expand Up @@ -3306,6 +3317,7 @@
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
Expand Down Expand Up @@ -3364,6 +3376,7 @@
MACOSX_DEPLOYMENT_TARGET = 13.3;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
OTHER_LDFLAGS = "";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
Expand Down Expand Up @@ -3661,6 +3674,14 @@
minimumVersion = 1.0.0;
};
};
C98905A02CD3B8CF00C17EE0 /* XCRemoteSwiftPackageReference "Inject" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/krzysztofzablocki/Inject.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.5.2;
};
};
C99DBF7C2A9E81CF00F7068F /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/SDWebImage/SDWebImageSwiftUI";
Expand Down Expand Up @@ -3812,6 +3833,11 @@
package = C96CB98A2A6040C500498C4E /* XCRemoteSwiftPackageReference "swift-collections" */;
productName = DequeModule;
};
C98905A12CD3B8CF00C17EE0 /* Inject */ = {
isa = XCSwiftPackageProductDependency;
package = C98905A02CD3B8CF00C17EE0 /* XCRemoteSwiftPackageReference "Inject" */;
productName = Inject;
};
C99DBF7D2A9E81CF00F7068F /* SDWebImageSwiftUI */ = {
isa = XCSwiftPackageProductDependency;
package = C99DBF7C2A9E81CF00F7068F /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"originHash" : "f8bae06dbeb84f5992ca8659ee3a2a75550fe8b31994d37a658183a21f1c8131",
"originHash" : "62d037ae150ed2e6e150f06b42119c5158134318243e742971b3ccfa3a3a5323",
"pins" : [
{
"identity" : "bech32",
Expand Down Expand Up @@ -37,6 +37,15 @@
"version" : "1.8.2"
}
},
{
"identity" : "inject",
"kind" : "remoteSourceControl",
"location" : "https://github.com/krzysztofzablocki/Inject.git",
"state" : {
"revision" : "728c56639ecb3df441d51d5bc6747329afabcfc9",
"version" : "1.5.2"
}
},
{
"identity" : "libwebp-xcode",
"kind" : "remoteSourceControl",
Expand Down
7 changes: 7 additions & 0 deletions Nos/NosApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import SwiftUI
import Logger
import Dependencies
import TipKit
import Inject

@main
struct NosApp: App {
Expand All @@ -15,6 +16,7 @@ struct NosApp: App {
private let appController = AppController()
@Environment(\.scenePhase) private var scenePhase
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@ObserveInjection var inject

init() {
_ = crashReporting // force crash reporting init as early as possible
Expand All @@ -24,6 +26,11 @@ struct NosApp: App {
UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = .systemBlue
persistenceController.scheduleBackgroundCleanupTask()
try? Tips.configure()

#if DEBUG
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
InjectConfiguration.animation = .interactiveSpring()
#endif
}

var body: some Scene {
Expand Down
3 changes: 3 additions & 0 deletions Nos/Views/Home/HomeFeedView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import CoreData
import Combine
import Dependencies
import TipKit
import Inject

struct HomeFeedView: View {

@Environment(\.managedObjectContext) private var viewContext
@EnvironmentObject private var router: Router
@ObservationIgnored @Dependency(\.analytics) private var analytics
@ObserveInjection var inject

@State private var refreshController = RefreshController(lastRefreshDate: Date.now + Self.staticLoadTime)
@State private var isVisible = false
Expand Down Expand Up @@ -164,6 +166,7 @@ struct HomeFeedView: View {
GoToFeedTip.viewedFeed.sendDonation()
}
}
.enableInjection()
}
}

Expand Down
3 changes: 3 additions & 0 deletions Nos/Views/Home/HomeTab.swift
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
import SwiftUI
import Dependencies
import Inject

struct HomeTab: View {

@ObservedObject var user: Author

@EnvironmentObject private var router: Router
@ObserveInjection var inject

var body: some View {
NosNavigationStack(path: $router.homeFeedPath) {
HomeFeedView(user: user)
}
.enableInjection()
}
}

Expand Down
3 changes: 3 additions & 0 deletions Nos/Views/SideMenu/SideMenuContent.swift
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import SwiftUI
import MessageUI
import Dependencies
import Inject

struct SideMenuContent: View {

@EnvironmentObject private var router: Router
@Environment(CurrentUser.self) private var currentUser
@Dependency(\.analytics) private var analytics
@ObserveInjection var inject

@State private var isShowingReportABugMailView = false
@State private var shareNosPressed = false
Expand Down Expand Up @@ -118,6 +120,7 @@ struct SideMenuContent: View {
ProfileEditView(author: destination.profile)
}
}
.enableInjection()
}
}

Expand Down
Loading