Перейти к содержимому

История выпусков и заявление разработчика

В более раннем production-target сохранился внутренний сценарий подготовки снимков и тестирования, который мог добавлять демонстрационные записи, принудительно использовать локальное хранилище, обходить блокировки или имитировать состояние iCloud и App Group. Мы признаём, что это было недопустимо. В прежних ответах разработчика описаны удаление этого сценария и отправка исправленной версии для iOS до уведомления от 2 сентября. По подтверждению разработчика от 4 сентября, исправленная версия имела статус «На рассмотрении», хотя приложение было удалено из магазина.

Уточнение статусов · 13 сентября 2026 г.

До уведомления о предстоящем прекращении участия от 2 сентября EasyTallys имело статус In Review — «На рассмотрении». Остальные шесть приложений — VPN XX, VPN XX PRO, SpellVPN Tool, SpellVPN Ultra, ArtCut и ArtCut Pro — отображались как Distributable, то есть готовые к распространению.

Теперь разработчик сообщает, что все семь приложений удалены из общедоступного App Store, но записи об их статусах по-прежнему видны в App Store Connect. Удаление из магазина не означает исчезновения записей приложений или статусов платформ и версий. Видимый статус не подтверждает восстановление распространения или участия в программе.

Это уточнение предоставлено разработчиком 13 сентября. Оно не является независимой проверкой App Store Connect в реальном времени, квитанцией Apple или изменением сохранённых свидетельств исходного кода от 12 сентября.

Скачать уточнение статусов (TXT)

Что подтверждают изученные материалы

В выдержках из кода оставшиеся переопределения языка и начального экрана через параметры запуска находятся внутри условий DEBUG, а проверенные обращения к хранилищу и состоянию учётной записи используют системные API Apple. Локальный ответ — документ разработчика, а не одобрение Apple или квитанция о загрузке. Одни эти выдержки не удостоверяют содержимое исторически загруженного бинарного файла.

Дальнейшие меры — выполнение ещё не подтверждено

Просим Apple оценить исправленную отправку и, если проблема сохраняется, указать точную сборку, условия проверки и наблюдаемое поведение. Перед дальнейшими выпусками мы сопоставим отправляемый архив, production-entitlements, метаданные и поведение на реальном устройстве. Мы не утверждаем, что ожидающее проверки исправление уже одобрено.

Подтверждающие материалы

E01

EasyTallys: прежний ответ разработчика и запись об отправке

Это сохранённые локальные заявления разработчика. Утверждения этого документа об отправленном Release-бинарном файле или метаданных App Store не сопоставлены независимо с загруженным архивом или квитанцией Apple.

Просмотреть выдержки

Источник: AppleLedger/AppStoreAssets/submission/GUIDELINE_5_6_RESPONSE_EN.md · 1–17

Выдержка с исходными номерами строк; выбранные строки сохранены без изменений.

    1 | # Guideline 5.6 Resolution Center Response
    2 | 
    3 | Thank you for identifying this issue. We reviewed the rejected build and found that the production app target incorrectly retained an internal screenshot workflow. That workflow included launch arguments and environment variables that could inject sample records, force a local data store, bypass the privacy lock, and simulate iCloud or App Group availability. We understand that retaining this behavior in a production build was inappropriate and could appear intentionally hidden.
    4 | 
    5 | The new build removes that workflow completely:
    6 | 
    7 | - All screenshot-only data creation, deletion, and injection code has been removed.
    8 | - All forced-local-store launch arguments and environment variables have been removed.
    9 | - All privacy-lock and automatic-lock bypasses have been removed.
   10 | - All simulated iCloud and App Group status results have been removed.
   11 | - All language- or region-based app-icon switching, the English alternate icon, and the related system-switch prompt have been removed. Every user now receives the same primary "好记" icon.
   12 | - Ledger, account, transaction, collaborator, and cold-wallet screens now display only data actually created and stored by the user.
   13 | - The submitted Release binary contains no screenshot route, language override, demo-data, forced-local-store parameter, or alternate app icon.
   14 | 
   15 | The app does not hide or reveal features based on reviewer identity, date, region, device, build source, or server configuration. App Review and all users now execute the same Release code path. All features are accessible through the normal user interface, and the App Store description and screenshots explicitly disclose shared ledgers and the on-device cold wallet vault.
   16 | 
   17 | No backend account is required. iCloud and shared-ledger features can be tested on a device signed in to an Apple ID.
