Skip to content

Added App Store review request#148

Merged
amikhaylin merged 1 commit intomasterfrom
appstore-reviews
Sep 10, 2025
Merged

Added App Store review request#148
amikhaylin merged 1 commit intomasterfrom
appstore-reviews

Conversation

@amikhaylin
Copy link
Copy Markdown
Owner

No description provided.

Copy link
Copy Markdown

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

Code review by ChatGPT

}
}

#Preview {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Ваше продвижение функционала запроса отзыва выглядит хорошо, однако есть несколько моментов, на которые стоит обратить внимание для улучшения качества кода и соблюдения лучших практик SwiftUI:

  1. Тип данных для launchCount:

    • Проблема: Вы используете Double для хранения количества запусков приложения (@AppStorage("launchCount") var launchCount = 0). Это может привести к неточностям, так как количество запусков должно быть целым числом.
    • Решение: Используйте Int вместо Double для launchCount и других подобных счетчиков.
      @AppStorage("launchCount") var launchCount: Int = 0
  2. Инициализация lastVersionPromptedForReview:

    • Проблема: Переменная lastVersionPromptedForReview имеет тип String?. Это может привести к неопределенному поведению, если версия не будет корректно сохранена или считана.
    • Решение: Убедитесь, что значение сохраняется и считывается корректно. Рассмотрите возможность использования Bundle для более надежного получения версии.
      @AppStorage("lastVersionPromptedForReview") var lastVersionPromptedForReview: String = ""
  3. Метод checkForReview и задержка:

    • Проблема: Использование Task.sleep(for: .seconds(2)) может быть избыточным и не гарантирует, что пользователь увидит запрос на отзыв в подходящий момент.
    • Решение: Рассмотрите возможность вызова requestReview() без задержки или использования более продуманного подхода для определения оптимального момента показа запроса.
      private func checkForReview() {
          guard launchCount >= 10,
                lastVersionPromptedForReview != currentVersion else { return }
          
          Task { @MainActor in
              requestReview()
              lastVersionPromptedForReview = currentVersion
          }
      }
  4. Обновление launchCount:

    • Проблема: Увеличение launchCount производится каждый раз, когда выполняется определённый код (например, при инициализации timer). Нужно убедиться, что это действительно соответствует логике увеличения запуска приложения.
    • Решение: Переместите увеличение launchCount в место, которое точно соответствует запуску приложения, например, в метод onAppear главного View.
      .onAppear {
          launchCount += 1
          checkForReview()
      }
  5. Использование StoreKit и условия запроса отзыва:

    • Проблема: StoreKit накладывает ограничения на количество запросов отзывов. Необходимо убедиться, что эти ограничения учитываются, чтобы избежать игнорирования запросов.
    • Решение: Добавьте дополнительную проверку или логирование, чтобы отслеживать частоту запросов и избегать превышения лимитов.
      private func checkForReview() {
          guard launchCount >= 10,
                lastVersionPromptedForReview != currentVersion else { return }
          
          Task { @MainActor in
              if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
                  SKStoreReviewController.requestReview(in: scene)
              }
              lastVersionPromptedForReview = currentVersion
          }
      }
  6. Хранение версии приложения:

    • Проблема: Получение версии через Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) может быть менее безопасным.
    • Решение: Используйте типобезопасный метод для получения версии:
      var currentVersion: String {
          Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
      }
  7. Консистентность @AppStorage ключей:

    • Проблема: Убедитесь, что строки, используемые в @AppStorage, совпадают с ключами в UserDefaults и избегайте опечаток.
    • Решение: Рассмотрите использование констант для ключей:
      struct UserDefaultsKeys {
          static let launchCount = "launchCount"
          static let lastVersionPromptedForReview = "lastVersionPromptedForReview"
      }
      
      @AppStorage(UserDefaultsKeys.launchCount) var launchCount: Int = 0
      @AppStorage(UserDefaultsKeys.lastVersionPromptedForReview) var lastVersionPromptedForReview: String = ""
  8. Обработка потенциальных ошибок:

    • Проблема: Использование try? подавляет возможные ошибки, что может затруднить отладку.
    • Решение: Рассмотрите добавление обработки ошибок или логирования, чтобы понимать, если что-то пойдет не так.
      Task { @MainActor in
          do {
              try await Task.sleep(nanoseconds: 2 * 1_000_000_000)
              requestReview()
              lastVersionPromptedForReview = currentVersion
          } catch {
              // Логирование ошибки
              print("Ошибка при ожидании перед запросом отзыва: \(error)")
          }
      }

В целом, ваш подход к запросу отзыва пользователя структурирован правильно. Внимание к деталям, таким как типы данных и управление состоянием, поможет сделать функционал более надежным и соответствующим лучшим практикам разработки на SwiftUI.

CURRENT_PROJECT_VERSION = 69;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 14.0;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Ваши изменения касаются обновления CURRENT_PROJECT_VERSION с 68 на 69 во множестве конфигураций проекта. Вот несколько рекомендаций и замечаний:

  1. Автоматизация обновления версии:

    • Повторяющиеся изменения: Обновление версии вручную во множестве мест повышает риск пропуска какого-либо файла или конфигурации. Рассмотрите возможность использования скриптов для автоматизации этого процесса. Например, можно создать скрипт на Ruby, Python или использовать sed для массового обновления значений.
    • Использование переменных: Если ваш проект поддерживает использование общих настроек или конфигурационных файлов, можно вынести CURRENT_PROJECT_VERSION в одно место и ссылаться на него из всех необходимых мест. Это упростит управление версией в будущем.
  2. Согласованность версионирования:

    • Проверка всех целевых платформ: Убедитесь, что все целевые платформы и расширения действительно требуют одинакового значения CURRENT_PROJECT_VERSION. В некоторых случаях разные компоненты могут иметь собственные версии.
    • Документация версионной политики: Если еще не внедрено, заведите документ, описывающий, когда и как изменяется версия проекта. Это поможет поддерживать консистентность, особенно в больших командах.
  3. Использование Xcode интерфейса:

    • Редактирование через Xcode: Внесение изменений непосредственно через интерфейс Xcode вместо ручного редактирования файлов может снизить вероятность ошибок синтаксиса или несоответствий.
    • Проверка после изменений: После обновления версии убедитесь, что проект компилируется и все зависимости правильно связываются. Иногда небольшие изменения в конфигурации могут привести к неожиданным проблемам.
  4. Версионирование и CI/CD:

    • Интеграция с системами CI/CD: Если вы используете системы непрерывной интеграции и развертывания, убедитесь, что обновление версии синхронизировано с процессами сборки и релиза. Это гарантирует, что новая версия автоматически отражается в сборках и релизах.
    • Тестирование: После изменения версии проведите полный набор тестов, чтобы убедиться, что обновление не влияет на функциональность приложения.
  5. Управление зависимостями:

    • Сквозные ссылки: Проверьте, не зависят ли другие модули или библиотеки вашего проекта от конкретной версии. Обновление версии может требовать обновления зависимостей или их конфигураций.

В целом, основная рекомендация — стремиться к автоматизации и централизованному управлению версионными настройками, чтобы минимизировать ручные ошибки и упростить процесс обновления в будущем.

@amikhaylin amikhaylin merged commit 5f6b331 into master Sep 10, 2025
1 check passed
@amikhaylin amikhaylin deleted the appstore-reviews branch September 10, 2025 09:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant