Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
This commit is contained in:
parent
c153b16593
commit
ac35666208
58
Info.plist
Normal file
58
Info.plist
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<?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>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</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>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>$(MARKETING_VERSION)</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
|
<key>CFBundleDisplayName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSCameraUsageDescription</key>
|
||||||
|
<string>SelfieCam needs camera access to display your live selfie preview, apply real-time filters and ring light effects, capture high-quality photos, and enable advanced features like Center Stage auto-framing.</string>
|
||||||
|
<key>NSMicrophoneUsageDescription</key>
|
||||||
|
<string>SelfieCam needs microphone access for the camera framework to initialize properly. Audio is not recorded.</string>
|
||||||
|
<key>NSPhotoLibraryAddUsageDescription</key>
|
||||||
|
<string>SelfieCam needs photo library access to automatically save your captured photos to your device, making them available in the Photos app and other compatible applications.</string>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
<key>UIApplicationSceneManifest</key>
|
||||||
|
<dict>
|
||||||
|
<key>UIApplicationSupportsMultipleScenes</key>
|
||||||
|
<true/>
|
||||||
|
<key>UISceneConfigurations</key>
|
||||||
|
<dict/>
|
||||||
|
</dict>
|
||||||
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
|
<true/>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>RevenueCatAPIKey</key>
|
||||||
|
<string>$(REVENUECAT_API_KEY)</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@ -435,20 +435,8 @@
|
|||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = NO;
|
||||||
INFOPLIST_KEY_AppClipDomain = "$(APPCLIP_DOMAIN)";
|
INFOPLIST_FILE = Info.plist;
|
||||||
INFOPLIST_KEY_AppGroupIdentifier = "$(APP_GROUP_IDENTIFIER)";
|
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "$(PRODUCT_NAME)";
|
|
||||||
INFOPLIST_KEY_CloudKitContainerIdentifier = "$(CLOUDKIT_CONTAINER_IDENTIFIER)";
|
|
||||||
INFOPLIST_KEY_NSCameraUsageDescription = "SelfieCam needs camera access to display your live selfie preview, apply real-time filters and ring light effects, capture high-quality photos, and enable advanced features like Center Stage auto-framing.";
|
|
||||||
INFOPLIST_KEY_NSMicrophoneUsageDescription = "SelfieCam needs microphone access for the camera framework to initialize properly. Audio is not recorded.";
|
|
||||||
INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "SelfieCam needs photo library access to automatically save your captured photos to your device, making them available in the Photos app and other compatible applications.";
|
|
||||||
INFOPLIST_KEY_PublicAppName = "$(PRODUCT_NAME)";
|
|
||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
|
||||||
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
|
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
|
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
@ -477,20 +465,8 @@
|
|||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = NO;
|
||||||
INFOPLIST_KEY_AppClipDomain = "$(APPCLIP_DOMAIN)";
|
INFOPLIST_FILE = Info.plist;
|
||||||
INFOPLIST_KEY_AppGroupIdentifier = "$(APP_GROUP_IDENTIFIER)";
|
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "$(PRODUCT_NAME)";
|
|
||||||
INFOPLIST_KEY_CloudKitContainerIdentifier = "$(CLOUDKIT_CONTAINER_IDENTIFIER)";
|
|
||||||
INFOPLIST_KEY_NSCameraUsageDescription = "SelfieCam needs camera access to display your live selfie preview, apply real-time filters and ring light effects, capture high-quality photos, and enable advanced features like Center Stage auto-framing.";
|
|
||||||
INFOPLIST_KEY_NSMicrophoneUsageDescription = "SelfieCam needs microphone access for the camera framework to initialize properly. Audio is not recorded.";
|
|
||||||
INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "SelfieCam needs photo library access to automatically save your captured photos to your device, making them available in the Photos app and other compatible applications.";
|
|
||||||
INFOPLIST_KEY_PublicAppName = "$(PRODUCT_NAME)";
|
|
||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
|
||||||
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
|
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
|
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
|
|||||||
@ -2,3 +2,4 @@
|
|||||||
// Configuration for Debug builds
|
// Configuration for Debug builds
|
||||||
|
|
||||||
#include "Base.xcconfig"
|
#include "Base.xcconfig"
|
||||||
|
#include "Secrets.debug.xcconfig"
|
||||||
|
|||||||
@ -2,3 +2,4 @@
|
|||||||
// Configuration for Release builds
|
// Configuration for Release builds
|
||||||
|
|
||||||
#include "Base.xcconfig"
|
#include "Base.xcconfig"
|
||||||
|
#include "Secrets.release.xcconfig"
|
||||||
|
|||||||
@ -1,20 +0,0 @@
|
|||||||
// Secrets.swift
|
|
||||||
// ⚠️ DO NOT COMMIT THE ACTUAL Secrets.swift FILE TO VERSION CONTROL
|
|
||||||
//
|
|
||||||
// Copy this file to Secrets.swift and fill in your actual values.
|
|
||||||
// Secrets.swift is gitignored.
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
enum Secrets {
|
|
||||||
/// RevenueCat API Key
|
|
||||||
/// - Debug: Use your test/sandbox API key (starts with "test_")
|
|
||||||
/// - Release: Use your production API key (starts with "appl_")
|
|
||||||
static let revenueCatAPIKey: String = {
|
|
||||||
#if DEBUG
|
|
||||||
return "test_YOUR_TEST_KEY_HERE"
|
|
||||||
#else
|
|
||||||
return "appl_YOUR_PRODUCTION_KEY_HERE"
|
|
||||||
#endif
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
// Secrets.xcconfig.template
|
|
||||||
//
|
|
||||||
// INSTRUCTIONS:
|
|
||||||
// This project uses separate secrets files for Debug and Release builds:
|
|
||||||
//
|
|
||||||
// 1. Copy this file to "Secrets.debug.xcconfig" for development/testing
|
|
||||||
// - Use your RevenueCat TEST API key (starts with test_)
|
|
||||||
// - Sandbox purchases, no real money charged
|
|
||||||
//
|
|
||||||
// 2. Copy this file to "Secrets.release.xcconfig" for App Store builds
|
|
||||||
// - Use your RevenueCat PRODUCTION API key (starts with appl_)
|
|
||||||
// - Real purchases, charges real money
|
|
||||||
//
|
|
||||||
// 3. NEVER commit the actual secrets files to version control
|
|
||||||
//
|
|
||||||
// The actual Secrets.*.xcconfig files are gitignored for security.
|
|
||||||
|
|
||||||
// RevenueCat API Key
|
|
||||||
// Get this from: RevenueCat Dashboard > Project Settings > API Keys
|
|
||||||
// - Test key: Use "Public App-Specific API Key" from test environment
|
|
||||||
// - Production key: Use "Public App-Specific API Key" from production environment
|
|
||||||
REVENUECAT_API_KEY = your_revenuecat_api_key_here
|
|
||||||
@ -16,10 +16,30 @@ final class PremiumManager: PremiumManaging {
|
|||||||
|
|
||||||
/// Reads the RevenueCat API key from the Secrets configuration file
|
/// Reads the RevenueCat API key from the Secrets configuration file
|
||||||
private static var apiKey: String {
|
private static var apiKey: String {
|
||||||
let key = Secrets.revenueCatAPIKey
|
let key = (Bundle.main.object(forInfoDictionaryKey: "RevenueCatAPIKey") as? String) ?? ""
|
||||||
guard !key.isEmpty, key != "YOUR_REVENUECAT_API_KEY_HERE" else {
|
let placeholders = [
|
||||||
|
"",
|
||||||
|
"YOUR_REVENUECAT_API_KEY_HERE",
|
||||||
|
"test_YOUR_TEST_KEY_HERE",
|
||||||
|
"appl_YOUR_PRODUCTION_KEY_HERE"
|
||||||
|
]
|
||||||
|
#if DEBUG
|
||||||
|
let prefix = key.split(separator: "_").first.map(String.init) ?? "missing"
|
||||||
|
let keyStatus = key.isEmpty ? "empty" : "present"
|
||||||
|
print("ℹ️ [PremiumManager] RevenueCatAPIKey \(keyStatus), prefix=\(prefix)")
|
||||||
|
if let infoPath = Bundle.main.path(forResource: "Info", ofType: "plist"),
|
||||||
|
let infoDict = NSDictionary(contentsOfFile: infoPath) as? [String: Any] {
|
||||||
|
let rawValue = infoDict["RevenueCatAPIKey"] as? String ?? ""
|
||||||
|
let rawPrefix = rawValue.split(separator: "_").first.map(String.init) ?? "missing"
|
||||||
|
let rawStatus = rawValue.isEmpty ? "empty" : "present"
|
||||||
|
print("ℹ️ [PremiumManager] Info.plist RevenueCatAPIKey \(rawStatus), prefix=\(rawPrefix)")
|
||||||
|
} else {
|
||||||
|
print("ℹ️ [PremiumManager] Info.plist not found in bundle")
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
guard !placeholders.contains(key) else {
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
print("⚠️ [PremiumManager] RevenueCat API key not configured. See Configuration/Secrets.swift.template")
|
print("⚠️ [PremiumManager] RevenueCat API key not configured. Check Secrets.debug.xcconfig / Secrets.release.xcconfig")
|
||||||
#endif
|
#endif
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user