Showing preview only (759K chars total). Download the full file or copy to clipboard to get everything.
Repository: Finb/Bark
Branch: master
Commit: 5b2b2112570f
Files: 257
Total size: 699.2 KB
Directory structure:
gitextract_lx2udhx1/
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ ├── deploy-docs.yaml
│ ├── testflight.yaml
│ └── tests.yaml
├── .gitignore
├── Bark/
│ ├── AppDelegate+Realm.swift
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Colors/
│ │ │ ├── Contents.json
│ │ │ ├── background.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── background_seconday.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── black.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── blue_base.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── blue_darken1.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── blue_darken5.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── darkText_primary.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── darkText_secondary.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_base.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_darken1.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_darken2.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_darken3.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_darken4.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten1.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten2.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten3.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten4.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten5.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── lightBlue_darken3.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── notification_copy_color.colorset/
│ │ │ │ └── Contents.json
│ │ │ └── white.colorset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── back.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_check_circle_outline_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_close_white_48pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_delete_outline_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_file_copy_white_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_filter_drama_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_folder_open_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_gite_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_http_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_https_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_keyboard_arrow_down_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_manage_accounts_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_qr_code_scanner_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_radio_button_unchecked_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_remove_black_20pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_wifi_black_20pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_wifi_off_black_20pt.imageset/
│ │ │ └── Contents.json
│ │ ├── copyTest.imageset/
│ │ │ └── Contents.json
│ │ ├── criticalAlert.imageset/
│ │ │ └── Contents.json
│ │ ├── group.imageset/
│ │ │ └── Contents.json
│ │ ├── group_collapse.imageset/
│ │ │ └── Contents.json
│ │ ├── group_expand.imageset/
│ │ │ └── Contents.json
│ │ ├── icon.imageset/
│ │ │ └── Contents.json
│ │ ├── keyboard_arrow_right_symbol.symbolset/
│ │ │ └── Contents.json
│ │ ├── music_note-music_note_symbol.symbolset/
│ │ │ └── Contents.json
│ │ ├── offline.imageset/
│ │ │ └── Contents.json
│ │ ├── online.imageset/
│ │ │ └── Contents.json
│ │ └── warning.imageset/
│ │ └── Contents.json
│ ├── Bark.entitlements
│ ├── Base.lproj/
│ │ └── LaunchScreen.storyboard
│ ├── Info.plist
│ ├── Intents/
│ │ ├── OptionsProvider.swift
│ │ ├── PushResponse.swift
│ │ ├── PushToCurrentIntent.swift
│ │ └── PushToOtherIntent.swift
│ └── Localizable.xcstrings
├── Bark.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ ├── Bark.xcscheme
│ ├── NotificationContentExtension.xcscheme
│ └── NotificationServiceExtension.xcscheme
├── Bark.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ ├── IDEWorkspaceChecks.plist
│ └── swiftpm/
│ └── Package.resolved
├── BarkTests/
│ ├── BarkTests.swift
│ ├── HomeViewModelTests.swift
│ ├── Info.plist
│ └── MessageDeleteTimeRangeTest.swift
├── CLAUDE.md
├── Common/
│ ├── ArchiveSettingManager.swift
│ ├── ArchiveSettingRelay.swift
│ ├── BKColor.swift
│ ├── BarkSettings.swift
│ ├── Client.swift
│ ├── CryptoSettingManager.swift
│ ├── CryptoSettingRelay.swift
│ ├── Date+Extension.swift
│ ├── Defines.swift
│ ├── Error+Extension.swift
│ ├── GroupMuteSettingManager.swift
│ ├── MJRefresh+Rx.swift
│ ├── MarkdownParser.swift
│ ├── Moya/
│ │ ├── BarkApi.swift
│ │ ├── BarkTargetType.swift
│ │ └── Observable+Extension.swift
│ ├── Operators.swift
│ ├── RealmConfiguration.swift
│ ├── Reusable.swift
│ ├── ServerManager.swift
│ ├── SharedDefines.swift
│ ├── String+Extension.swift
│ ├── UIColor+Extension.swift
│ ├── UIFont+Extension.swift
│ └── ViewModelType.swift
├── Controller/
│ ├── BarkNavigationController.swift
│ ├── BarkSFSafariViewController.swift
│ ├── BarkSplitViewController.swift
│ ├── BarkTabBarController.swift
│ ├── BaseViewController.swift
│ ├── CryptoSettingController.swift
│ ├── CryptoSettingViewModel.swift
│ ├── HomeViewController.swift
│ ├── HomeViewModel.swift
│ ├── MessageListViewController.swift
│ ├── MessageListViewModel.swift
│ ├── MessageSettingsViewController.swift
│ ├── MessageSettingsViewModel.swift
│ ├── NewServerViewController.swift
│ ├── NewServerViewModel.swift
│ ├── QRScannerViewController.swift
│ ├── SectionViewController-iPad.swift
│ ├── SectionViewModel-iPad.swift
│ ├── ServerListViewController.swift
│ ├── ServerListViewModel.swift
│ ├── SoundsViewController.swift
│ └── SoundsViewModel.swift
├── Gemfile
├── LICENSE
├── Model/
│ ├── Algorithm.swift
│ ├── Message.swift
│ ├── MessageDeleteTimeRange.swift
│ ├── MessageItemModel.swift
│ ├── MessageSection.swift
│ ├── Object+Dictionary.swift
│ └── PreviewModel.swift
├── NotificationServiceExtension/
│ ├── Info.plist
│ ├── NotificationService.swift
│ ├── NotificationServiceExtension.entitlements
│ └── Processor/
│ ├── ArchiveProcessor.swift
│ ├── AutoCopyProcessor.swift
│ ├── BadgeProcessor.swift
│ ├── CallProcessor.swift
│ ├── CiphertextProcessor.swift
│ ├── IconProcessor.swift
│ ├── ImageDownloader.swift
│ ├── ImageProcessor.swift
│ ├── LevelProcessor.swift
│ ├── MarkdownProcessor.swift
│ ├── MuteProcessor.swift
│ └── NotificationContentProcessor.swift
├── Podfile
├── README.md
├── README.zh.md
├── Sounds/
│ ├── alarm.caf
│ ├── anticipate.caf
│ ├── bell.caf
│ ├── birdsong.caf
│ ├── bloom.caf
│ ├── calypso.caf
│ ├── chime.caf
│ ├── choo.caf
│ ├── descent.caf
│ ├── electronic.caf
│ ├── fanfare.caf
│ ├── glass.caf
│ ├── gotosleep.caf
│ ├── healthnotification.caf
│ ├── horn.caf
│ ├── ladder.caf
│ ├── mailsent.caf
│ ├── minuet.caf
│ ├── multiwayinvitation.caf
│ ├── newmail.caf
│ ├── newsflash.caf
│ ├── noir.caf
│ ├── paymentsuccess.caf
│ ├── shake.caf
│ ├── sherwoodforest.caf
│ ├── silence.caf
│ ├── spell.caf
│ ├── suspense.caf
│ ├── telegraph.caf
│ ├── tiptoes.caf
│ ├── typewriters.caf
│ └── update.caf
├── View/
│ ├── AddSoundCell.swift
│ ├── ArchiveSettingCell.swift
│ ├── ArchiveSettingCellViewModel.swift
│ ├── BKButton.swift
│ ├── BKDropDownCell.swift
│ ├── BKDropDownCell.xib
│ ├── BKLabel.swift
│ ├── BaseTableViewCell.swift
│ ├── BorderTextField.swift
│ ├── DonateCell.swift
│ ├── DropBoxView.swift
│ ├── GesturePassTextView.swift
│ ├── GradientButton.swift
│ ├── HUD.swift
│ ├── InsetView.swift
│ ├── LabelCell.swift
│ ├── MessageList/
│ │ ├── CustomTapTextView.swift
│ │ ├── MessageGroupHeaderView.swift
│ │ ├── MessageGroupMoreView.swift
│ │ ├── MessageItemView.swift
│ │ ├── MessageTableViewCell.swift
│ │ └── ShowLessAndClearView.swift
│ ├── MessageSettingFooter.swift
│ ├── MutableTextCell.swift
│ ├── MutableTextCellViewModel.swift
│ ├── PreviewCardCell.swift
│ ├── PreviewCardCellViewModel.swift
│ ├── ServerListTableViewCell.swift
│ ├── ServerListTableViewCellViewModel.swift
│ ├── SettingSectionHeader.swift
│ ├── SoundCell.swift
│ ├── SoundCellViewModel.swift
│ ├── SpacerCell.swift
│ ├── TextCell.swift
│ └── UINavigationItem+Extension.swift
├── check_unused_translations.py
├── docs/
│ ├── .nojekyll
│ ├── CNAME
│ ├── README.md
│ ├── _coverpage.md
│ ├── _navbar.md
│ ├── _sidebar.md
│ ├── batch.md
│ ├── build.md
│ ├── cert.md
│ ├── deploy.md
│ ├── en-us/
│ │ ├── README.md
│ │ ├── _coverpage.md
│ │ ├── _navbar.md
│ │ ├── _sidebar.md
│ │ ├── batch.md
│ │ ├── build.md
│ │ ├── cert.md
│ │ ├── deploy.md
│ │ ├── encryption.md
│ │ ├── faq.md
│ │ ├── privacy.md
│ │ └── tutorial.md
│ ├── encryption.md
│ ├── faq.md
│ ├── index.html
│ ├── privacy.md
│ └── tutorial.md
├── fastlane/
│ ├── Appfile
│ ├── Fastfile
│ └── Matchfile
└── notificationContentExtension/
├── Base.lproj/
│ └── MainInterface.storyboard
├── Info.plist
├── NotificationContentExtension.entitlements
├── NotificationViewController.swift
└── UNNotificationContent+Extension.swift
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: [Finb]
================================================
FILE: .github/workflows/deploy-docs.yaml
================================================
name: Deploy Docs to Cloudflare Pages
on:
push:
branches:
- master
paths:
- 'docs/**'
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Deploy to Cloudflare Pages
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy docs --branch=main --project-name=bark-docs
================================================
FILE: .github/workflows/testflight.yaml
================================================
name: Deploy to App Store
on:
workflow_dispatch:
inputs:
storeVersionNumber:
description: 'Store Version Number'
required: true
default: ""
buildNumber:
description: 'Build Number'
required: true
default: ""
jobs:
deploy:
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Select Xcode Version
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: 'latest-stable'
- name: Setup ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7.2
bundler-cache: true
- uses: actions/cache@v4
id: pods-cache
with:
path: Pods
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-
- name: Install Pods
run: pod install
- name: Build & Distribute to App Store
run: |
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
bundle exec fastlane beta store_version_number:${{ github.event.inputs.storeVersionNumber }} build_number:${{ github.event.inputs.buildNumber }}
env:
APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }}
APP_STORE_CONNECT_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_KEY_CONTENT }}
BARK_KEY: ${{ secrets.BARK_KEY }}
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
- name: Archive artifacts
uses: actions/upload-artifact@v4
with:
name: dSYM
path: Bark.app.dSYM.zip
================================================
FILE: .github/workflows/tests.yaml
================================================
name: Tests
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Select Xcode Version
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: 'latest-stable'
- name: Setup ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7.2
bundler-cache: true
- uses: actions/cache@v4
id: pods-cache
with:
path: Pods
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-
- name: Install Pods
run: pod install
- name: Run Tests
run: |
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
bundle exec fastlane tests
================================================
FILE: .gitignore
================================================
*.mode*v*
*.pbxuser
*.xccheckout
#*.xcbkptlist
#*.xcscheme
#*.xcworkspacedata
*.xcuserstate
build/
Pods/
.DS_Store
._.*
xcuserdata
buildServer.json
================================================
FILE: Bark/AppDelegate+Realm.swift
================================================
//
// AppDelegate+Realm.swift
// Bark
//
// Created by huangfeng on 12/18/25.
// Copyright © 2025 Fin. All rights reserved.
//
import UIKit
extension AppDelegate {
/*
之前数据库是放在App Groups 共享
但由于Realm无法解决 0xdead10cc 闪退问题
因此改为在主APP中存放数据库文件
Notification Service Extension 使用 plist 文件保存消息,供主APP读取存放到数据库中
*/
func setupRealm() {
// 先执行数据库迁移
migrateRealmDatabase()
// Tell Realm to use this new configuration object for the default Realm
Realm.Configuration.defaultConfiguration = kRealmDefaultConfiguration
}
func migrateRealmDatabase() {
// 检查是否已经迁移过
if UserDefaults.standard.bool(forKey: "hasRealmMigrated") {
return
}
let fileManager = FileManager.default
guard let oldGroupUrl = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.bark"),
let newDocUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first
else {
return
}
let oldRealmUrl = oldGroupUrl.appendingPathComponent("bark.realm")
let newRealmUrl = newDocUrl.appendingPathComponent("bark.realm")
// 检查旧文件是否存在
guard fileManager.fileExists(atPath: oldRealmUrl.path) else {
// 旧文件不存在,标记为已迁移
UserDefaults.standard.set(true, forKey: "hasRealmMigrated")
return
}
do {
// 复制主数据库文件
try fileManager.copyItem(at: oldRealmUrl, to: newRealmUrl)
// 复制相关文件
let relatedFiles = ["bark.realm.lock", "bark.realm.management", "bark.realm.note"]
for file in relatedFiles {
let oldUrl = oldGroupUrl.appendingPathComponent(file)
let newUrl = newDocUrl.appendingPathComponent(file)
if fileManager.fileExists(atPath: oldUrl.path) {
try? fileManager.copyItem(at: oldUrl, to: newUrl)
}
}
// 删除旧文件
try fileManager.removeItem(at: oldRealmUrl)
for file in relatedFiles {
let oldUrl = oldGroupUrl.appendingPathComponent(file)
try? fileManager.removeItem(at: oldUrl)
}
// 标记为已迁移
UserDefaults.standard.set(true, forKey: "hasRealmMigrated")
} catch {
// 迁移失败,弹出提示
DispatchQueue.main.async {
let alert = UIAlertController(
title: "Migration Failed",
message: "Failed to migrate database file. Please contact support.",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "OK", style: .default))
self.window?.rootViewController?.present(alert, animated: true)
}
}
}
// 处理 Notification Service Extension 保存的待处理消息, 将其存入 Realm 数据库
func processPendingMessages() {
guard let groupUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.bark") else {
return
}
let pendingMessagesDir = groupUrl.appendingPathComponent("pending_messages")
// 检查目录是否存在
guard FileManager.default.fileExists(atPath: pendingMessagesDir.path) else {
return
}
// 获取所有 plist 文件
guard let fileUrls = try? FileManager.default.contentsOfDirectory(
at: pendingMessagesDir,
includingPropertiesForKeys: nil,
options: [.skipsHiddenFiles]
) else {
return
}
let plistFiles = fileUrls.filter { $0.pathExtension == "plist" }
guard !plistFiles.isEmpty else {
return
}
// 获取 Realm 实例
guard let realm = try? Realm() else {
return
}
// 批量处理消息
var messagesToAdd: [Message] = []
var urlsToDelete: [URL] = []
// 先读取所有 plist 文件
for plistUrl in plistFiles {
guard let dict = NSDictionary(contentsOf: plistUrl) as? [String: Any] else {
continue
}
let message = Message(dict: dict)
messagesToAdd.append(message)
urlsToDelete.append(plistUrl)
}
// 批量写入 Realm
do {
try realm.write {
for message in messagesToAdd {
realm.add(message, update: .all)
}
}
} catch {
// 一般不会失败,真失败了算你小子运气差
}
// 无论成功或失败,都删除已处理的 plist 文件
for plistUrl in urlsToDelete {
try? FileManager.default.removeItem(at: plistUrl)
}
}
}
================================================
FILE: Bark/AppDelegate.swift
================================================
//
// AppDelegate.swift
// Bark
//
// Created by huangfeng on 2018/3/7.
// Copyright © 2018年 Fin. All rights reserved.
//
import IQKeyboardManagerSwift
import IQKeyboardToolbarManager
import SVProgressHUD
import SwiftyStoreKit
import UIKit
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.backgroundColor = UIColor.black
// 必须在应用一开始就配置,否则应用可能提前在配置之前试用了 Realm() ,则会创建两个独立数据库。
setupRealm()
SVProgressHUD.setMinimumDismissTimeInterval(1.5)
IQKeyboardManager.shared.isEnabled = true
IQKeyboardToolbarManager.shared.isEnabled = true
if #available(iOS 14, *), UIDevice.current.userInterfaceIdiom == .pad {
let splitViewController = BarkSplitViewController(style: .doubleColumn)
self.window?.rootViewController = BarkSnackbarController(rootViewController: splitViewController)
} else {
let tabBarController = BarkTabBarController()
self.window?.rootViewController = BarkSnackbarController(
rootViewController: tabBarController
)
}
// 需先配置好 tabBarController 的 viewControllers,显示时会默认显示上次打开的页面
self.window?.makeKeyAndVisible()
// 注册 Darwin Notification 监听
let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()
CFNotificationCenterAddObserver(
notificationCenter,
Unmanaged.passUnretained(self).toOpaque(),
{ _, observer, _, _, _ in
guard let observer = observer else { return }
let appDelegate = Unmanaged<AppDelegate>.fromOpaque(observer).takeUnretainedValue()
DispatchQueue.main.async {
appDelegate.processPendingMessages()
}
},
"com.bark.newmessage" as CFString,
nil,
.deliverImmediately
)
// 处理可能在启动前积累的消息
processPendingMessages()
UNUserNotificationCenter.current().delegate = self
var actions = [
UNNotificationAction(identifier: "copy", title: "Copy2".localized, options: UNNotificationActionOptions.foreground)
]
if #available(iOSApplicationExtension 15.0, *) {
actions.append(UNNotificationAction(identifier: "mute", title: "muteGroup1Hour".localized, options: UNNotificationActionOptions.foreground))
}
UNUserNotificationCenter.current().setNotificationCategories([
// customDismissAction 会在 clear 推送时,调起APP,这时可以顺便更新下 DeviceToken,防止过期。
UNNotificationCategory(identifier: "myNotificationCategory", actions: actions, intentIdentifiers: [], options: .customDismissAction)
])
UNUserNotificationCenter.current().getNotificationSettings { settings in
dispatch_sync_safely_main_queue {
if settings.authorizationStatus == .authorized {
Client.shared.registerForRemoteNotifications()
}
}
}
// 调整返回按钮样式
let bar = UINavigationBar.appearance(whenContainedInInstancesOf: [BarkNavigationController.self])
bar.backIndicatorImage = UIImage(named: "back")
bar.backIndicatorTransitionMaskImage = UIImage(named: "back")
bar.tintColor = BKColor.grey.darken4
// 内购
SwiftyStoreKit.completeTransactions { _ in }
return true
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print(error)
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let deviceTokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
Client.shared.deviceToken.accept(deviceTokenString)
// 注册设备
ServerManager.shared.syncAllServers()
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
guard response.actionIdentifier != UNNotificationDismissActionIdentifier else {
// clear 推送时,不要弹出提示框
return
}
notificatonHandler(userInfo: response.notification.request.content.userInfo)
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
guard let delete = userInfo["delete"] as? String, delete == "1", let id = userInfo["id"] as? String else {
completionHandler(.noData)
return
}
// 删除通知中心推送
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [id])
// 删除历史记录
if let realm = try? Realm(),
let message = realm.objects(Message.self).filter("id == %@", id).first
{
try? realm.write {
realm.delete(message)
}
}
completionHandler(.newData)
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
return .alert
}
private func notificatonHandler(userInfo: [AnyHashable: Any]) {
let action = userInfo["action"] as? String
if action == "none" {
return
}
// 如果有 URL 直接打开
if let url = try? (userInfo["url"] as? String)?.asURL() {
Client.shared.openUrl(url: url)
return
}
if action == "alert" {
alertNotification(userInfo: userInfo)
}
// 跳转到消息列表tab
Client.shared.currentTabPage = .messageHistory
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// 设置 -1 可以清除应用角标,但不清除通知中心的推送
// 设置 0 会将通知中心的所有推送一起清空掉
UIApplication.shared.applicationIconBadgeNumber = -1
// 处理待处理的消息
processPendingMessages()
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
if url.scheme?.lowercased() == "bark" && url.host?.lowercased() == "addserver" {
// 提取参数
let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems
let address = queryItems?.first(where: { $0.name == "address" })?.value
// 处理添加服务器的逻辑
if let serverAddress = try? address?.asURL() {
let server = Server(address: serverAddress.absoluteString, key: "")
ServerManager.shared.addServer(server: server)
ServerManager.shared.setCurrentServer(serverId: server.id)
ServerManager.shared.syncAllServers()
HUDSuccess("AddedSuccessfully".localized)
}
return true
}
return false
}
}
extension AppDelegate {
func alertNotification(userInfo: [AnyHashable: Any]) {
let alert = (userInfo["aps"] as? [String: Any])?["alert"] as? [String: Any]
let title = alert?["title"] as? String
let subtitle = alert?["subtitle"] as? String
let body = alert?["body"] as? String
let url = try? (userInfo["url"] as? String)?.asURL()
let alertController = UIAlertController(title: title, message: body, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "CopyContent".localized, style: .default, handler: { _ in
if let copy = userInfo["copy"] as? String {
UIPasteboard.general.string = copy
} else {
UIPasteboard.general.string = body
}
}))
alertController.addAction(UIAlertAction(title: "MoreActions".localized, style: .default, handler: { _ in
var shareContent = ""
if let title = title {
shareContent += "\(title)\n"
}
if let subtitle = subtitle {
shareContent += "\(subtitle)\n"
}
if let body = body {
shareContent += "\(body)\n"
}
for (key, value) in userInfo {
if ["aps", "title", "subtitle", "body", "url"].contains((key as? String) ?? "") {
continue
}
shareContent += "\(key): \(value) \n"
}
var items: [Any] = []
items.append(shareContent)
if let url = url {
items.append(url)
}
let controller = Client.shared.window?.rootViewController
let activityController = UIActivityViewController(activityItems: items,
applicationActivities: nil)
if let popover = activityController.popoverPresentationController {
popover.sourceView = controller?.view
popover.sourceRect = CGRect(x: controller?.view.bounds.midX ?? 0, y: controller?.view.bounds.midY ?? 0, width: 0, height: 0)
}
controller?.present(activityController, animated: true, completion: nil)
}))
alertController.addAction(UIAlertAction(title: "Cancel".localized, style: .cancel, handler: nil))
let viewController = Client.shared.currentSnackbarController
if let presentedController = viewController?.presentedViewController {
presentedController.dismiss(animated: false) {
viewController?.present(alertController, animated: true, completion: nil)
}
} else {
viewController?.present(alertController, animated: true, completion: nil)
}
}
}
================================================
FILE: Bark/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"filename" : "bark.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/background.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "245",
"green" : "245",
"red" : "245"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0",
"green" : "0",
"red" : "0"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/background_seconday.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "255",
"green" : "255",
"red" : "255"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "22",
"green" : "22",
"red" : "22"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/black.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.000",
"green" : "0.000",
"red" : "0.000"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/blue_base.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "243",
"green" : "150",
"red" : "33"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "243",
"green" : "150",
"red" : "33"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/blue_darken1.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "229",
"green" : "136",
"red" : "30"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "245",
"green" : "165",
"red" : "66"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/blue_darken5.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "216",
"green" : "46",
"red" : "34"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "233",
"green" : "44",
"red" : "70"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/darkText_primary.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.870",
"blue" : "255",
"green" : "255",
"red" : "255"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.870",
"blue" : "0",
"green" : "0",
"red" : "0"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/darkText_secondary.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.540",
"blue" : "255",
"green" : "255",
"red" : "255"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.540",
"blue" : "0",
"green" : "0",
"red" : "0"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_base.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "158",
"green" : "158",
"red" : "158"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "97",
"green" : "97",
"red" : "97"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_darken1.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "117",
"green" : "117",
"red" : "117"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "189",
"green" : "189",
"red" : "189"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_darken2.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "97",
"green" : "97",
"red" : "97"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "224",
"green" : "224",
"red" : "224"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_darken3.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "66",
"green" : "66",
"red" : "66"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "238",
"green" : "238",
"red" : "238"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_darken4.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "33",
"green" : "33",
"red" : "33"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "245",
"green" : "245",
"red" : "245"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_lighten1.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "189",
"green" : "189",
"red" : "189"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "117",
"green" : "117",
"red" : "117"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_lighten2.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "214",
"green" : "214",
"red" : "214"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "92",
"green" : "92",
"red" : "92"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_lighten3.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "238",
"green" : "238",
"red" : "238"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "66",
"green" : "66",
"red" : "66"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_lighten4.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "245",
"green" : "245",
"red" : "245"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "33",
"green" : "33",
"red" : "33"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/grey_lighten5.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "250",
"green" : "250",
"red" : "250"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "28",
"green" : "28",
"red" : "28"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/lightBlue_darken3.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "189",
"green" : "119",
"red" : "2"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "250",
"green" : "212",
"red" : "129"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/notification_copy_color.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.000",
"green" : "0.000",
"red" : "0.000"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"idiom" : "universal"
},
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.000",
"green" : "0.000",
"red" : "0.000"
}
},
"idiom" : "iphone"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"idiom" : "iphone"
},
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.000",
"green" : "0.000",
"red" : "0.000"
}
},
"idiom" : "ipad"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"idiom" : "ipad"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Colors/white.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.000",
"green" : "0.000",
"red" : "0.000"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/back.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "back@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "back@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_check_circle_outline_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_check_circle_outline_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_check_circle_outline_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_check_circle_outline_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_close_white_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_close_white_48pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_close_white_48pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_close_white_48pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_delete_outline_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_delete_outline_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_delete_outline_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_delete_outline_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_file_copy_white_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "baseline_file_copy_white_24pt_1x.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "baseline_file_copy_white_24pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "baseline_file_copy_white_24pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_filter_drama_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_filter_drama_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_filter_drama_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_filter_drama_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_folder_open_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_folder_open_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_folder_open_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_folder_open_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_gite_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_gite_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_gite_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_gite_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_http_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "baseline_http_black_24pt_1x.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "baseline_http_black_24pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "baseline_http_black_24pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_https_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "baseline_https_black_24pt_1x.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "baseline_https_black_24pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "baseline_https_black_24pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_keyboard_arrow_down_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_keyboard_arrow_down_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_keyboard_arrow_down_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_keyboard_arrow_down_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_manage_accounts_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_manage_accounts_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_manage_accounts_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_manage_accounts_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_qr_code_scanner_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_qr_code_scanner_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_qr_code_scanner_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_qr_code_scanner_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_radio_button_unchecked_black_24pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_radio_button_unchecked_black_24pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_radio_button_unchecked_black_24pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_radio_button_unchecked_black_24pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_remove_black_20pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_remove_black_20pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_remove_black_20pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_remove_black_20pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_wifi_black_20pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_wifi_black_20pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_wifi_black_20pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_wifi_black_20pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/baseline_wifi_off_black_20pt.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "baseline_wifi_off_black_20pt_1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "baseline_wifi_off_black_20pt_2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "baseline_wifi_off_black_20pt_3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Bark/Assets.xcassets/copyTest.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "preview_copy@3x.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "preview_copy_dark@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/criticalAlert.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "IMG_8023.jpg",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "IMG_8024.jpg",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/group.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "preview_group_default@3x.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "preview_group_dark@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/group_collapse.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "folder_code_24dp_5F6368_FILL0_wght400_GRAD0_opsz242 (3).png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "folder_code_24dp_5F6368_FILL0_wght400_GRAD0_opsz242 (2).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/group_expand.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "folder_code_24dp_5F6368_FILL0_wght400_GRAD0_opsz24 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "folder_code_24dp_5F6368_FILL0_wght400_GRAD0_opsz24.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/icon.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "preview_icon_default@3x.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "preview_icon_dark@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/keyboard_arrow_right_symbol.symbolset/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
},
"symbols" : [
{
"filename" : "keyboard_arrow_right_keyboard_arrow_right_symbol.svg",
"idiom" : "universal"
}
]
}
================================================
FILE: Bark/Assets.xcassets/music_note-music_note_symbol.symbolset/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
},
"symbols" : [
{
"filename" : "music_note-music_note_symbol.svg",
"idiom" : "universal"
}
]
}
================================================
FILE: Bark/Assets.xcassets/offline.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "offline@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/online.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "online@3X.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Assets.xcassets/warning.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "warning@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Bark/Bark.entitlements
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.usernotifications.communication</key>
<true/>
<key>com.apple.developer.usernotifications.critical-alerts</key>
<true/>
<key>com.apple.developer.usernotifications.time-sensitive</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.bark</string>
</array>
</dict>
</plist>
================================================
FILE: Bark/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
<color key="backgroundColor" name="background"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<namedColor name="background">
<color red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
</resources>
</document>
================================================
FILE: Bark/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Save the image to the photo library</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>bark</string>
</array>
<key>CFBundleURLName</key>
<string>me.fin.bark</string>
</dict>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Bark</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>GitHub Run Id</key>
<string>0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSCameraUsageDescription</key>
<string>We are using the camera to scan a QR code</string>
<key>NSUserActivityTypes</key>
<array>
<string>INSendMessageIntent</string>
<string>INStartCallIntent</string>
</array>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
</dict>
</plist>
================================================
FILE: Bark/Intents/OptionsProvider.swift
================================================
//
// OptionsProvider.swift
// Bark
//
// Created by huangfeng on 2/21/25.
// Copyright © 2025 Fin. All rights reserved.
//
import AppIntents
@available(iOS 16, *)
struct ServerAddressOptionsProvider: DynamicOptionsProvider {
func results() async throws -> [String] {
return ServerManager.shared.servers.map { server in
return server.address + "/" + server.key
}
}
func defaultResult() async -> String? {
return ServerManager.shared.currentServer.address + "/" + ServerManager.shared.currentServer.key
}
}
@available(iOS 16, *)
struct SoundOptionsProvider: DynamicOptionsProvider {
func results() async throws -> [String] {
var customSounds: [String] = []
if let soundsDirectoryUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.bark")?.appendingPathComponent("Library/Sounds").path {
customSounds = getSounds(urls: getFilesInDirectory(directory: soundsDirectoryUrl, suffix: "caf"))
}
let defaultSounds = getSounds(urls: Bundle.main.urls(forResourcesWithExtension: "caf", subdirectory: nil) ?? [])
return customSounds + defaultSounds
}
func getSounds(urls: [URL]) -> [String] {
let urls = urls.sorted { u1, u2 -> Bool in
u1.lastPathComponent.localizedStandardCompare(u2.lastPathComponent) == ComparisonResult.orderedAscending
}
return urls.map { $0.deletingPathExtension().lastPathComponent }
}
func getFilesInDirectory(directory: String, suffix: String) -> [URL] {
let fileManager = FileManager.default
do {
let files = try fileManager.contentsOfDirectory(atPath: directory)
return files.compactMap { file -> URL? in
if file.hasSuffix(suffix), !file.hasPrefix(kBarkSoundPrefix) {
// 不要包含 kBarkSoundPrefix 开头的,这些是为了 call=1 合成的 30s 长铃声,不算用户上传的
return URL(fileURLWithPath: directory).appendingPathComponent(file)
}
return nil
}
} catch {
return []
}
}
}
@available(iOS 16, *)
struct VolumeOptionsProvider: DynamicOptionsProvider {
func results() async throws -> [Int] {
return Array(0...10)
}
}
================================================
FILE: Bark/Intents/PushResponse.swift
================================================
//
// PushResponse.swift
// Bark
//
// Created by huangfeng on 2/21/25.
// Copyright © 2025 Fin. All rights reserved.
//
struct PushResponse: Decodable {
let message: String?
let code: Int?
}
================================================
FILE: Bark/Intents/PushToCurrentIntent.swift
================================================
//
// Intents.swift
// Bark
//
// Created by huangfeng on 2/20/25.
// Copyright © 2025 Fin. All rights reserved.
//
import Alamofire
import AppIntents
@available(iOS 16, *)
struct PushToCurrentIntent: AppIntent {
static var title: LocalizedStringResource = "sendPushNotification"
static var openAppWhenRun: Bool = false
@Parameter(title: "ServerAddress", optionsProvider: ServerAddressOptionsProvider())
var address: String
@Parameter(title: "CustomedNotificationTitle")
var title: String?
@Parameter(title: "CustomedNotificationContent")
var body: String?
@Parameter(title: "ringtone")
var isCall: Bool
@Parameter(title: "criticalAlert")
var isCritical: Bool
@Parameter(title: "ringtoneVolume", optionsProvider: VolumeOptionsProvider())
var volume: Int?
@Parameter(title: "notificationSound", optionsProvider: SoundOptionsProvider())
var sound: String?
@Parameter(title: "notificationIcon")
var icon: URL?
@Parameter(title: "group")
var group: String?
func perform() async throws -> some IntentResult & ReturnsValue<Bool> {
guard let address = URL(string: address) else {
throw "Invalid URL"
}
var params: [String: Any] = [:]
if let title, !title.isEmpty {
params["title"] = title.urlDecoded()
}
if let body, !body.isEmpty {
params["body"] = body.urlDecoded()
}
if title == nil, body == nil {
params["body"] = "Empty Notification"
}
if isCritical {
params["level"] = "critical"
}
if let volume {
params["volume"] = volume
}
if isCall {
params["call"] = 1
}
if let sound, !sound.isEmpty {
params["sound"] = sound
}
if let icon {
params["icon"] = icon.absoluteString
}
if let group, !group.isEmpty {
params["group"] = group
}
let response = await AF.request(address, method: .post, parameters: params, encoding: JSONEncoding.default)
.serializingDecodable(PushResponse.self)
.response
// 打印返回的body
if response.response?.statusCode != 200 {
return .result(value: false)
}
return .result(value: true)
}
}
================================================
FILE: Bark/Intents/PushToOtherIntent.swift
================================================
//
// PushToOtherIntent.swift
// Bark
//
// Created by huangfeng on 2/21/25.
// Copyright © 2025 Fin. All rights reserved.
//
import Alamofire
import AppIntents
@available(iOS 16, *)
struct PushToOtherIntent: AppIntent {
static var title: LocalizedStringResource = "sendPushNotificationToOther"
static var openAppWhenRun: Bool = false
@Parameter(title: "ServerAddress")
var address: String
@Parameter(title: "CustomedNotificationTitle")
var title: String?
@Parameter(title: "CustomedNotificationContent")
var body: String?
@Parameter(title: "ringtone")
var isCall: Bool
@Parameter(title: "criticalAlert")
var isCritical: Bool
@Parameter(title: "ringtoneVolume", optionsProvider: VolumeOptionsProvider())
var volume: Int?
@Parameter(title: "notificationSound", optionsProvider: SoundOptionsProvider())
var sound: String?
@Parameter(title: "notificationIcon")
var icon: URL?
@Parameter(title: "group")
var group: String?
func perform() async throws -> some IntentResult & ReturnsValue<Bool> {
guard let address = URL(string: address) else {
throw "Invalid URL"
}
var params: [String: Any] = [:]
if let title, !title.isEmpty {
params["title"] = title.urlDecoded()
}
if let body, !body.isEmpty {
params["body"] = body.urlDecoded()
}
if title == nil, body == nil {
params["body"] = "Empty Notification"
}
if isCritical {
params["level"] = "critical"
}
if let volume {
params["volume"] = volume
}
if isCall {
params["call"] = 1
}
if let sound, !sound.isEmpty {
params["sound"] = sound
}
if let icon {
params["icon"] = icon.absoluteString
}
if let group, !group.isEmpty {
params["group"] = group
}
let response = await AF.request(address, method: .post, parameters: params, encoding: JSONEncoding.default)
.serializingDecodable(PushResponse.self)
.response
// 打印返回的body
if response.response?.statusCode != 200 {
return .result(value: false)
}
return .result(value: true)
}
}
================================================
FILE: Bark/Localizable.xcstrings
================================================
{
"sourceLanguage" : "en",
"strings" : {
"AddedSuccessfully" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Server added successfully."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーが正常に追加されました。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu başarıyla eklendi."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "添加成功!"
}
}
}
},
"AddServer" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Add a Server"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーを追加"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu Ekleme"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "添加私有服务器"
}
}
}
},
"algorithm" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Algorithm"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アルゴリズム"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Algoritma"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "算法"
}
}
}
},
"AllowNotifications" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Notifications have been turned off. Please allow notifications in the Settings app."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知がオフになっています。設定アプリで通知を許可してください。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bildirimler kapatıldı. Lütfen Ayarlar uygulamasından bildirimlere izin verin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "绑定设备需要推送。请打开推送后重试"
}
}
}
},
"allTime" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "All time"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "全期間"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tüm zamanlar"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "所有时间"
}
}
}
},
"archiveNote" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Archive notifications by default if the 'isArchive' parameter is unset."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "'isArchive'パラメータが未設定の場合、デフォルトで通知をアーカイブします。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "'isArchive' parametresi ayarlanmamışsa varsayılan olarak bildirimleri arşivleyin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "当推送请求URL没有指定 isArchive 参数时,将按照此设置来决定是否保存通知消息"
}
}
}
},
"archiveNotificationMessage" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Archive a notification by passing 'isArchive=1'. Prevent archiving by passing 'isArchive=0'. Default settings will apply if the parameter is unset."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "'isArchive=1'を渡して通知をアーカイブします。'isArchive=0'を渡してアーカイブを防止します。パラメータが未設定の場合、デフォルト設定が適用されます。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "'isArchive=1' değerini geçerek bir bildirimi arşivleyin. 'isArchive=0' geçerek arşivlemeyi önleyin. Parametre ayarlanmamışsa varsayılan ayarlar geçerli olacaktır."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "当设置 isArchive 值为 1 时,则会自动保存这条推送消息,设置为其他值时,则不会保存。\n如果不指定 isArchive 参数时,则按照默认设置保存消息,可以在 设置->默认保存消息 更改默认保存设置"
}
}
}
},
"archiveNotificationMessageTitle" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Archive Notification"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知をアーカイブ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arşiv Bildirimi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自动保存通知消息"
}
}
}
},
"automaticallyCopy" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automatically copy the body text of a notification, only for iOS 14.4 and below. For iOS 14.5 and above, long press or pull down the notification to copy."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知の本文を自動的にコピーします(iOS 14.4以下のみ)。iOS 14.5以上では、通知を長押しまたは引き下げてコピーします。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bir bildirimin gövde metnini otomatik olarak kopyalayın, yalnızca iOS 14.4 ve altı için. iOS 14.5 ve üzeri sürümlerde, kopyalamak için bildirime uzun basın veya aşağı çekin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "携带automaticallyCopy参数时,将自动复制推送内容。\n携带copy参数时,将只复制copy参数的值。\niOS14.5 之后长按或下拉推送即可触发自动复制,iOS14.5之前无需任何操作即可自动复制。"
}
}
}
},
"automaticallyCopyTitle" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auto Copy Body Text (iOS 14.4 and below)"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "本文を自動コピー(iOS 14.4以下)"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gövde Metnini Otomatik Kopyala (iOS 14.4 ve altı)"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自动复制推送内容到剪切板"
}
}
}
},
"badge" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Badge Count"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "バッジカウント"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rozet Sayısı"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "设置角标"
}
}
}
},
"badgeNotice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Specify a number on Bark app’s icon when a notification arrives."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知が到着したときにBarkアプリのアイコンに数字を指定します。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bir bildirim geldiğinde Bark uygulamasının simgesinde bir sayı belirtin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "可以为推送设置角标,角标可以是任意数字。"
}
}
}
},
"base64Notice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you get a 'Decryption Failed' prompt, try adding '-w 0' after the base64 command."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "「復号に失敗しました」というプロンプトが表示された場合、base64コマンドの後に「-w 0」を追加してみてください。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "şifre çözme başarısız olduysa, base64 komutundan sonra '-i 0' eklemeyi deneyin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "如果提示 Decryption Failed, 尝试在 base64 命令后面 加上 -w 0"
}
}
}
},
"beforeAMonth" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Before a month"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "1ヶ月前"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bir Ay Önce"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "一个月之前"
}
}
}
},
"beforeAnHour" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Before an hour"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "1時間前"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bir Saat Önce"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "一小时之前"
}
}
}
},
"beforeToday" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Before today"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "今日より前"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bugünden Önce"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "今天之前"
}
}
}
},
"beforeYesterday" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Before yesterday"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "昨日より前"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dünden Önce"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "昨天之前"
}
}
}
},
"buildDesc" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bark uses GitHub Actions to build and publish itself to the App Store. You can verify the ‘run_id’ in the URL to ensure Bark was built from its original open-source codebase."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "BarkはGitHub Actionsを使用して自身をビルドし、App Storeに公開します。URL内の「run_id」を確認して、Barkがオリジナルのオープンソースコードベースからビルドされたことを確認できます。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bark, kendisini oluşturmak ve App Store'da yayınlamak için GitHub Actions'ı kullanır. Bark'ın orijinal açık kaynak kod tabanından oluşturulduğundan emin olmak için URL'deki 'run_id'yi doğrulayabilirsiniz."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bark 由 GitHub Actions 构建后上传到 App Store,此信息可帮助你确认当前版本是由开源代码所构建,未经任何人(包含作者)修改。"
}
}
}
},
"Cancel" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancel"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "キャンセル"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vazgeç"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消"
}
}
}
},
"ciphertextComment" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "URL encoding the ciphertext, there may be special characters."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "暗号文をURLエンコードします。特殊文字が含まれる場合があります。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "URL şifreli metni kodlarken özel karakterler olabilir."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "密文可能有特殊字符,所以记得 URL 编码一下。"
}
}
}
},
"clear" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Clear"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "クリア"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Temizle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "清除"
}
}
}
},
"clearFrom" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Clear from:"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "クリア範囲:"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Şuradan Temizle:"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "清除以下时间段的历史消息:"
}
}
}
},
"close" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Close"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "閉じる"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kapat"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "关闭"
}
}
}
},
"confirm" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Confirm"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "確認"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Onayla"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "确定"
}
}
}
},
"confirmDeleteServer" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Are you sure you want to delete this server?"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "このサーバーを削除してもよろしいですか?"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bu sunucuyu silmek istediğinizden emin misiniz?"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "确定删除服务器吗?"
}
}
}
},
"consoleComment" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "The console will print"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "コンソールに表示されます"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Konsola şunları yazdırır"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "控制台将打印"
}
}
}
},
"continuousSupport" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Continuous support"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "継続的なサポート"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "sürekli destek"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "持续支持"
}
}
}
},
"Copy" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copied!"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "コピーしました!"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopyalandı!"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "复制成功"
}
}
}
},
"Copy2" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copy"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "コピー"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopyala"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "复制"
}
}
}
},
"copyAddressAndKey" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copy Address and Key"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アドレスとキーをコピー"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Adres ve Anahtarı Kopyala"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "复制地址和Key"
}
}
}
},
"CopyContent" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copy the Content"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "内容をコピー"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İçeriği Kopyala"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "复制内容"
}
}
}
},
"copyExample" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copy Send Script Example"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "送信スクリプトの例をコピー"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopya Gönderme Komut Dosyası Örneği"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "复制发送脚本示例"
}
}
}
},
"copyParameter" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Specify clipboard content by passing through the 'copy' parameter"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "'copy'パラメータを介してクリップボードの内容を指定します"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "'copy' parametresini geçirerek pano içeriğini belirtin"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "下拉推送、锁屏界面左滑查看推送时,可以选择复制推送内容\n携带copy参数时,将只复制copy参数的值"
}
}
}
},
"criticalAlert" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Critical Alert"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "緊急アラート"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "kritik uyarı"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重要警告"
}
}
}
},
"criticalAlertNotice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Critical Alert will ignore silent and Do Not Disturb modes. \nIf volume isn't provided, it defaults to 5 (range: 0-10)."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "緊急アラートはサイレントモードとおやすみモードを無視します。 \n音量が指定されていない場合、デフォルトは5です(範囲: 0-10)。 "
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Critical Alert will ignore silent and Do Not Disturb modes. \nIf volume isn't provided, it defaults to 5 (range: 0-10)."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重要警告会忽略静音设置和勿扰模式,无论设备是否静音,通知都会提示并播放声音。\n音量参数 volume 不传默认值为5, 取值范围: 0-10。"
}
}
}
},
"CustomedNotificationContent" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Body Text"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "本文"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gövde Metni"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "这里改成你自己的推送内容"
}
}
}
},
"CustomedNotificationTitle" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Title"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "タイトル"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Başlık"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "推送标题"
}
}
}
},
"customSounds" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Custom Sounds"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "カスタムサウンド "
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "özel sesler"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自定义铃声"
}
}
}
},
"default" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Default"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルト"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Varsayılan"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "默认"
}
}
}
},
"defaultArchiveSettings" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Archive by Default"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルトでアーカイブ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Varsayılan Olarak Arşivle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "默认保存"
}
}
}
},
"defaultSounds" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Default Sounds"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルトサウンド "
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "varsayılan sesler"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "默认铃声"
}
}
}
},
"deletedSuccessfully" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Server has been deleted successfully."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーが正常に削除されました。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu başarıyla silindi."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "删除成功!"
}
}
}
},
"deleteFailed" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "You must have at least one server configured."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "少なくとも1つのサーバーを設定する必要があります。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yapılandırılmış en az bir sunucunuz olmalıdır."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "不能删除,服务器至少需保留一个"
}
}
}
},
"deleteServer" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Delete Server"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーを削除"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucuyu Sil"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "删除服务器"
}
}
}
},
"demo" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Demo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デモ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Demo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "演示"
}
}
}
},
"DeploymentDocuments" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deploy a self-hosted Bark server"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "セルフホスト型Barkサーバーをデプロイ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu tarafı dağıtım dökümanını görüntüleyin"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查看服务端部署教程"
}
}
}
},
"deployUrl" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/deploy"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/deploy"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/deploy"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/deploy"
}
}
}
},
"documentation" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Documentation"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ドキュメント"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dokümantasyon"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用文档"
}
}
}
},
"docUrl" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/?id=bark"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/?id=bark"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/?id=bark"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/?id=bark"
}
}
}
},
"donate" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Donate"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "寄付"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "bağış yapmak"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "捐赠"
}
}
}
},
"donateOK" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "🤝"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "🤝"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "🤝"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "🤝"
}
}
}
},
"done" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Done"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "完了"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bitti"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "完成"
}
}
}
},
"encryptionNotice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uses a custom key to encrypt and decrypt the push content when sending and receiving. In this way, the push content will not be obtained or leaked by Bark server and Apple APNs server during transmission."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "送受信時にカスタムキーを使用してプッシュ内容を暗号化および復号化します。これにより、プッシュ内容がBarkサーバーやApple APNsサーバーによって取得または漏洩されることはありません。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gönderirken ve alırken push içeriğini şifrelemek ve şifresini çözmek için özel bir anahtar kullanır. Bu sayede push içeriği iletim sırasında Bark sunucusu ve Apple APNs sunucusu tarafından elde edilemez veya sızdırılamaz."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "在发送和接收推送时,对推送内容进行加密和解密。这样,推送内容在传输过程中就不会被 Bark 服务器和苹果 APNs 服务器获取或泄露,从而保护你的隐私"
}
}
}
},
"encryptionSettings" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encryption Settings"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "暗号化設定"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Şifreleme Ayarları"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "加密设置"
}
}
}
},
"encryptionUrl" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/encryption"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/encryption"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/encryption"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/encryption"
}
}
}
},
"enterIv" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Please enter %d-bytes Iv"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "%dバイトのIvを入力してください "
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lütfen %d-bytes Iv girin"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "请输入%d位Iv"
}
}
}
},
"enterKey" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Please enter %d-bytes Key"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "%dバイトのKeyを入力してください"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lütfen %d-bytes Anahtar girin"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "请输入%d位Key"
}
}
}
},
"export" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Export"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "エクスポート"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dışa Aktar"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "导出"
}
}
}
},
"faq" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "FAQs"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "よくある質問"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "SSS"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "常见问题"
}
}
}
},
"faqUrl" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/faq"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/faq"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/en-us/faq"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://bark.day.app/#/faq"
}
}
}
},
"gcmNotSupported" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "GCM mode does not support copying script example."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "GCMモードはスクリプト例のコピーをサポートしていません。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "GCM modu, script örneklerini kopyalamayı desteklemez."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "GCM Mode 不支持复制脚本示例。"
}
}
}
},
"group" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Group"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "グループ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "grup"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "分组"
}
}
}
},
"groupMessagesNotice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Let iOS sort notifications by groups."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "iOSに通知をグループごとに並べ替えさせます"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "iOS'un bildirimleri gruplara göre sıralamasına izin verin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "对消息进行分组,推送将按group分组显示在通知中心中。\n也可在历史消息列表中选择查看不同的群组。"
}
}
}
},
"groupMuted" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Group \"%@\" muted!"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "グループ「%@」をミュートしました!"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "\"%@\" grubunun sesi kapatıldı!"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "分组 \"%@\" 已静音"
}
}
}
},
"historyMessage" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Message History"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "メッセージ履歴"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mesaj Geçmişi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "历史消息"
}
}
}
},
"image" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Image"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "画像"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "resim"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "图片"
}
}
}
},
"imageParameter" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "To show a picture in a push banner and message list"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "プッシュバナーやメッセージ一覧に画像を表示するには、画像のURLを渡す必要があります。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gönderim afişlerinde ve mesaj listelerinde görsel göstermek için görsel URL’si iletilmelidir."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "在推送横幅与消息列表中显示图片,需传递图片url。"
}
}
}
},
"imagePushNotification" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Image Push Notification"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "画像プッシュ通知"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Görsel Bildirim Uyarısı"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "图片推送通知"
}
}
}
},
"import" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Import"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "インポート"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İçe Aktar"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "导入"
}
}
}
},
"info" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Info"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "情報"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bilgi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "信息"
}
}
}
},
"interruptionLevel" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Time Sensitive Notifications"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "時間感応通知"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zamana Duyarlı Bildirimler"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "时效性通知"
}
}
}
},
"interruptionLevelNotice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Set importance and delivery timing of a notification. Available values:\nactive (default): presents the notification immediately, lights up the screen, and can play a sound.\ntimeSensitive: similar to active, but can break through system controls such as Notification Summary and Focus.\npassive: adds the notification to the notification list without lighting up the screen or playing a sound."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知の重要度と配信タイミングを設定します。利用可能な値: \nactive(デフォルト): 通知を即時に表示し、画面を点灯させ、音を再生することができます。 \ntimeSensitive: activeと似ていますが、通知サマリーやフォーカスなどのシステム制御を突破できます。 \npassive: 通知を通知リストに追加しますが、画面を点灯させたり音を再生したりしません。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bir bildirimin önemini ve teslim zamanlamasını ayarlayın. Kullanılabilir değerler:\nactive (varsayılan): bildirimi hemen sunar, ekranı aydınlatır ve bir ses çalabilir.\ntimeSensitive: aktif'e benzer, ancak Bildirim Özeti ve Odak gibi sistem denetimlerini aşabilir.\npassive: bildirimi ekranı aydınlatmadan veya bir ses çalmadan bildirim listesine ekler."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "可对通知设置中断级别,不设置则默认为 active。\n\n可选参数值:\nactive: 默认值,系统会立即亮屏显示通知。\ntimeSensitive:时效性通知,可在专注状态下显示通知。\npassive:仅将通知添加到通知列表,不会亮屏提醒。"
}
}
}
},
"InvalidServer" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Server address is invalid."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーアドレスが無効です。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu adresi geçersiz."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "填写的服务器无效,请重试!"
}
}
}
},
"InvalidURL" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "URL is invalid."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "URLが無効です。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "URL geçersiz."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "输入的URL好像不对劲!"
}
}
}
},
"items" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "messages"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "メッセージ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "mesajlar"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "条消息"
}
}
}
},
"ivComment" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "IV can be randomly generated, but if it is random, it needs to be passed in the iv parameter."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "IVはランダムに生成できますが、ランダムな場合はivパラメータで渡す必要があります。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "IV rastgele oluşturulabilir, ancak rastgele ise iv parametresinde belirtilmesi gerekir."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "IV可以是随机生成的,但如果是随机的就需要放在 iv 参数里传递。"
}
}
}
},
"keyComment" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Must be %d bit long"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "%dビット長でなければなりません"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "%d bit uzunluğunda olmalıdır"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "必须%d位"
}
}
}
},
"lastHour" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "The last hour"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "過去1時間"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Son bir saat"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "最近一小时"
}
}
}
},
"lastMonth" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "The last month"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "過去1ヶ月"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Son Ay"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "最近一个月"
}
}
}
},
"messageGroup" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Notification Grouping"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知グループ化"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bildirim Gruplandırma"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "推送消息分组"
}
}
}
},
"mode" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mode"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "モード"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mod"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "模式"
}
}
}
},
"more" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "More"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "詳細"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Daha"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "更多"
}
}
}
},
"MoreActions" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "More Actions"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "その他のアクション"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Daha Fazla İşlem"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "更多操作"
}
}
}
},
"muteGroup1Hour" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mute this group for 1 Hour"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "このグループを1時間ミュート"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "bu grubu 1 saatliğine sessize alın"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "1小时内不再提醒此分组"
}
}
}
},
"noPermission" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "No permission"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "権限がありません"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İzin yok"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "没有权限"
}
}
}
},
"Notice1" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use the buttons to copy and open sample URLs"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ボタンを使用してサンプルURLをコピーおよび開く"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Örnek URL'leri kopyalamak ve açmak için düğmeleri kullanın"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "点击右上角按钮可以复制测试URL、预览推送效果\nSafari有缓存,没收到推送时请刷新页面"
}
}
}
},
"Notice2" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Customize notification title and body text"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知のタイトルと本文をカスタマイズ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bildirim başlığını ve gövde metnini özelleştirme"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "推送标题的字号比推送内容粗一点"
}
}
}
},
"notificationIcon" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Icon"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アイコン"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İkon"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自定义推送图标(需iOS15或以上)"
}
}
}
},
"notificationIconNotice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Display a custom icon on a notification."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知にカスタムアイコンを表示"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bildirimde özel bir ikon görüntüleyin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "为推送设置自定义图标,设置的图标将替换默认Bark图标。图标会自动缓存在本机,相同的图标 URL 仅下载一次。"
}
}
}
},
"notificationSound" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alert Sound"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アラートサウンド"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uyarı Sesi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "推送铃声"
}
}
}
},
"oneTimeDonation" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "One-time donation"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "一度きりの寄付"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "tek seferlik bağış"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "一次性捐赠"
}
}
}
},
"opensslEncodingComment" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "openssl requires Hex encoding of manual keys and IVs, not ASCII encoding."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "opensslでは、手動キーとIVをASCIIエンコードではなくHexエンコードする必要があります。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "openssl, manuel anahtarların ve IV'lerin ASCII kodlamasını değil, Hex kodlamasını gerektirir."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "OpenSSL 要求输入的 Key 和 IV 需使用十六进制编码。"
}
}
}
},
"other" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Other"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "その他"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Diğer"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "其他"
}
}
}
},
"privacyPolicy" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Privacy Policy"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "プライバシーポリシー"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "gizlilik politikası"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "隐私政策"
}
}
}
},
"pushNotificationEncryption" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Push Notification Encryption"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "プッシュ通知暗号化"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anlık Bildirim Şifreleme"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "推送加密"
}
}
}
},
"RegisterDevice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Register Device"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デバイスを登録"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cihazı Kaydet"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "注册设备"
}
}
}
},
"removeMessage" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Remove"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "削除"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sil"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "删除"
}
}
}
},
"removeNotice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "This will be permanently removed and cannot be undone."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "これは永久に削除され、元に戻せません。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bu kalıcı olarak kaldırılacak ve geri alınamaz."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "将永久删除并且无法恢复。"
}
}
}
},
"resetFailed" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reset Failed"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "リセット失敗"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sıfırlama Başarısız Oldu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重置失败"
}
}
}
},
"resetFailed2" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bark could not get a DeviceToken from the server."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "BarkはサーバーからDeviceTokenを取得できませんでした。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bark sunucudan bir DeviceToken alamadı."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重置失败,没有获取到 DeviceToken"
}
}
}
},
"resetKey" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reset or Restore Key"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "キーをリセットまたは復元"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anahtarı Sıfırla veya Geri Yükle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重置或还原Key"
}
}
}
},
"resetKeyDesc" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Leave blank to reset. Enter an old key to restore."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "空白のままにしてリセットします。古いキーを入力して復元します。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sıfırlamak için boş bırakın. Geri yüklemek için eski bir anahtar girin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重置直接点确定,还原请先输入旧的Key"
}
}
}
},
"resetKeyPlaceholder" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Do not enter or enter the old Key"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "古いキーを入力しないか、空白のままにします"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fazladan girmeyin veya T ve OL anahtarını girmeyin"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "不输入或输入旧的Key"
}
}
}
},
"restoreSubscription" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restore Subscription"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サブスクリプションを復元"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "aboneliği geri yükle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "恢复订阅"
}
}
}
},
"ringtone" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ringtone"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "着信音"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "zil sesi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "持续响铃"
}
}
}
},
"ringtoneNotice" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep playing the ringtone for 30 seconds. With the level=critical parameter, it can ring continuously even in silent mode."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "着信音を30秒間再生し続けます。level=criticalパラメータを使用すると、サイレントモードでも連続して鳴らすことができます。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zil sesi 30 saniye boyunca kesintisiz çalar. level=critical parametresi ile sessiz modda bile sürekli çalabilir."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "持续播放铃声 30 秒,配合 level=critical 参数可在静音模式下持续响铃。"
}
}
}
},
"ringtoneVolume" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ringtone Volume for Critical Alerts"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "重要な警告の着信音量"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Önemli Uyarılar için Zil Sesi Seviyesi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重要警告铃声音量"
}
}
}
},
"save" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Save"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "保存"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kaydet"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "保存"
}
}
}
},
"saveSuccess" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Saved to your photos!"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アルバムに保存したよ!"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Albüme kaydedildi!"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "已保存到相册!"
}
}
}
},
"sendPushNotification" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Send notification to this device"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "このデバイスにプッシュ通知を送信"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bu cihaza bir bildirim gönder"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "发送推送到此设备"
}
}
}
},
"sendPushNotificationToOther" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Send notification to other device"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "他のデバイスにプッシュ通知を送信する"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Diğer cihazlara bildirim gönder"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "发送推送到其他设备"
}
}
}
},
"ServerAddress" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Server Address"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーアドレス"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu Adresi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "服务器地址"
}
}
}
},
"ServerError" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Server Error"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーエラー"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu Hatası"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "服务器错误"
}
}
}
},
"ServerExample" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enter the server address, e.g., https://api.day.app"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーアドレスを入力してください。例: https://api.day.app"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu adresini girin, örneğin, https://api.day.app"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "输入服务器地址,例如: https://api.day.app"
}
}
}
},
"serverList" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Server List"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバーリスト"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu Listesi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "服务器列表"
}
}
}
},
"service" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Service"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サービス"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hizmet"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "服务器"
}
}
}
},
"setAsDefaultServer" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Set As Default Server"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルトサーバーとして設定"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "varsayılan sunucu olarak ayarla"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "设为预览服务器"
}
}
}
},
"setServerName" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Set Server Name"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバー名を設定"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu Adını Ayarla"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "设置服务器名称"
}
}
}
},
"setSounds" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Select an alert sound for a notification."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知のアラートサウンドを選択"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bildirim için bir uyarı sesi seçin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "可以为推送设置不同的铃声"
}
}
}
},
"setSuccessfully" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Successfully set"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "正常に設定されました"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "başarıyla ayarlandı"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "设置成功!"
}
}
}
},
"settings" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Settings"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "設定"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ayarlar"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "设置"
}
}
}
},
"showLess" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Show less"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "詳細を表示しない"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Katlamak"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "折叠"
}
}
}
},
"sourceCode" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Source Code"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ソースコード"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "kaynak kodu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "开源代码"
}
}
}
},
"successfulDonation" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Donation"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "寄付"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "bağış"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "成功捐赠"
}
}
}
},
"thankYouSupport" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thank you for your kind support"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ご支援ありがとうございます"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "nazik desteğiniz için teşekkür ederim"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "谢谢你的慷慨支持"
}
}
}
},
"timeHourAgo" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d hour ago"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d時間前"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d saat önce"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d小时前"
}
}
}
},
"timeJustNow" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Just now"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "たった今"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Az önce"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "刚刚"
}
}
}
},
"timeMinAgo" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d minute ago"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d分前"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d dakika önce"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d分钟前"
}
}
}
},
"timeMinHourAgo" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d hour %2$d minutes ago"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d時間%2$d分前"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d saat %2$d dakika önce"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "%1$d小时%2$d分钟前"
}
}
}
},
"today" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Today"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "今日"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bugün"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "今天"
}
}
}
},
"todayAndYesterday" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Today and yesterday"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "今日と昨日"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dün ve Bugün"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "昨天和今天"
}
}
}
},
"toggle" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "表示切替"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Görünümü Değiştir"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
}
}
},
"unknown" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Unknown Status"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "不明なステータス"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bilinmeyen Durum"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "未知"
}
}
}
},
"uploadSound" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upload Sound"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サウンドをアップロード"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "ses yükle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "上传铃声"
}
}
}
},
"uploadSoundNoticeFullText" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Please convert the sound file to caf format, and make sure it's no longer than 30 seconds."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サウンドファイルをcaf形式に変換し、30秒以内であることを確認してください。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "lütfen ses dosyasını TOC AF formatına dönüştürün ve SU GYO'ları 30 saniyeden uzun olmayacak şekilde işaretleyin."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "请先将铃声转换成 caf 格式,时长不超过 30 秒。"
}
}
}
},
"uploadSoundNoticeHighlightText" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "convert the sound file to caf format"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サウンドファイルをcaf形式に変換"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "ses dosyasını TOC AF formatına dönüştürün"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "转换成 caf 格式"
}
}
}
},
"urlParameter" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open an URL by clicking on a notification, URL schemes are supported."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "通知をクリックしてURLを開きます。URLスキームがサポートされています。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bir bildirime tıklayarak bir URL açın, URL şemaları desteklenir."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "携带url参数时,点击推送会跳转到这个URL,支持跳转URL Scheme"
}
}
}
},
"userAgreement" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "User Agreement"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "利用規約"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "kullanıcı sözleşmesi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "用户协议"
}
}
}
},
"version" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Version"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "バージョン"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sürüm"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "版本"
}
}
}
},
"viewAllMessages" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "View all %d messages"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "すべての%d件のメッセージを表示"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tüm %d mesajı görüntüle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查看全部%d条消息"
}
}
}
},
"viewAllSounds" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Click here to view all available sounds."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ここをクリックして利用可能なすべてのサウンドを表示します。"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mevcut tüm sesleri görüntülemek için buraya tıklayın."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查看所有铃声"
}
}
}
}
},
"version" : "1.0"
}
================================================
FILE: Bark.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
0603706720E1E31600F4CA05 /* Defines.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0603706620E1E31600F4CA05 /* Defines.swift */; };
0603706920E1F89500F4CA05 /* PreviewCardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0603706820E1F89500F4CA05 /* PreviewCardCell.swift */; };
0603706B20E20A7C00F4CA05 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0603706A20E20A7C00F4CA05 /* String+Extension.swift */; };
0603706D20E23EC000F4CA05 /* BarkSFSafariViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0603706C20E23EC000F4CA05 /* BarkSFSafariViewController.swift */; };
060481EE250F404500BC9799 /* SoundsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 060481ED250F404500BC9799 /* SoundsViewController.swift */; };
060481F0250F51CA00BC9799 /* SoundCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 060481EF250F51CA00BC9799 /* SoundCell.swift */; };
0604F7DF20620D4900B32F09 /* ServerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0604F7DE20620D4900B32F09 /* ServerManager.swift */; };
0608F06E2994D115006B8029 /* BKDropDownCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0608F06D2994D115006B8029 /* BKDropDownCell.swift */; };
0608F0722994D269006B8029 /* BKDropDownCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0608F0712994D269006B8029 /* BKDropDownCell.xib */; };
06172FDA27F6DAEF002333A4 /* ServerListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06172FD927F6DAEF002333A4 /* ServerListTableViewCell.swift */; };
06172FDC27F6DB06002333A4 /* ServerListTableViewCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06172FDB27F6DB06002333A4 /* ServerListTableViewCellViewModel.swift */; };
061894C529962EB900E001C2 /* GradientButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061894C429962EB900E001C2 /* GradientButton.swift */; };
061894C729A75BEA00E001C2 /* Algorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061894C629A75BEA00E001C2 /* Algorithm.swift */; };
061C17082D1BDA4B00891D66 /* MessageGroupMoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061C17072D1BDA4B00891D66 /* MessageGroupMoreView.swift */; };
061E35862D1E5028009A2D6F /* MessageItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061E35852D1E5028009A2D6F /* MessageItemModel.swift */; };
0627DABB298B6EA2002F3F69 /* DropBoxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0627DABA298B6EA2002F3F69 /* DropBoxView.swift */; };
0627DABD2990D615002F3F69 /* BorderTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0627DABC2990D615002F3F69 /* BorderTextField.swift */; };
062B98C3251B2762004562E7 /* BKButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 062B98C2251B2762004562E7 /* BKButton.swift */; };
062B98C8251B27AE004562E7 /* UINavigationItem+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 062B98C7251B27AE004562E7 /* UINavigationItem+Extension.swift */; };
0632050F250B6DD4001561EC /* gotosleep.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F0250B6DD1001561EC /* gotosleep.caf */; };
06320510250B6DD4001561EC /* paymentsuccess.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F1250B6DD1001561EC /* paymentsuccess.caf */; };
06320511250B6DD4001561EC /* shake.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F2250B6DD1001561EC /* shake.caf */; };
06320512250B6DD4001561EC /* alarm.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F3250B6DD1001561EC /* alarm.caf */; };
06320513250B6DD4001561EC /* bloom.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F4250B6DD1001561EC /* bloom.caf */; };
06320514250B6DD4001561EC /* sherwoodforest.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F5250B6DD2001561EC /* sherwoodforest.caf */; };
06320515250B6DD4001561EC /* healthnotification.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F6250B6DD2001561EC /* healthnotification.caf */; };
06320516250B6DD4001561EC /* calypso.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F7250B6DD2001561EC /* calypso.caf */; };
06320517250B6DD4001561EC /* descent.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F8250B6DD2001561EC /* descent.caf */; };
06320518250B6DD4001561EC /* ladder.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F9250B6DD2001561EC /* ladder.caf */; };
06320519250B6DD4001561EC /* tiptoes.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FA250B6DD2001561EC /* tiptoes.caf */; };
0632051A250B6DD4001561EC /* fanfare.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FB250B6DD2001561EC /* fanfare.caf */; };
0632051B250B6DD4001561EC /* birdsong.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FC250B6DD2001561EC /* birdsong.caf */; };
0632051C250B6DD4001561EC /* typewriters.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FD250B6DD2001561EC /* typewriters.caf */; };
0632051D250B6DD4001561EC /* anticipate.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FE250B6DD2001561EC /* anticipate.caf */; };
0632051E250B6DD4001561EC /* choo.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FF250B6DD3001561EC /* choo.caf */; };
0632051F250B6DD4001561EC /* glass.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320500250B6DD3001561EC /* glass.caf */; };
06320520250B6DD4001561EC /* telegraph.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320501250B6DD3001561EC /* telegraph.caf */; };
06320521250B6DD4001561EC /* multiwayinvitation.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320502250B6DD3001561EC /* multiwayinvitation.caf */; };
06320522250B6DD4001561EC /* newmail.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320503250B6DD3001561EC /* newmail.caf */; };
06320523250B6DD4001561EC /* update.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320504250B6DD3001561EC /* update.caf */; };
06320524250B6DD4001561EC /* minuet.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320505250B6DD3001561EC /* minuet.caf */; };
06320525250B6DD4001561EC /* suspense.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320506250B6DD3001561EC /* suspense.caf */; };
06320526250B6DD4001561EC /* mailsent.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320507250B6DD3001561EC /* mailsent.caf */; };
06320527250B6DD4001561EC /* noir.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320508250B6DD3001561EC /* noir.caf */; };
06320528250B6DD4001561EC /* chime.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320509250B6DD4001561EC /* chime.caf */; };
06320529250B6DD4001561EC /* spell.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050A250B6DD4001561EC /* spell.caf */; };
0632052A250B6DD4001561EC /* electronic.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050B250B6DD4001561EC /* electronic.caf */; };
0632052B250B6DD4001561EC /* bell.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050C250B6DD4001561EC /* bell.caf */; };
0632052C250B6DD4001561EC /* horn.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050D250B6DD4001561EC /* horn.caf */; };
0632052D250B6DD4001561EC /* newsflash.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050E250B6DD4001561EC /* newsflash.caf */; };
0632CE1F20EC9098003FDF46 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0683487020510FB20024B6DA /* UserNotifications.framework */; };
0632CE2020EC9098003FDF46 /* UserNotificationsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0683487220510FB20024B6DA /* UserNotificationsUI.framework */; };
0632CE2320EC9098003FDF46 /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0632CE2220EC9098003FDF46 /* NotificationViewController.swift */; };
0632CE2620EC9098003FDF46 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0632CE2420EC9098003FDF46 /* MainInterface.storyboard */; };
0632CE2A20EC9098003FDF46 /* NotificationContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 0632CE1E20EC9098003FDF46 /* NotificationContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
0633E80A256A091B00ED0680 /* MJRefresh+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0633E809256A091B00ED0680 /* MJRefresh+Rx.swift */; };
0635A8052CE47DFE0027E00F /* SettingSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0635A8042CE47DFE0027E00F /* SettingSectionHeader.swift */; };
0635A8072CE4883A0027E00F /* DonateCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0635A8062CE4883A0027E00F /* DonateCell.swift */; };
0637FA7820E0926D00E80174 /* BarkTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA7720E0926D00E80174 /* BarkTargetType.swift */; };
0637FA7A20E092B300E80174 /* Observable+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA7920E092B300E80174 /* Observable+Extension.swift */; };
0637FA7C20E0930E00E80174 /* BarkApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA7B20E0930E00E80174 /* BarkApi.swift */; };
0637FA7E20E0969800E80174 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA7D20E0969800E80174 /* Client.swift */; };
0637FA8020E0981E00E80174 /* BarkSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA7F20E0981E00E80174 /* BarkSettings.swift */; };
0637FA8220E09C4B00E80174 /* BarkNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA8120E09C4B00E80174 /* BarkNavigationController.swift */; };
0637FA8620E0AB6600E80174 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA8520E0AB6600E80174 /* UIColor+Extension.swift */; };
0637FA8A20E0D58800E80174 /* NewServerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA8920E0D58800E80174 /* NewServerViewController.swift */; };
0637FA8C20E0D7A700E80174 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0637FA8B20E0D7A700E80174 /* BaseViewController.swift */; };
063B909B272149BF00431EC2 /* HomeViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063B909A272149BF00431EC2 /* HomeViewModelTests.swift */; };
0642B55A27EB13F100453D91 /* MutableTextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0642B55927EB13F100453D91 /* MutableTextCell.swift */; };
0642B55C27EB149900453D91 /* MutableTextCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0642B55B27EB149900453D91 /* MutableTextCellViewModel.swift */; };
0647DB682CE604AA00102066 /* MessageSettingFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0647DB672CE604AA00102066 /* MessageSettingFooter.swift */; };
064CAB9E256BE9090018155C /* PreviewCardCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064CAB9D256BE9090018155C /* PreviewCardCellViewModel.swift */; };
064CABA6256BE9510018155C /* PreviewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064CABA5256BE9510018155C /* PreviewModel.swift */; };
0653677629B719BC0038BDB8 /* CryptoSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06F08EA329B098DD006AB9CA /* CryptoSettingManager.swift */; };
0653677829B727A60038BDB8 /* CryptoSettingRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0653677729B727A60038BDB8 /* CryptoSettingRelay.swift */; };
065752C12CB6844A001426D8 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 065752C02CB6844A001426D8 /* Localizable.xcstrings */; };
065752C22CB6844A001426D8 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 065752C02CB6844A001426D8 /* Localizable.xcstrings */; };
065752C32CB6844A001426D8 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 065752C02CB6844A001426D8 /* Localizable.xcstrings */; };
065AE76B2987777F00323230 /* ArchiveSettingRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065AE76A2987777F00323230 /* ArchiveSettingRelay.swift */; };
065BE4402563D649002A8CA4 /* SoundsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065BE43F2563D649002A8CA4 /* SoundsViewModel.swift */; };
065BE4462563D7E5002A8CA4 /* ViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065BE4452563D7E5002A8CA4 /* ViewModelType.swift */; };
065BE44B2563D8E1002A8CA4 /* Reusable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065BE44A2563D8E1002A8CA4 /* Reusable.swift */; };
065BE4502563D939002A8CA4 /* SoundCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065BE44F2563D939002A8CA4 /* SoundCellViewModel.swift */; };
065BE4552565055F002A8CA4 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065BE4542565055F002A8CA4 /* HomeViewModel.swift */; };
0661A543204FDA4100965E4E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0661A542204FDA4100965E4E /* AppDelegate.swift */; };
0661A545204FDA4100965E4E /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0661A544204FDA4100965E4E /* HomeViewController.swift */; };
0661A54A204FDA4100965E4E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0661A549204FDA4100965E4E /* Assets.xcassets */; };
0661A54D204FDA4100965E4E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0661A54B204FDA4100965E4E /* LaunchScreen.storyboard */; };
0667D192247D162C005DE2ED /* MessageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0667D191247D162C005DE2ED /* MessageTableViewCell.swift */; };
0667D194247D1BA0005DE2ED /* Date+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0667D193247D1BA0005DE2ED /* Date+Extension.swift */; };
066890082D1946D500E106F2 /* MessageItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066890072D1946D500E106F2 /* MessageItemView.swift */; };
0668900B2D19525400E106F2 /* ShowLessAndClearView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0668900A2D19525400E106F2 /* ShowLessAndClearView.swift */; };
0668900D2D19582400E106F2 /* MessageGroupHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0668900C2D19582400E106F2 /* MessageGroupHeaderView.swift */; };
066DF4822D2D31A60092B04E /* MessageDeleteTimeRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066DF4812D2D31A30092B04E /* MessageDeleteTimeRange.swift */; };
066E0C8C2BB6AC9A00873838 /* AddSoundCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066E0C8B2BB6AC9A00873838 /* AddSoundCell.swift */; };
0672CB06256903F700570C9D /* MessageListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0672CB05256903F700570C9D /* MessageListViewModel.swift */; };
06787C392A710568008ABDD7 /* GesturePassTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06787C382A710568008ABDD7 /* GesturePassTextView.swift */; };
067AFB1C2E5D8BE300AE78E7 /* UNNotificationContent+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067AFB1B2E5D8BE300AE78E7 /* UNNotificationContent+Extension.swift */; };
067AFB1D2E5D8BED00AE78E7 /* UNNotificationContent+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067AFB1B2E5D8BE300AE78E7 /* UNNotificationContent+Extension.swift */; };
067B2EB525693E38008B6BE1 /* MessageSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067B2EB425693E38008B6BE1 /* MessageSection.swift */; };
06802E5320ECC40C00767047 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0661A549204FDA4100965E4E /* Assets.xcassets */; };
06840DBB272298FB001B3193 /* BKColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06840DBA272298FB001B3193 /* BKColor.swift */; };
0687F2A82CCB791A00B2A52F /* UIFont+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0687F2A72CCB791A00B2A52F /* UIFont+Extension.swift */; };
0687F2A92CCB791A00B2A52F /* UIFont+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0687F2A72CCB791A00B2A52F /* UIFont+Extension.swift */; };
0687F2AA2CCB7FA500B2A52F /* UIFont+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0687F2A72CCB791A00B2A52F /* UIFont+Extension.swift */; };
06885EB6247FB9880004A303 /* MessageSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06885EB5247FB9880004A303 /* MessageSettingsViewController.swift */; };
0689CF4C2C7484A7007203A6 /* BarkTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0689CF4B2C7484A7007203A6 /* BarkTabBarController.swift */; };
068A4B962D2E11CD00982449 /* MessageDeleteTimeRangeTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 068A4B952D2E11CD00982449 /* MessageDeleteTimeRangeTest.swift */; };
068EC15827ED99C900D5D11E /* ServerListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 068EC15727ED99C900D5D11E /* ServerListViewController.swift */; };
068EC15A27ED99E700D5D11E /* ServerListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 068EC15927ED99E700D5D11E /* ServerListViewModel.swift */; };
068F66B3247BD84C00DAD25A /* MessageListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 068F66B2247BD84C00DAD25A /* MessageListViewController.swift */; };
069332222E6A8E3100F9387F /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0603706A20E20A7C00F4CA05 /* String+Extension.swift */; };
069332232E6A8E3100F9387F /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0603706A20E20A7C00F4CA05 /* String+Extension.swift */; };
0699473D2D223094008D5E40 /* CustomTapTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0699473C2D223094008D5E40 /* CustomTapTextView.swift */; };
069C6CA42ED03C72007244BB /* MarkdownProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 069C6CA32ED03C72007244BB /* MarkdownProcessor.swift */; };
069C6CA52ED03E10007244BB /* MarkdownParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C777CF2ECEFF210032A044 /* MarkdownParser.swift */; };
069C6CA72ED03E27007244BB /* Markdown in Frameworks */ = {isa = PBXBuildFile; productRef = 069C6CA62ED03E27007244BB /* Markdown */; };
069C6CA92ED03F07007244BB /* BKColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06840DBA272298FB001B3193 /* BKColor.swift */; };
06B1158D247BA6D5006D91FB /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06B1158C247BA6D5006D91FB /* CloudKit.framework */; };
06B1158F247BB1FB006D91FB /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B1158E247BB1FB006D91FB /* Message.swift */; };
06B11591247BC132006D91FB /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B1158E247BB1FB006D91FB /* Message.swift */; };
06BBB88725650C6C0076F63E /* ArchiveSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C5953224811505006B98F3 /* ArchiveSettingManager.swift */; };
06BBB89125650CCF0076F63E /* ArchiveSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C5953224811505006B98F3 /* ArchiveSettingManager.swift */; };
06BBB896256518760076F63E /* NewServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BBB895256518760076F63E /* NewServerViewModel.swift */; };
06BBB8B72567AC140076F63E /* MessageSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BBB8B62567AC140076F63E /* MessageSettingsViewModel.swift */; };
06BBB8BC2567B3AD0076F63E /* ArchiveSettingCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BBB8BB2567B3AD0076F63E /* ArchiveSettingCellViewModel.swift */; };
06BBB8C12567B3EF0076F63E /* BaseTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BBB8C02567B3EF0076F63E /* BaseTableViewCell.swift */; };
06BBB8C92567B6730076F63E /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BBB8C82567B6730076F63E /* Operators.swift */; };
06BBB8CE2567B8E60076F63E /* silence.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06BBB8CD2567B8E60076F63E /* silence.caf */; };
06BCAE562CDB19260092867A /* GroupMuteSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BCAE552CDB19260092867A /* GroupMuteSettingManager.swift */; };
06BCAE572CDB19420092867A /* GroupMuteSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BCAE552CDB19260092867A /* GroupMuteSettingManager.swift */; };
06BCAE582CDB19420092867A /* GroupMuteSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BCAE552CDB19260092867A /* GroupMuteSettingManager.swift */; };
06BCAE5B2CDB25120092867A /* MuteProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BCAE5A2CDB25120092867A /* MuteProcessor.swift */; };
06BD4DAA2901352E003364DB /* Object+Dictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BD4DA92901352E003364DB /* Object+Dictionary.swift */; };
06BE84042E6EAE7100E6F856 /* InsetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06BE84032E6EAE7100E6F856 /* InsetView.swift */; };
06C2CF232685B88D0034B127 /* TextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2CF222685B88D0034B127 /* TextCell.swift */; };
06C2CF252685BDB80034B127 /* SpacerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2CF242685BDB80034B127 /* SpacerCell.swift */; };
06C5952D2480E3F8006B98F3 /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C5952C2480E3F8006B98F3 /* LabelCell.swift */; };
06C5953124811392006B98F3 /* ArchiveSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C5953024811392006B98F3 /* ArchiveSettingCell.swift */; };
06C595362481160F006B98F3 /* BKLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C595352481160F006B98F3 /* BKLabel.swift */; };
06C777D02ECEFF210032A044 /* MarkdownParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C777CF2ECEFF210032A044 /* MarkdownParser.swift */; };
06C777D32ECF05990032A044 /* Markdown in Frameworks */ = {isa = PBXBuildFile; productRef = 06C777D22ECF05990032A044 /* Markdown */; };
06CF784721C7A50300A052D7 /* NotificationServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 06CF784021C7A50300A052D7 /* NotificationServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
06CF784C21C7A51200A052D7 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06CF784B21C7A51200A052D7 /* NotificationService.swift */; };
06D69E202C1159E200161A35 /* glass.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320500250B6DD3001561EC /* glass.caf */; };
06D69E212C1159E200161A35 /* sherwoodforest.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F5250B6DD2001561EC /* sherwoodforest.caf */; };
06D69E222C1159E200161A35 /* ladder.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F9250B6DD2001561EC /* ladder.caf */; };
06D69E232C1159E200161A35 /* chime.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320509250B6DD4001561EC /* chime.caf */; };
06D69E242C1159E200161A35 /* anticipate.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FE250B6DD2001561EC /* anticipate.caf */; };
06D69E252C1159E200161A35 /* update.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320504250B6DD3001561EC /* update.caf */; };
06D69E262C1159E200161A35 /* suspense.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320506250B6DD3001561EC /* suspense.caf */; };
06D69E272C1159E200161A35 /* newmail.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320503250B6DD3001561EC /* newmail.caf */; };
06D69E282C1159E200161A35 /* noir.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320508250B6DD3001561EC /* noir.caf */; };
06D69E292C1159E200161A35 /* birdsong.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FC250B6DD2001561EC /* birdsong.caf */; };
06D69E2A2C1159E200161A35 /* minuet.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320505250B6DD3001561EC /* minuet.caf */; };
06D69E2B2C1159E200161A35 /* shake.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F2250B6DD1001561EC /* shake.caf */; };
06D69E2C2C1159E200161A35 /* newsflash.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050E250B6DD4001561EC /* newsflash.caf */; };
06D69E2D2C1159E200161A35 /* paymentsuccess.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F1250B6DD1001561EC /* paymentsuccess.caf */; };
06D69E2E2C1159E200161A35 /* descent.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F8250B6DD2001561EC /* descent.caf */; };
06D69E2F2C1159E200161A35 /* mailsent.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320507250B6DD3001561EC /* mailsent.caf */; };
06D69E302C1159E200161A35 /* tiptoes.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FA250B6DD2001561EC /* tiptoes.caf */; };
06D69E312C1159E200161A35 /* telegraph.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320501250B6DD3001561EC /* telegraph.caf */; };
06D69E322C1159E200161A35 /* healthnotification.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F6250B6DD2001561EC /* healthnotification.caf */; };
06D69E332C1159E200161A35 /* typewriters.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FD250B6DD2001561EC /* typewriters.caf */; };
06D69E342C1159E200161A35 /* bell.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050C250B6DD4001561EC /* bell.caf */; };
06D69E352C1159E200161A35 /* bloom.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F4250B6DD1001561EC /* bloom.caf */; };
06D69E362C1159E200161A35 /* spell.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050A250B6DD4001561EC /* spell.caf */; };
06D69E372C1159E200161A35 /* choo.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204FF250B6DD3001561EC /* choo.caf */; };
06D69E382C1159E200161A35 /* multiwayinvitation.caf in Resources */ = {isa = PBXBuildFile; fileRef = 06320502250B6DD3001561EC /* multiwayinvitation.caf */; };
06D69E392C1159E200161A35 /* horn.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050D250B6DD4001561EC /* horn.caf */; };
06D69E3A2C1159E200161A35 /* electronic.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0632050B250B6DD4001561EC /* electronic.caf */; };
06D69E3B2C1159E200161A35 /* calypso.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F7250B6DD2001561EC /* calypso.caf */; };
06D69E3C2C1159E200161A35 /* gotosleep.caf in Resources */ = {isa = PBXBuildFile; fileRef = 063204F0250B6DD1001561E
gitextract_lx2udhx1/
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ ├── deploy-docs.yaml
│ ├── testflight.yaml
│ └── tests.yaml
├── .gitignore
├── Bark/
│ ├── AppDelegate+Realm.swift
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Colors/
│ │ │ ├── Contents.json
│ │ │ ├── background.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── background_seconday.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── black.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── blue_base.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── blue_darken1.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── blue_darken5.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── darkText_primary.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── darkText_secondary.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_base.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_darken1.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_darken2.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_darken3.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_darken4.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten1.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten2.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten3.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten4.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── grey_lighten5.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── lightBlue_darken3.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── notification_copy_color.colorset/
│ │ │ │ └── Contents.json
│ │ │ └── white.colorset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── back.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_check_circle_outline_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_close_white_48pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_delete_outline_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_file_copy_white_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_filter_drama_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_folder_open_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_gite_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_http_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_https_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_keyboard_arrow_down_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_manage_accounts_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_qr_code_scanner_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_radio_button_unchecked_black_24pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_remove_black_20pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_wifi_black_20pt.imageset/
│ │ │ └── Contents.json
│ │ ├── baseline_wifi_off_black_20pt.imageset/
│ │ │ └── Contents.json
│ │ ├── copyTest.imageset/
│ │ │ └── Contents.json
│ │ ├── criticalAlert.imageset/
│ │ │ └── Contents.json
│ │ ├── group.imageset/
│ │ │ └── Contents.json
│ │ ├── group_collapse.imageset/
│ │ │ └── Contents.json
│ │ ├── group_expand.imageset/
│ │ │ └── Contents.json
│ │ ├── icon.imageset/
│ │ │ └── Contents.json
│ │ ├── keyboard_arrow_right_symbol.symbolset/
│ │ │ └── Contents.json
│ │ ├── music_note-music_note_symbol.symbolset/
│ │ │ └── Contents.json
│ │ ├── offline.imageset/
│ │ │ └── Contents.json
│ │ ├── online.imageset/
│ │ │ └── Contents.json
│ │ └── warning.imageset/
│ │ └── Contents.json
│ ├── Bark.entitlements
│ ├── Base.lproj/
│ │ └── LaunchScreen.storyboard
│ ├── Info.plist
│ ├── Intents/
│ │ ├── OptionsProvider.swift
│ │ ├── PushResponse.swift
│ │ ├── PushToCurrentIntent.swift
│ │ └── PushToOtherIntent.swift
│ └── Localizable.xcstrings
├── Bark.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ ├── Bark.xcscheme
│ ├── NotificationContentExtension.xcscheme
│ └── NotificationServiceExtension.xcscheme
├── Bark.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ ├── IDEWorkspaceChecks.plist
│ └── swiftpm/
│ └── Package.resolved
├── BarkTests/
│ ├── BarkTests.swift
│ ├── HomeViewModelTests.swift
│ ├── Info.plist
│ └── MessageDeleteTimeRangeTest.swift
├── CLAUDE.md
├── Common/
│ ├── ArchiveSettingManager.swift
│ ├── ArchiveSettingRelay.swift
│ ├── BKColor.swift
│ ├── BarkSettings.swift
│ ├── Client.swift
│ ├── CryptoSettingManager.swift
│ ├── CryptoSettingRelay.swift
│ ├── Date+Extension.swift
│ ├── Defines.swift
│ ├── Error+Extension.swift
│ ├── GroupMuteSettingManager.swift
│ ├── MJRefresh+Rx.swift
│ ├── MarkdownParser.swift
│ ├── Moya/
│ │ ├── BarkApi.swift
│ │ ├── BarkTargetType.swift
│ │ └── Observable+Extension.swift
│ ├── Operators.swift
│ ├── RealmConfiguration.swift
│ ├── Reusable.swift
│ ├── ServerManager.swift
│ ├── SharedDefines.swift
│ ├── String+Extension.swift
│ ├── UIColor+Extension.swift
│ ├── UIFont+Extension.swift
│ └── ViewModelType.swift
├── Controller/
│ ├── BarkNavigationController.swift
│ ├── BarkSFSafariViewController.swift
│ ├── BarkSplitViewController.swift
│ ├── BarkTabBarController.swift
│ ├── BaseViewController.swift
│ ├── CryptoSettingController.swift
│ ├── CryptoSettingViewModel.swift
│ ├── HomeViewController.swift
│ ├── HomeViewModel.swift
│ ├── MessageListViewController.swift
│ ├── MessageListViewModel.swift
│ ├── MessageSettingsViewController.swift
│ ├── MessageSettingsViewModel.swift
│ ├── NewServerViewController.swift
│ ├── NewServerViewModel.swift
│ ├── QRScannerViewController.swift
│ ├── SectionViewController-iPad.swift
│ ├── SectionViewModel-iPad.swift
│ ├── ServerListViewController.swift
│ ├── ServerListViewModel.swift
│ ├── SoundsViewController.swift
│ └── SoundsViewModel.swift
├── Gemfile
├── LICENSE
├── Model/
│ ├── Algorithm.swift
│ ├── Message.swift
│ ├── MessageDeleteTimeRange.swift
│ ├── MessageItemModel.swift
│ ├── MessageSection.swift
│ ├── Object+Dictionary.swift
│ └── PreviewModel.swift
├── NotificationServiceExtension/
│ ├── Info.plist
│ ├── NotificationService.swift
│ ├── NotificationServiceExtension.entitlements
│ └── Processor/
│ ├── ArchiveProcessor.swift
│ ├── AutoCopyProcessor.swift
│ ├── BadgeProcessor.swift
│ ├── CallProcessor.swift
│ ├── CiphertextProcessor.swift
│ ├── IconProcessor.swift
│ ├── ImageDownloader.swift
│ ├── ImageProcessor.swift
│ ├── LevelProcessor.swift
│ ├── MarkdownProcessor.swift
│ ├── MuteProcessor.swift
│ └── NotificationContentProcessor.swift
├── Podfile
├── README.md
├── README.zh.md
├── Sounds/
│ ├── alarm.caf
│ ├── anticipate.caf
│ ├── bell.caf
│ ├── birdsong.caf
│ ├── bloom.caf
│ ├── calypso.caf
│ ├── chime.caf
│ ├── choo.caf
│ ├── descent.caf
│ ├── electronic.caf
│ ├── fanfare.caf
│ ├── glass.caf
│ ├── gotosleep.caf
│ ├── healthnotification.caf
│ ├── horn.caf
│ ├── ladder.caf
│ ├── mailsent.caf
│ ├── minuet.caf
│ ├── multiwayinvitation.caf
│ ├── newmail.caf
│ ├── newsflash.caf
│ ├── noir.caf
│ ├── paymentsuccess.caf
│ ├── shake.caf
│ ├── sherwoodforest.caf
│ ├── silence.caf
│ ├── spell.caf
│ ├── suspense.caf
│ ├── telegraph.caf
│ ├── tiptoes.caf
│ ├── typewriters.caf
│ └── update.caf
├── View/
│ ├── AddSoundCell.swift
│ ├── ArchiveSettingCell.swift
│ ├── ArchiveSettingCellViewModel.swift
│ ├── BKButton.swift
│ ├── BKDropDownCell.swift
│ ├── BKDropDownCell.xib
│ ├── BKLabel.swift
│ ├── BaseTableViewCell.swift
│ ├── BorderTextField.swift
│ ├── DonateCell.swift
│ ├── DropBoxView.swift
│ ├── GesturePassTextView.swift
│ ├── GradientButton.swift
│ ├── HUD.swift
│ ├── InsetView.swift
│ ├── LabelCell.swift
│ ├── MessageList/
│ │ ├── CustomTapTextView.swift
│ │ ├── MessageGroupHeaderView.swift
│ │ ├── MessageGroupMoreView.swift
│ │ ├── MessageItemView.swift
│ │ ├── MessageTableViewCell.swift
│ │ └── ShowLessAndClearView.swift
│ ├── MessageSettingFooter.swift
│ ├── MutableTextCell.swift
│ ├── MutableTextCellViewModel.swift
│ ├── PreviewCardCell.swift
│ ├── PreviewCardCellViewModel.swift
│ ├── ServerListTableViewCell.swift
│ ├── ServerListTableViewCellViewModel.swift
│ ├── SettingSectionHeader.swift
│ ├── SoundCell.swift
│ ├── SoundCellViewModel.swift
│ ├── SpacerCell.swift
│ ├── TextCell.swift
│ └── UINavigationItem+Extension.swift
├── check_unused_translations.py
├── docs/
│ ├── .nojekyll
│ ├── CNAME
│ ├── README.md
│ ├── _coverpage.md
│ ├── _navbar.md
│ ├── _sidebar.md
│ ├── batch.md
│ ├── build.md
│ ├── cert.md
│ ├── deploy.md
│ ├── en-us/
│ │ ├── README.md
│ │ ├── _coverpage.md
│ │ ├── _navbar.md
│ │ ├── _sidebar.md
│ │ ├── batch.md
│ │ ├── build.md
│ │ ├── cert.md
│ │ ├── deploy.md
│ │ ├── encryption.md
│ │ ├── faq.md
│ │ ├── privacy.md
│ │ └── tutorial.md
│ ├── encryption.md
│ ├── faq.md
│ ├── index.html
│ ├── privacy.md
│ └── tutorial.md
├── fastlane/
│ ├── Appfile
│ ├── Fastfile
│ └── Matchfile
└── notificationContentExtension/
├── Base.lproj/
│ └── MainInterface.storyboard
├── Info.plist
├── NotificationContentExtension.entitlements
├── NotificationViewController.swift
└── UNNotificationContent+Extension.swift
SYMBOL INDEX (10 symbols across 1 files)
FILE: check_unused_translations.py
class BarkLocalizationAnalyzer (line 23) | class BarkLocalizationAnalyzer:
method __init__ (line 24) | def __init__(self, project_root):
method extract_all_keys (line 28) | def extract_all_keys(self):
method find_swift_files (line 38) | def find_swift_files(self):
method extract_used_keys_from_file (line 47) | def extract_used_keys_from_file(self, file_path, all_defined_keys):
method find_all_used_keys (line 88) | def find_all_used_keys(self, all_defined_keys):
method analyze (line 113) | def analyze(self):
method save_results (line 149) | def save_results(self, result):
method print_summary (line 154) | def print_summary(self, result):
function main (line 190) | def main():
Condensed preview — 257 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (774K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 62,
"preview": "# These are supported funding model platforms\n\ngithub: [Finb]\n"
},
{
"path": ".github/workflows/deploy-docs.yaml",
"chars": 600,
"preview": "name: Deploy Docs to Cloudflare Pages\n\non:\n push:\n branches:\n - master\n paths:\n - 'docs/**'\n workflow_"
},
{
"path": ".github/workflows/testflight.yaml",
"chars": 1663,
"preview": "name: Deploy to App Store \n\non:\n workflow_dispatch:\n inputs:\n storeVersionNumber:\n description: 'Store V"
},
{
"path": ".github/workflows/tests.yaml",
"chars": 857,
"preview": "name: Tests\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n\njobs:\n tests:\n r"
},
{
"path": ".gitignore",
"chars": 148,
"preview": "*.mode*v*\n*.pbxuser\n*.xccheckout\n#*.xcbkptlist\n#*.xcscheme\n#*.xcworkspacedata\n*.xcuserstate\nbuild/\nPods/\n.DS_Store\n._.*\n"
},
{
"path": "Bark/AppDelegate+Realm.swift",
"chars": 4845,
"preview": "//\n// AppDelegate+Realm.swift\n// Bark\n//\n// Created by huangfeng on 12/18/25.\n// Copyright © 2025 Fin. All rights re"
},
{
"path": "Bark/AppDelegate.swift",
"chars": 11341,
"preview": "//\n// AppDelegate.swift\n// Bark\n//\n// Created by huangfeng on 2018/3/7.\n// Copyright © 2018年 Fin. All rights reserve"
},
{
"path": "Bark/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 208,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"bark.png\",\n \"idiom\" : \"universal\",\n \"platform\" : \"ios\",\n \"size"
},
{
"path": "Bark/Assets.xcassets/Colors/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Bark/Assets.xcassets/Colors/background.colorset/Contents.json",
"chars": 677,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/background_seconday.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/black.colorset/Contents.json",
"chars": 695,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/blue_base.colorset/Contents.json",
"chars": 681,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/blue_darken1.colorset/Contents.json",
"chars": 681,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/blue_darken5.colorset/Contents.json",
"chars": 679,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/darkText_primary.colorset/Contents.json",
"chars": 677,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"0"
},
{
"path": "Bark/Assets.xcassets/Colors/darkText_secondary.colorset/Contents.json",
"chars": 677,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"0"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_base.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_darken1.colorset/Contents.json",
"chars": 683,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_darken2.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_darken3.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_darken4.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_lighten1.colorset/Contents.json",
"chars": 683,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_lighten2.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_lighten3.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_lighten4.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/grey_lighten5.colorset/Contents.json",
"chars": 680,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/lightBlue_darken3.colorset/Contents.json",
"chars": 681,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/notification_copy_color.colorset/Contents.json",
"chars": 1905,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Colors/white.colorset/Contents.json",
"chars": 695,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "Bark/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Bark/Assets.xcassets/back.imageset/Contents.json",
"chars": 338,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "Bark/Assets.xcassets/baseline_check_circle_outline_black_24pt.imageset/Contents.json",
"chars": 550,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_check_circle_outline_black_24pt_1x.png\",\n \"idiom\" : \"universal\""
},
{
"path": "Bark/Assets.xcassets/baseline_close_white_48pt.imageset/Contents.json",
"chars": 505,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_close_white_48pt_1x.png\",\n \"idiom\" : \"universal\",\n \"scale\""
},
{
"path": "Bark/Assets.xcassets/baseline_delete_outline_black_24pt.imageset/Contents.json",
"chars": 532,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_delete_outline_black_24pt_1x.png\",\n \"idiom\" : \"universal\",\n "
},
{
"path": "Bark/Assets.xcassets/baseline_file_copy_white_24pt.imageset/Contents.json",
"chars": 516,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"baseline_file_copy_white_24pt_1x.png\",\n \"sc"
},
{
"path": "Bark/Assets.xcassets/baseline_filter_drama_black_24pt.imageset/Contents.json",
"chars": 526,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_filter_drama_black_24pt_1x.png\",\n \"idiom\" : \"universal\",\n "
},
{
"path": "Bark/Assets.xcassets/baseline_folder_open_black_24pt.imageset/Contents.json",
"chars": 523,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_folder_open_black_24pt_1x.png\",\n \"idiom\" : \"universal\",\n \""
},
{
"path": "Bark/Assets.xcassets/baseline_gite_black_24pt.imageset/Contents.json",
"chars": 502,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_gite_black_24pt_1x.png\",\n \"idiom\" : \"universal\",\n \"scale\" "
},
{
"path": "Bark/Assets.xcassets/baseline_http_black_24pt.imageset/Contents.json",
"chars": 501,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"baseline_http_black_24pt_1x.png\",\n \"scale\" "
},
{
"path": "Bark/Assets.xcassets/baseline_https_black_24pt.imageset/Contents.json",
"chars": 504,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"baseline_https_black_24pt_1x.png\",\n \"scale\""
},
{
"path": "Bark/Assets.xcassets/baseline_keyboard_arrow_down_black_24pt.imageset/Contents.json",
"chars": 547,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_keyboard_arrow_down_black_24pt_1x.png\",\n \"idiom\" : \"universal\","
},
{
"path": "Bark/Assets.xcassets/baseline_manage_accounts_black_24pt.imageset/Contents.json",
"chars": 535,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_manage_accounts_black_24pt_1x.png\",\n \"idiom\" : \"universal\",\n "
},
{
"path": "Bark/Assets.xcassets/baseline_qr_code_scanner_black_24pt.imageset/Contents.json",
"chars": 535,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_qr_code_scanner_black_24pt_1x.png\",\n \"idiom\" : \"universal\",\n "
},
{
"path": "Bark/Assets.xcassets/baseline_radio_button_unchecked_black_24pt.imageset/Contents.json",
"chars": 556,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_radio_button_unchecked_black_24pt_1x.png\",\n \"idiom\" : \"universa"
},
{
"path": "Bark/Assets.xcassets/baseline_remove_black_20pt.imageset/Contents.json",
"chars": 508,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_remove_black_20pt_1x.png\",\n \"idiom\" : \"universal\",\n \"scale"
},
{
"path": "Bark/Assets.xcassets/baseline_wifi_black_20pt.imageset/Contents.json",
"chars": 502,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_wifi_black_20pt_1x.png\",\n \"idiom\" : \"universal\",\n \"scale\" "
},
{
"path": "Bark/Assets.xcassets/baseline_wifi_off_black_20pt.imageset/Contents.json",
"chars": 514,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"baseline_wifi_off_black_20pt_1x.png\",\n \"idiom\" : \"universal\",\n \"sca"
},
{
"path": "Bark/Assets.xcassets/copyTest.imageset/Contents.json",
"chars": 906,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"appearances\" : [\n {\n"
},
{
"path": "Bark/Assets.xcassets/criticalAlert.imageset/Contents.json",
"chars": 887,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"appearances\" : [\n {\n"
},
{
"path": "Bark/Assets.xcassets/group.imageset/Contents.json",
"chars": 916,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"appearances\" : [\n {\n"
},
{
"path": "Bark/Assets.xcassets/group_collapse.imageset/Contents.json",
"chars": 435,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"filename\" : \"folder_code_24"
},
{
"path": "Bark/Assets.xcassets/group_expand.imageset/Contents.json",
"chars": 427,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"filename\" : \"folder_code_24"
},
{
"path": "Bark/Assets.xcassets/icon.imageset/Contents.json",
"chars": 914,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"appearances\" : [\n {\n"
},
{
"path": "Bark/Assets.xcassets/keyboard_arrow_right_symbol.symbolset/Contents.json",
"chars": 199,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n },\n \"symbols\" : [\n {\n \"filename\" : \"keyboard_arrow_r"
},
{
"path": "Bark/Assets.xcassets/music_note-music_note_symbol.symbolset/Contents.json",
"chars": 179,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n },\n \"symbols\" : [\n {\n \"filename\" : \"music_note-music"
},
{
"path": "Bark/Assets.xcassets/offline.imageset/Contents.json",
"chars": 308,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "Bark/Assets.xcassets/online.imageset/Contents.json",
"chars": 307,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "Bark/Assets.xcassets/warning.imageset/Contents.json",
"chars": 308,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "Bark/Bark.entitlements",
"chars": 567,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Bark/Base.lproj/LaunchScreen.storyboard",
"chars": 1997,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "Bark/Info.plist",
"chars": 2222,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Bark/Intents/OptionsProvider.swift",
"chars": 2302,
"preview": "//\n// OptionsProvider.swift\n// Bark\n//\n// Created by huangfeng on 2/21/25.\n// Copyright © 2025 Fin. All rights reser"
},
{
"path": "Bark/Intents/PushResponse.swift",
"chars": 205,
"preview": "//\n// PushResponse.swift\n// Bark\n//\n// Created by huangfeng on 2/21/25.\n// Copyright © 2025 Fin. All rights reserved"
},
{
"path": "Bark/Intents/PushToCurrentIntent.swift",
"chars": 2433,
"preview": "//\n// Intents.swift\n// Bark\n//\n// Created by huangfeng on 2/20/25.\n// Copyright © 2025 Fin. All rights reserved.\n//\n"
},
{
"path": "Bark/Intents/PushToOtherIntent.swift",
"chars": 2398,
"preview": "//\n// PushToOtherIntent.swift\n// Bark\n//\n// Created by huangfeng on 2/21/25.\n// Copyright © 2025 Fin. All rights res"
},
{
"path": "Bark/Localizable.xcstrings",
"chars": 100311,
"preview": "{\n \"sourceLanguage\" : \"en\",\n \"strings\" : {\n \"AddedSuccessfully\" : {\n \"extractionState\" : \"manual\",\n \"loca"
},
{
"path": "Bark.xcodeproj/project.pbxproj",
"chars": 129294,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Bark.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 149,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:Bark.xcodeproj\""
},
{
"path": "Bark.xcodeproj/xcshareddata/xcschemes/Bark.xcscheme",
"chars": 3234,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1640\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Bark.xcodeproj/xcshareddata/xcschemes/NotificationContentExtension.xcscheme",
"chars": 3993,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1640\"\n wasCreatedForAppExtension = \"YES\"\n ve"
},
{
"path": "Bark.xcodeproj/xcshareddata/xcschemes/NotificationServiceExtension.xcscheme",
"chars": 3993,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1640\"\n wasCreatedForAppExtension = \"YES\"\n ve"
},
{
"path": "Bark.xcworkspace/contents.xcworkspacedata",
"chars": 222,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Bark.xcodeproj"
},
{
"path": "Bark.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Bark.xcworkspace/xcshareddata/swiftpm/Package.resolved",
"chars": 666,
"preview": "{\n \"originHash\" : \"bb354f5ee26f97a80bea96da70628d71c97b25e01e4e845afe4f5b1d0b6cf6e2\",\n \"pins\" : [\n {\n \"identit"
},
{
"path": "BarkTests/BarkTests.swift",
"chars": 898,
"preview": "//\n// BarkTests.swift\n// BarkTests\n//\n// Created by huangfeng on 2021/6/24.\n// Copyright © 2021 Fin. All rights rese"
},
{
"path": "BarkTests/HomeViewModelTests.swift",
"chars": 5048,
"preview": "//\n// HomeViewModelTests.swift\n// BarkTests\n//\n// Created by huangfeng on 2021/10/21.\n// Copyright © 2021 Fin. All r"
},
{
"path": "BarkTests/Info.plist",
"chars": 727,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "BarkTests/MessageDeleteTimeRangeTest.swift",
"chars": 3031,
"preview": "//\n// MessageDeleteTimeRangeTest.swift\n// BarkTests\n//\n// Created by huangfeng on 1/8/25.\n// Copyright © 2025 Fin. A"
},
{
"path": "CLAUDE.md",
"chars": 6763,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "Common/ArchiveSettingManager.swift",
"chars": 566,
"preview": "//\n// ArchiveSettingManager.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/29.\n// Copyright © 2020 Fin. All righ"
},
{
"path": "Common/ArchiveSettingRelay.swift",
"chars": 591,
"preview": "//\n// ArchiveSettingRelay.swift\n// Bark\n//\n// Created by huangfeng on 2023/1/30.\n// Copyright © 2023 Fin. All rights"
},
{
"path": "Common/BKColor.swift",
"chars": 1483,
"preview": "//\n// BKColor.swift\n// Bark\n//\n// Created by huangfeng on 2021/10/22.\n// Copyright © 2021 Fin. All rights reserved.\n"
},
{
"path": "Common/BarkSettings.swift",
"chars": 1950,
"preview": "//\n// BarkSettings.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All rights reserv"
},
{
"path": "Common/Client.swift",
"chars": 3235,
"preview": "//\n// Client.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All rights reserved.\n//"
},
{
"path": "Common/CryptoSettingManager.swift",
"chars": 1092,
"preview": "//\n// CryptoSettingManager.swift\n// Bark\n//\n// Created by huangfeng on 2023/3/2.\n// Copyright © 2023 Fin. All rights"
},
{
"path": "Common/CryptoSettingRelay.swift",
"chars": 593,
"preview": "//\n// CryptoSettingRelay.swift\n// Bark\n//\n// Created by huangfeng on 2023/3/7.\n// Copyright © 2023 Fin. All rights r"
},
{
"path": "Common/Date+Extension.swift",
"chars": 2377,
"preview": "//\n// Date+Extension.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/26.\n// Copyright © 2020 Fin. All rights rese"
},
{
"path": "Common/Defines.swift",
"chars": 992,
"preview": "//\n// Defines.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/26.\n// Copyright © 2018 Fin. All rights reserved.\n/"
},
{
"path": "Common/Error+Extension.swift",
"chars": 685,
"preview": "//\n// Error+Extension.swift\n// Bark\n//\n// Created by huangfeng on 2023/3/3.\n// Copyright © 2023 Fin. All rights rese"
},
{
"path": "Common/GroupMuteSettingManager.swift",
"chars": 919,
"preview": "//\n// GroupMuteSettingManager.swift\n// Bark\n//\n// Created by huangfeng on 11/6/24.\n// Copyright © 2024 Fin. All righ"
},
{
"path": "Common/MJRefresh+Rx.swift",
"chars": 2269,
"preview": "//\n// MJRefresh+Rx.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/22.\n// Copyright © 2020 Fin. All rights reser"
},
{
"path": "Common/MarkdownParser.swift",
"chars": 12113,
"preview": "//\n// MarkdownParser.swift\n// Bark\n//\n// Created by huangfeng on 2025/11/20.\n// Copyright © 2025 Fin. All rights res"
},
{
"path": "Common/Moya/BarkApi.swift",
"chars": 1183,
"preview": "//\n// BarkApi.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All rights reserved.\n/"
},
{
"path": "Common/Moya/BarkTargetType.swift",
"chars": 3295,
"preview": "//\n// BarkTargetType.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All rights rese"
},
{
"path": "Common/Moya/Observable+Extension.swift",
"chars": 4301,
"preview": "//\n// Observable+Extension.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All right"
},
{
"path": "Common/Operators.swift",
"chars": 3305,
"preview": "//\n// Operators.swift\n// RxExample\n//\n// Created by Krunoslav Zaher on 12/6/15.\n// Copyright © 2015 Krunoslav Zaher."
},
{
"path": "Common/RealmConfiguration.swift",
"chars": 1212,
"preview": "//\n// RealmConfiguration.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyright"
},
{
"path": "Common/Reusable.swift",
"chars": 1274,
"preview": "//\n// Reusable.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/17.\n// Copyright © 2020 Fin. All rights reserved."
},
{
"path": "Common/ServerManager.swift",
"chars": 5556,
"preview": "//\n// ServerManager.swift\n// Bark\n//\n// Created by huangfeng on 2018/3/21.\n// Copyright © 2018年 Fin. All rights rese"
},
{
"path": "Common/SharedDefines.swift",
"chars": 189,
"preview": "//\n// SharedDefines.swift\n// Bark\n//\n// Created by huangfeng on 2024/7/26.\n// Copyright © 2024 Fin. All rights reser"
},
{
"path": "Common/String+Extension.swift",
"chars": 1828,
"preview": "//\n// String+Extension.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/26.\n// Copyright © 2018 Fin. All rights re"
},
{
"path": "Common/UIColor+Extension.swift",
"chars": 885,
"preview": "//\n// UIColor+Extension.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All rights r"
},
{
"path": "Common/UIFont+Extension.swift",
"chars": 829,
"preview": "//\n// UIFont+Extension.swift\n// Bark\n//\n// Created by huangfeng on 10/25/24.\n// Copyright © 2024 Fin. All rights res"
},
{
"path": "Common/ViewModelType.swift",
"chars": 316,
"preview": "//\n// ViewModelType.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/17.\n// Copyright © 2020 Fin. All rights rese"
},
{
"path": "Controller/BarkNavigationController.swift",
"chars": 2372,
"preview": "//\n// BarkNavigationController.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All r"
},
{
"path": "Controller/BarkSFSafariViewController.swift",
"chars": 512,
"preview": "//\n// BarkSFSafariViewController.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/26.\n// Copyright © 2018 Fin. All"
},
{
"path": "Controller/BarkSplitViewController.swift",
"chars": 2001,
"preview": "//\n// BarkSplitViewController.swift\n// Bark\n//\n// Created by sidguan on 2024/6/30.\n// Copyright © 2024 Fin. All righ"
},
{
"path": "Controller/BarkTabBarController.swift",
"chars": 1277,
"preview": "//\n// BarkTabBarController.swift\n// Bark\n//\n// Created by huangfeng on 2024/8/20.\n// Copyright © 2024 Fin. All right"
},
{
"path": "Controller/BaseViewController.swift",
"chars": 1272,
"preview": "//\n// BaseViewController.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All rights "
},
{
"path": "Controller/CryptoSettingController.swift",
"chars": 9424,
"preview": "//\n// CryptoSettingController.swift\n// Bark\n//\n// Created by huangfeng on 2022/11/10.\n// Copyright © 2022 Fin. All r"
},
{
"path": "Controller/CryptoSettingViewModel.swift",
"chars": 7659,
"preview": "//\n// CryptoSettingViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2022/11/10.\n// Copyright © 2022 Fin. All ri"
},
{
"path": "Controller/HomeViewController.swift",
"chars": 9288,
"preview": "//\n// HomeViewController.swift\n// Bark\n//\n// Created by huangfeng on 2018/3/7.\n// Copyright © 2018年 Fin. All rights "
},
{
"path": "Controller/HomeViewModel.swift",
"chars": 9158,
"preview": "//\n// HomeViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/18.\n// Copyright © 2020 Fin. All rights rese"
},
{
"path": "Controller/MessageListViewController.swift",
"chars": 19617,
"preview": "//\n// MessageListViewController.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/25.\n// Copyright © 2020 Fin. All "
},
{
"path": "Controller/MessageListViewModel.swift",
"chars": 15334,
"preview": "//\n// MessageListViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/21.\n// Copyright © 2020 Fin. All righ"
},
{
"path": "Controller/MessageSettingsViewController.swift",
"chars": 14914,
"preview": "//\n// MessageSettingsViewController.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/28.\n// Copyright © 2020 Fin. "
},
{
"path": "Controller/MessageSettingsViewModel.swift",
"chars": 8244,
"preview": "//\n// MessageSettingsViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/20.\n// Copyright © 2020 Fin. All "
},
{
"path": "Controller/NewServerViewController.swift",
"chars": 5275,
"preview": "//\n// NewServerViewController.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/25.\n// Copyright © 2018 Fin. All ri"
},
{
"path": "Controller/NewServerViewModel.swift",
"chars": 3352,
"preview": "//\n// NewServerViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/18.\n// Copyright © 2020 Fin. All rights"
},
{
"path": "Controller/QRScannerViewController.swift",
"chars": 2012,
"preview": "//\n// QRScannerViewController.swift\n// Bark\n//\n// Created by huangfeng on 2022/3/10.\n// Copyright © 2022 Fin. All ri"
},
{
"path": "Controller/SectionViewController-iPad.swift",
"chars": 3238,
"preview": "//\n// SectionTableViewController-iPad.swift\n// Bark\n//\n// Created by sidguan on 2024/6/23.\n// Copyright © 2024 Fin. "
},
{
"path": "Controller/SectionViewModel-iPad.swift",
"chars": 1277,
"preview": "//\n// SectionViewModel-iPad.swift\n// Bark\n//\n// Created by sidguan on 2024/7/1.\n// Copyright © 2024 Fin. All rights "
},
{
"path": "Controller/ServerListViewController.swift",
"chars": 8960,
"preview": "//\n// ServerListViewController.swift\n// Bark\n//\n// Created by huangfeng on 2022/3/25.\n// Copyright © 2022 Fin. All r"
},
{
"path": "Controller/ServerListViewModel.swift",
"chars": 6245,
"preview": "//\n// ServerListViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2022/3/25.\n// Copyright © 2022 Fin. All rights"
},
{
"path": "Controller/SoundsViewController.swift",
"chars": 9754,
"preview": "//\n// SoundsViewController.swift\n// Bark\n//\n// Created by huangfeng on 2020/9/14.\n// Copyright © 2020 Fin. All right"
},
{
"path": "Controller/SoundsViewModel.swift",
"chars": 7183,
"preview": "//\n// SoundsViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/17.\n// Copyright © 2020 Fin. All rights re"
},
{
"path": "Gemfile",
"chars": 62,
"preview": "source \"https://rubygems.org\"\n\ngem \"cocoapods\"\ngem \"fastlane\"\n"
},
{
"path": "LICENSE",
"chars": 1061,
"preview": "MIT License\n\nCopyright (c) 2018 Feng\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof th"
},
{
"path": "Model/Algorithm.swift",
"chars": 2723,
"preview": "//\n// Algorithm.swift\n// Bark\n//\n// Created by huangfeng on 2023/2/23.\n// Copyright © 2023 Fin. All rights reserved."
},
{
"path": "Model/Message.swift",
"chars": 2486,
"preview": "//\n// Message.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/25.\n// Copyright © 2020 Fin. All rights reserved.\n/"
},
{
"path": "Model/MessageDeleteTimeRange.swift",
"chars": 2165,
"preview": "//\n// MessageDeleteTimeRange.swift\n// Bark\n//\n// Created by huangfeng on 1/7/25.\n// Copyright © 2025 Fin. All rights"
},
{
"path": "Model/MessageItemModel.swift",
"chars": 3197,
"preview": "//\n// MessageItemModel.swift\n// Bark\n//\n// Created by huangfeng on 12/27/24.\n// Copyright © 2024 Fin. All rights res"
},
{
"path": "Model/MessageSection.swift",
"chars": 2214,
"preview": "//\n// MessageSection.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/21.\n// Copyright © 2020 Fin. All rights res"
},
{
"path": "Model/Object+Dictionary.swift",
"chars": 1102,
"preview": "//\n// Object+Dictionary.swift\n// Bark\n//\n// Created by huangfeng on 2022/10/20.\n// Copyright © 2022 Fin. All rights "
},
{
"path": "Model/PreviewModel.swift",
"chars": 862,
"preview": "//\n// PreviewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/23.\n// Copyright © 2020 Fin. All rights reser"
},
{
"path": "NotificationServiceExtension/Info.plist",
"chars": 1208,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "NotificationServiceExtension/NotificationService.swift",
"chars": 2664,
"preview": "//\n// NotificationService.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2018/12/17.\n// Copyrig"
},
{
"path": "NotificationServiceExtension/NotificationServiceExtension.entitlements",
"chars": 287,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "NotificationServiceExtension/Processor/ArchiveProcessor.swift",
"chars": 3354,
"preview": "//\n// ArchiveProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyright ©"
},
{
"path": "NotificationServiceExtension/Processor/AutoCopyProcessor.swift",
"chars": 816,
"preview": "//\n// AutoCopyProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyright "
},
{
"path": "NotificationServiceExtension/Processor/BadgeProcessor.swift",
"chars": 594,
"preview": "//\n// BadgeProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyright © 2"
},
{
"path": "NotificationServiceExtension/Processor/CallProcessor.swift",
"chars": 6027,
"preview": "//\n// CallProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/6/6.\n// Copyright © 202"
},
{
"path": "NotificationServiceExtension/Processor/CiphertextProcessor.swift",
"chars": 3723,
"preview": "//\n// CiphertextProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyrigh"
},
{
"path": "NotificationServiceExtension/Processor/IconProcessor.swift",
"chars": 3331,
"preview": "//\n// IconProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyright © 20"
},
{
"path": "NotificationServiceExtension/Processor/ImageDownloader.swift",
"chars": 2157,
"preview": "//\n// ImageDownloader.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyright © "
},
{
"path": "NotificationServiceExtension/Processor/ImageProcessor.swift",
"chars": 1264,
"preview": "//\n// ImageProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyright © 2"
},
{
"path": "NotificationServiceExtension/Processor/LevelProcessor.swift",
"chars": 2523,
"preview": "//\n// LevelProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// Copyright © 2"
},
{
"path": "NotificationServiceExtension/Processor/MarkdownProcessor.swift",
"chars": 1542,
"preview": "//\n// MarkdownProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 11/21/25.\n// Copyright ©"
},
{
"path": "NotificationServiceExtension/Processor/MuteProcessor.swift",
"chars": 745,
"preview": "//\n// MuteProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 11/6/24.\n// Copyright © 2024"
},
{
"path": "NotificationServiceExtension/Processor/NotificationContentProcessor.swift",
"chars": 1739,
"preview": "//\n// NotificationContentProcessor.swift\n// NotificationServiceExtension\n//\n// Created by huangfeng on 2024/5/29.\n// "
},
{
"path": "Podfile",
"chars": 1453,
"preview": "source 'https://cdn.cocoapods.org/'\n\nplatform:ios,'13.0'\ninhibit_all_warnings!\nuse_modular_headers!\n\n\ndef pods\n pod '"
},
{
"path": "README.md",
"chars": 3825,
"preview": "English | **[中文](README.zh.md)**\n## Bark\nBark is a push notification tool app. It's free, simple, and secure, leveraging"
},
{
"path": "README.zh.md",
"chars": 2598,
"preview": "**[English](README.en.md)** | 中文 \n## Bark\nBark 是一款免费的推送通知工具 App。<br/>\n它简单、安全,基于 APNs 实现,不会额外消耗设备电量。<br/>\n<br/>\nBark 支持 i"
},
{
"path": "View/AddSoundCell.swift",
"chars": 1283,
"preview": "//\n// AddSoundCell.swift\n// Bark\n//\n// Created by Fin on 2024/3/29.\n// Copyright © 2024 Fin. All rights reserved.\n//"
},
{
"path": "View/ArchiveSettingCell.swift",
"chars": 1188,
"preview": "//\n// ArchiveSettingCell.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/29.\n// Copyright © 2020 Fin. All rights "
},
{
"path": "View/ArchiveSettingCellViewModel.swift",
"chars": 342,
"preview": "//\n// ArchiveSettingCellViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/20.\n// Copyright © 2020 Fin. A"
},
{
"path": "View/BKButton.swift",
"chars": 940,
"preview": "//\n// BKButton.swift\n// Bark\n//\n// Created by huangfeng on 2020/9/23.\n// Copyright © 2020 Fin. All rights reserved.\n"
},
{
"path": "View/BKDropDownCell.swift",
"chars": 1345,
"preview": "//\n// BKDropDownCellTableViewCell.swift\n// Bark\n//\n// Created by huangfeng on 2023/2/9.\n// Copyright © 2023 Fin. All"
},
{
"path": "View/BKDropDownCell.xib",
"chars": 4757,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
},
{
"path": "View/BKLabel.swift",
"chars": 500,
"preview": "//\n// BKLabel.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/29.\n// Copyright © 2020 Fin. All rights reserved.\n/"
},
{
"path": "View/BaseTableViewCell.swift",
"chars": 309,
"preview": "//\n// BaseTableViewCell.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/20.\n// Copyright © 2020 Fin. All rights "
},
{
"path": "View/BorderTextField.swift",
"chars": 3205,
"preview": "//\n// BorderTextField.swift\n// Bark\n//\n// Created by huangfeng on 2023/2/6.\n// Copyright © 2023 Fin. All rights rese"
},
{
"path": "View/DonateCell.swift",
"chars": 1595,
"preview": "//\n// DonateCell.swift\n// Bark\n//\n// Created by huangfeng on 11/13/24.\n// Copyright © 2024 Fin. All rights reserved."
},
{
"path": "View/DropBoxView.swift",
"chars": 3681,
"preview": "//\n// DropBoxView.swift\n// Bark\n//\n// Created by huangfeng on 2023/2/2.\n// Copyright © 2023 Fin. All rights reserved"
},
{
"path": "View/GesturePassTextView.swift",
"chars": 1245,
"preview": "//\n// GesturePassTextView.swift\n// Bark\n//\n// Created by huangfeng on 2023/7/26.\n// Copyright © 2023 Fin. All rights"
},
{
"path": "View/GradientButton.swift",
"chars": 1619,
"preview": "//\n// UIView+Gradient.swift\n// Bark\n//\n// Created by huangfeng on 2023/2/10.\n// Copyright © 2023 Fin. All rights res"
},
{
"path": "View/HUD.swift",
"chars": 1495,
"preview": "//\n// HUD.swift\n// Bark\n//\n// Created by huangfeng on 2023/3/6.\n// Copyright © 2023 Fin. All rights reserved.\n//\n\nim"
},
{
"path": "View/InsetView.swift",
"chars": 532,
"preview": "//\n// InsetView.swift\n// Bark\n//\n// Created by huangfeng on 9/8/25.\n// Copyright © 2025 Fin. All rights reserved.\n//"
},
{
"path": "View/LabelCell.swift",
"chars": 721,
"preview": "//\n// LabelCell.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/29.\n// Copyright © 2020 Fin. All rights reserved."
},
{
"path": "View/MessageList/CustomTapTextView.swift",
"chars": 2635,
"preview": "//\n// CustomTapTextView.swift\n// Bark\n//\n// Created by huangfeng on 12/30/24.\n// Copyright © 2024 Fin. All rights re"
},
{
"path": "View/MessageList/MessageGroupHeaderView.swift",
"chars": 1701,
"preview": "//\n// MessageGroupHeaderView.swift\n// Bark\n//\n// Created by huangfeng on 12/23/24.\n// Copyright © 2024 Fin. All righ"
},
{
"path": "View/MessageList/MessageGroupMoreView.swift",
"chars": 1636,
"preview": "//\n// MessageGroupMoreView.swift\n// Bark\n//\n// Created by huangfeng on 12/25/24.\n// Copyright © 2024 Fin. All rights"
},
{
"path": "View/MessageList/MessageItemView.swift",
"chars": 9719,
"preview": "//\n// MessageItemView.swift\n// Bark\n//\n// Created by huangfeng on 12/23/24.\n// Copyright © 2024 Fin. All rights rese"
},
{
"path": "View/MessageList/MessageTableViewCell.swift",
"chars": 8024,
"preview": "//\n// MessageTableViewCell.swift\n// Bark\n//\n// Created by huangfeng on 2020/5/26.\n// Copyright © 2020 Fin. All right"
},
{
"path": "View/MessageList/ShowLessAndClearView.swift",
"chars": 5699,
"preview": "//\n// ShowLessAndClearView.swift\n// Bark\n//\n// Created by huangfeng on 12/23/24.\n// Copyright © 2024 Fin. All rights"
},
{
"path": "View/MessageSettingFooter.swift",
"chars": 2153,
"preview": "//\n// MessageSettingFooter.swift\n// Bark\n//\n// Created by huangfeng on 11/14/24.\n// Copyright © 2024 Fin. All rights"
},
{
"path": "View/MutableTextCell.swift",
"chars": 1015,
"preview": "//\n// DeviceTokenCell.swift\n// Bark\n//\n// Created by huangfeng on 2022/3/23.\n// Copyright © 2022 Fin. All rights res"
},
{
"path": "View/MutableTextCellViewModel.swift",
"chars": 392,
"preview": "//\n// DeviceTokenCellViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2022/3/23.\n// Copyright © 2022 Fin. All r"
},
{
"path": "View/PreviewCardCell.swift",
"chars": 6695,
"preview": "//\n// PreviewCardCell.swift\n// Bark\n//\n// Created by huangfeng on 2018/6/26.\n// Copyright © 2018 Fin. All rights res"
},
{
"path": "View/PreviewCardCellViewModel.swift",
"chars": 4149,
"preview": "//\n// PreviewCardCellViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/23.\n// Copyright © 2020 Fin. All "
},
{
"path": "View/ServerListTableViewCell.swift",
"chars": 3857,
"preview": "//\n// ServerListTableViewCell.swift\n// Bark\n//\n// Created by huangfeng on 2022/4/1.\n// Copyright © 2022 Fin. All rig"
},
{
"path": "View/ServerListTableViewCellViewModel.swift",
"chars": 930,
"preview": "//\n// ServerListTableViewCellViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2022/4/1.\n// Copyright © 2022 Fin"
},
{
"path": "View/SettingSectionHeader.swift",
"chars": 1534,
"preview": "//\n// SettingSectionHeader.swift\n// Bark\n//\n// Created by huangfeng on 11/13/24.\n// Copyright © 2024 Fin. All rights"
},
{
"path": "View/SoundCell.swift",
"chars": 2437,
"preview": "//\n// SoundCell.swift\n// Bark\n//\n// Created by huangfeng on 2020/9/14.\n// Copyright © 2020 Fin. All rights reserved."
},
{
"path": "View/SoundCellViewModel.swift",
"chars": 635,
"preview": "//\n// SoundCellViewModel.swift\n// Bark\n//\n// Created by huangfeng on 2020/11/17.\n// Copyright © 2020 Fin. All rights"
},
{
"path": "View/SpacerCell.swift",
"chars": 739,
"preview": "//\n// SpacerCell.swift\n// Bark\n//\n// Created by huangfeng on 2021/6/25.\n// Copyright © 2021 Fin. All rights reserved"
},
{
"path": "View/TextCell.swift",
"chars": 625,
"preview": "//\n// TextCell.swift\n// Bark\n//\n// Created by huangfeng on 2021/6/25.\n// Copyright © 2021 Fin. All rights reserved.\n"
},
{
"path": "View/UINavigationItem+Extension.swift",
"chars": 2530,
"preview": "//\n// UINavigationItem+Extension.swift\n// Bark\n//\n// Created by huangfeng on 2020/9/23.\n// Copyright © 2020 Fin. All"
},
{
"path": "check_unused_translations.py",
"chars": 8038,
"preview": "#!/usr/bin/env python3\n\"\"\"\nBark项目本地化字符串分析工具\n\n这个脚本会扫描整个Bark项目,找出 Localizable.xcstrings 中未使用的翻译key。\n检测方式:\n1. 任何在双引号内且在本地化文"
},
{
"path": "docs/.nojekyll",
"chars": 0,
"preview": ""
},
{
"path": "docs/CNAME",
"chars": 12,
"preview": "bark.day.app"
},
{
"path": "docs/README.md",
"chars": 920,
"preview": "\n### Bark <!-- {docsify-ignore-all} -->\n- 免费、轻量!简单调用接口即可给自己的iPhone发送推送。\n- 依赖苹果APNs,及时、稳定、可靠\n- 不会消耗设备的电量, 基于系统推送服务与推送扩展,A"
},
{
"path": "docs/_coverpage.md",
"chars": 155,
"preview": "\n\n# Bark <small></small>\n\n> 一款注重隐私、安全可控的自定义通知推送工具。\n\n- 免费、简单、安全\n- 打开即用\n\n[GitHub](https://github.c"
},
{
"path": "docs/_navbar.md",
"chars": 61,
"preview": "* Translations\n - [:cn: 简体中文](/)\n - [:uk: English](/en-us/)"
},
{
"path": "docs/_sidebar.md",
"chars": 194,
"preview": "- [Bark](/#bark)\n- **App**\n - [使用教程](/tutorial)\n - [推送加密](/encryption)\n - [常见问题](/faq)\n- **服务端**\n - [部署服务](/deploy)\n"
},
{
"path": "docs/batch.md",
"chars": 956,
"preview": "\n### 个人用户\n批量推送仅支持Json请求,需 bark-server 更新至 v2.1.9。([https://api.day.app](https://api.day.app) 服务器一次最多10个设备, 自建服务器无上限)<br "
},
{
"path": "docs/build.md",
"chars": 758,
"preview": "## 下载源码\n从GitHub下载源码 [bark-server](https://github.com/Finb/bark-server)\n\n或\n```sh\ngit clone https://github.com/Finb/bark-s"
},
{
"path": "docs/cert.md",
"chars": 246,
"preview": "当你需要集成Bark到自己的系统或重新实现后端代码时可能需要推送证书\n \n##### 有效期到: *永久*\n##### Key ID:*LH4T9V5U4R*\n##### TeamID:*5U8LBRXG3A*\n##### 下载地址:[Au"
},
{
"path": "docs/deploy.md",
"chars": 2548,
"preview": "\n## Docker \n```\ndocker run -dt --name bark -p 8080:8080 -v `pwd`/bark-data:/data finab/bark-server\n```\n> 镜像也可使用 ghcr.io/"
}
]
// ... and 57 more files (download for full content)
About this extraction
This page contains the full source code of the Finb/Bark GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 257 files (699.2 KB), approximately 194.4k tokens, and a symbol index with 10 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.