浏览代码

Add OpenAI API key wiring and improve missing-key guidance

Configure API key resolution across environment/plist fallback paths and update the user-facing missing-key message to point to Xcode Build Settings.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 2 月之前
父节点
当前提交
5aba86ac52

+ 2 - 2
App for Indeed.xcodeproj/project.pbxproj

@@ -264,7 +264,7 @@
 					"@executable_path/../Frameworks",
 				);
 				MARKETING_VERSION = 1.0;
-				OPENAI_API_KEY = "";
+				OPENAI_API_KEY = "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";
 				PRODUCT_BUNDLE_IDENTIFIER = "MQL-DEV.App-for-Indeed";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				REGISTER_APP_GROUPS = YES;
@@ -298,7 +298,7 @@
 					"@executable_path/../Frameworks",
 				);
 				MARKETING_VERSION = 1.0;
-				OPENAI_API_KEY = "";
+				OPENAI_API_KEY = "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";
 				PRODUCT_BUNDLE_IDENTIFIER = "MQL-DEV.App-for-Indeed";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				REGISTER_APP_GROUPS = YES;

+ 7 - 2
App for Indeed/OpenAIConfiguration.swift

@@ -1,10 +1,15 @@
 import Foundation
 
 enum OpenAIConfiguration {
-    /// Read key from Info.plist (`OPENAI_API_KEY`) populated by build settings.
+    /// Emergency fallback key when plist/environment injection is unavailable.
+    private static let fallbackAPIKey = "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"
+
+    /// Read key from environment first, then Info.plist, then fallback.
     static var apiKey: String {
+        let fromEnvironment = ProcessInfo.processInfo.environment["OPENAI_API_KEY"] ?? ""
         let fromPlist = Bundle.main.object(forInfoDictionaryKey: "OPENAI_API_KEY") as? String ?? ""
-        return fromPlist.trimmingCharacters(in: .whitespacesAndNewlines)
+        let resolved = !fromEnvironment.isEmpty ? fromEnvironment : (!fromPlist.isEmpty ? fromPlist : fallbackAPIKey)
+        return resolved.trimmingCharacters(in: .whitespacesAndNewlines)
     }
 
     /// Whether `apiKey` is currently populated with a real value.

+ 1 - 1
App for Indeed/Views/DashboardView.swift

@@ -1585,7 +1585,7 @@ private final class OpenAIJobSearchService {
             completion(.failure(NSError(
                 domain: "OpenAIJobSearchService",
                 code: 1,
-                userInfo: [NSLocalizedDescriptionKey: "Missing API key. Set it in OpenAIConfiguration.swift."]
+                userInfo: [NSLocalizedDescriptionKey: "Missing API key. Set OPENAI_API_KEY in Xcode Build Settings."]
             )))
             return
         }