SHA-256 полного исходного файла
04dfa389f217c2659f02d6cf1af820d647e7fb1c4a7a0ef228bb83cfd1126120
SHA-256 выдержки с номерами строк
b16507111ff0949a1c6012b2071b718c574ecc1bab03f7d6c62fab5dada50c57

Источник: AppleLedger/README.md · 143–164

Выдержка с исходными номерами строк; выбранные строки сохранены без изменений.

  143 | Hello App Review Team,
  144 | Thank you for reviewing our app.
  145 | As explained in our response dated August 11, we investigated the previous rejection and identified an internal screenshot-production workflow that had been mistakenly retained in the production target. We understand why the presence of that workflow could have appeared to be hidden behavior.
  146 | We have now submitted a corrected iOS binary:
  147 | Version 1.0.2 (Build 1.0.1)
  148 | This build supersedes the previously rejected binary and includes the following remediation:
  149 | - All screenshot-only sample-data creation, deletion, and injection code has been removed.
  150 | - The Release binary contains no screenshot route, demo-data parameter, forced-local-store parameter, language override, privacy-lock bypass, or automatic-lock bypass.
  151 | - All simulated iCloud and App Group results have been removed. The app now displays only the actual status reported by Apple system services.
  152 | - No alternate app-icon switching is available in the Release build. Every user receives the same primary “好记” icon.
  153 | - Ledger, account, transaction, collaborator, and cold-wallet screens display only information created and stored by the user.
  154 | - The app does not change, hide, or reveal functionality based on reviewer identity, date, region, device, build source, network response, or server configuration.
  155 | - App Review and all users execute the same Release code path.
  156 | EasyTallys (“好记”) is a local-first personal and family bookkeeping app. It has no developer-hosted account or backend, no advertising, no third-party analytics, no remote feature configuration, no in-app purchases or paywall, and does not download executable code or configuration that changes its functionality.
  157 | Ledger data is stored on the user’s device. If the user enables iCloud, ledger data is synchronized only through Apple CloudKit under the user’s own Apple ID. No developer-provided login credentials are required.
  158 | All features are accessible through the normal user interface:
  159 | - Bookkeeping features are available from Overview, Transactions, Accounts, Budgets, Reports, and Library.
  160 | - CloudKit shared-ledger features are available under Library > Sharing. Testing requires a device signed in to an Apple ID.
  161 | - The on-device Keychain vault is available under Library > Cold Wallets. It only stores information manually entered by the user in the current device’s ThisDeviceOnly Keychain. It does not create cryptocurrency wallets, connect to blockchain services, perform transfers or trading, or upload vault information to any server.
  162 | These features are also disclosed in the App Store description, screenshots, and Notes for Review.
  163 | We respectfully request that App Review evaluate Version 1.0.2 (Build 1.0.1).
  164 | If App Review still observes behavior associated with Guideline 5.6 in this corrected build, could you please identify the specific feature, navigation path, review steps, device conditions, or provide a screenshot of the observed behavior? This information would allow us to reproduce and address the concern immediately.
SHA-256 полного исходного файла
b6e872e127759a760d75f34c142123d3215189c9f8418d289fffb924189c9318
SHA-256 выдержки с номерами строк
d5e772387b59a78bad0f0fe71ccc3123f1e631c7495cd5666b731b6e6cfb4f6b

E02

EasyTallys: переопределение языка при запуске

Выбранная логика переопределения находится внутри условия DEBUG. Это не полный аудит Release-бинарного файла.

Просмотреть выдержки

Источник: AppleLedger/AppleLedgerShared/Services/AppLanguage.swift · 127–141

Выдержка с исходными номерами строк; выбранные строки сохранены без изменений.

  127 |     static var selected: AppLanguage {
  128 |         #if DEBUG
  129 |         let processInfo = ProcessInfo.processInfo
  130 |         if let value = processInfo.environment[environmentKey], let language = AppLanguage(value) {
  131 |             return language
  132 |         }
  133 |         if let index = processInfo.arguments.firstIndex(of: launchArgument),
  134 |            processInfo.arguments.indices.contains(index + 1),
  135 |            let language = AppLanguage(processInfo.arguments[index + 1]) {
  136 |             return language
  137 |         }
  138 |         #endif
  139 |         let rawValue = AppSettingsStore.defaults.string(forKey: storageKey) ?? AppLanguage.system.rawValue
  140 |         return AppLanguage(rawValue: rawValue) ?? .system
  141 |     }
SHA-256 полного исходного файла
e55240c882da8632bce65b040fab307aa4e07fba12294ed488447ad1b0caa370
SHA-256 выдержки с номерами строк
0c4537f83e79b2f38e9f5e966bdbe2746f9a5df5a876b79306cc19d123f70ad3

