https://github.com/yusukehosonuma/userdefaultsbrowser
🔍 Browse and edit UserDefaults on your app
https://github.com/yusukehosonuma/userdefaultsbrowser
ios-app swift swiftui userdefaults
Last synced: 12 months ago
JSON representation
🔍 Browse and edit UserDefaults on your app
- Host: GitHub
- URL: https://github.com/yusukehosonuma/userdefaultsbrowser
- Owner: YusukeHosonuma
- License: mit
- Created: 2022-05-06T06:42:34.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2022-11-13T07:20:29.000Z (over 3 years ago)
- Last Synced: 2023-09-11T05:50:19.417Z (almost 3 years ago)
- Topics: ios-app, swift, swiftui, userdefaults
- Language: Swift
- Homepage: https://qiita.com/YusukeHosonuma/items/4051daa8b0de2e9d2552
- Size: 159 KB
- Stars: 28
- Watchers: 2
- Forks: 1
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# UserDefaults-Browser
Browse and edit [UserDefaults](https://developer.apple.com/documentation/foundation/userdefaults) on your app. (SwiftUI or UIKit)
| Browse | Edit (as JSON) | Edit (Date) | Export |
| -- | -- | -- | -- |
|
|
|
|
|
**Note:**
We recommend to use [SwiftUI-Simulator](https://github.com/YusukeHosonuma/SwiftUI-Simulator), if you use it in an app built with SwiftUI.
(This feature is also included)
## Supported Types
- [Property List Types](https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/PropertyList.html)
- [x] `Array`
- [x] `Dictionary`
- [x] `String`
- [x] `Date`
- [x] `Int`
- [x] `Float`
- [x] `Double`
- [x] `Bool`
- Other
- [x] `URL`
- [x] `UIImage` (Read-only)
- JSON encoded
- [x] `Data`
- [x] `String`
[AppGroups](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups) (`UserDefaults(suiteName: "group.xxx")`) is also supported, please see [Configurations](#Configurations).
## Quick Start
1. Add `https://github.com/YusukeHosonuma/UserDefaultsBrowser` in the Xcode or `Package.swift`:
```swift
let package = Package(
dependencies: [
.package(url: "https://github.com/YusukeHosonuma/UserDefaultsBrowser", from: "1.0.0"),
],
targets: [
.target(name: "", dependencies: [
"UserDefaultsBrowser",
]),
]
)
```
2. Setup launcher button.
**SwiftUI:** Surround the root view with `UserDefaultsBrowserContainer`.
```swift
import UserDefaultsBrowser
@main
struct ExampleApp: App {
var body: some Scene {
WindowGroup {
UserDefaultsBrowserContainer {
ContentView() // 💡 Your root view.
}
}
}
}
```
**UIKit:** Call `setupUserDefaultsBrowserLauncher` in `viewDidLoad` of your root ViewController.
```swift
import UserDefaultsBrowser
class ViewController: UIViewController { // 💡 Your root ViewController.
override func viewDidLoad() {
super.viewDidLoad()
UserDefaultsBrowser.setupUserDefaultsBrowserLauncher()
}
}
```
3. Tap launcher button at leading bottom.

## Configuration
Both SwiftUI and UIKit have the same options like follows.
```swift
UserDefaultsBrowserContainer(
suiteNames: ["group.xxx"], // AppGroups IDs
excludeKeys: { $0.hasPrefix("not-display-key") }, // Exclude keys
accentColor: .orange, // Your favorite color (`UIColor` type in UIKit-based API)
imageName: "wrench.and.screwdriver", // SFSymbols name
displayStyle: .fullScreen // `.sheet` or `.fullScreen`
)
```
## Add to some View or ViewController
For example, for tab-based applications, it is useful to have a tab for browsing.
### SwiftUI
```swift
var body: some View {
TabView {
...
UserDefaultsBrowserView()
.tabItem {
Label("Browser", systemImage: "externaldrive")
}
}
}
```
### UIKit
```swift
class TabItemViewController: UIViewController {
override func viewDidLoad() {
let vc = UserDefaultsBrowserViewController()
addChild(vc)
view.addSubview(vc.view)
vc.didMove(toParent: self)
vc.view.translatesAutoresizingMaskIntoConstraints = false
vc.view.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
vc.view.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
vc.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
vc.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
}
```
## Requirements
- iOS 14+
## Contributions
Issues and PRs are welcome, even for minor improvements and corrections.
## Author
Yusuke Hosonuma / [@tobi462](https://twitter.com/tobi462)