E03

EasyTallys: параметр начального экрана

Выбранное переопределение начального экрана доступно только при DEBUG; далее используется обычный главный экран по умолчанию.

Просмотреть выдержки

Источник: AppleLedger/AppleLedgerShared/Views/RootView.swift · 115–129

Выдержка с исходными номерами строк; выбранные строки сохранены без изменений.

  115 | private struct AppInitialRoute {
  116 |     var section: AppSection
  117 |     var libraryTab: LibraryTab
  118 |     var quickEntryKind: TransactionKind?
  119 | 
  120 |     static var current: AppInitialRoute {
  121 |         #if DEBUG
  122 |         let arguments = ProcessInfo.processInfo.arguments
  123 |         if let routeArgumentIndex = arguments.firstIndex(of: "-AppleLedgerInitialRoute"),
  124 |            arguments.indices.contains(routeArgumentIndex + 1) {
  125 |             return AppInitialRoute(rawValue: arguments[routeArgumentIndex + 1])
  126 |         }
  127 |         #endif
  128 |         return AppInitialRoute(section: .dashboard, libraryTab: .ledgers, quickEntryKind: nil)
  129 |     }
SHA-256 полного исходного файла
f0bb697266d3b82c98dfb214e0a91e071bbbdfe8bd83e1f908864c21dca2a9b6
SHA-256 выдержки с номерами строк
b95510fab3811e7afca1a0c19bbfc8fbb7166d64eb07108fddb8721ee810c934

E04

EasyTallys: проверки хранилища и учётной записи Apple

Эти пути используют FileManager и CKContainer. Они не доказывают наличие production-entitlements, успешную синхронизацию или содержимое исторических бинарных файлов.

Просмотреть выдержки

Источник: AppleLedger/AppleLedgerShared/Services/AppModelContainer.swift · 341–345

Выдержка с исходными номерами строк; выбранные строки сохранены без изменений.

  341 |     private static var appGroupStoreDirectory: URL? {
  342 |         FileManager.default
  343 |             .containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier)?
  344 |             .appending(path: "AppleLedger", directoryHint: .isDirectory)
  345 |     }
SHA-256 полного исходного файла
5446c56d0591b286adb91933164f3d57ba18ebaf3eca6c6e0d127c4cdec81f26
SHA-256 выдержки с номерами строк
c15b66dab90d09d02b80d9bd3205fe99abfd6dc139804dad96cfe5d1df194225

Источник: AppleLedger/AppleLedgerShared/Services/ImportExportService.swift · 436–441

Выдержка с исходными номерами строк; выбранные строки сохранены без изменений.

  436 |     static func saveLatestBackup(_ archiveData: Data, createdAt: Date = .now) async throws -> ManualICloudBackupMetadata {
  437 |         #if canImport(CloudKit)
  438 |         let container = CKContainer(identifier: AppModelContainer.cloudKitContainerIdentifier)
  439 |         guard try await container.accountStatus() == .available else {
  440 |             throw ManualICloudBackupError.accountUnavailable
  441 |         }
SHA-256 полного исходного файла
dcadccf109343eb36c509f40027ba929a99b8c54cb2329ce6c65b013d8c65eb5
SHA-256 выдержки с номерами строк
6ab26ec700b69059464470a8d49d50be5a8d94545d4d8075bf74cfac87d88fa2

Как понимать эти материалы

В подборку входят подтверждённая разработчиком история выпусков, выдержки из текущего локального кода, локальные черновики метаданных и два исходных снимка формы, предоставленных разработчиком. Это разные виды свидетельств. Здесь нет точных архивов исторических загрузок, квитанций Apple об их получении, документов о разрешении на распространение контента сервиса или новых одобрений App Store. SHA-256 идентифицирует сохранённые байты, но не доказывает, что Apple получила или проверила их. Выбранные выдержки не являются исчерпывающим аудитом исходного кода или бинарных файлов.

Это общедоступные материалы с одинаковым содержимым для всех читателей. Личные идентификаторы учётной записи, частная переписка, учётные данные узлов и действующие URL общедоступных подписок не публикуются. Защиты паролем нет. При необходимости оригиналы могут быть переданы Apple отдельно по подходящему непубличному каналу. Указание noindex — пожелание для поисковых систем, а не ограничение доступа.

Переведены пояснения и сведения о происхождении материалов. Код и снимки экрана оставлены на языке оригинала; русские тексты не заменяют исходные свидетельства и не означают нового одобрения Apple.

Все подтверждающие материалы →