Browse Source

Merge commit '2d45dfe476dde12830ef3e2f6c15689c647b4251' into lxm

weicu
lxm 2 years ago
parent
commit
15029f717a
  1. 9
      ios/Runner.xcodeproj/project.pbxproj
  2. 4
      ios/Runner/BluetoothMediaButtonHelper.swift
  3. 4
      ios/Runner/Info.plist
  4. 4
      lib/core/translations/language/en_us.dart
  5. 4
      lib/core/translations/language/zh_cn.dart
  6. 8
      lib/data/providers/agent_provider.dart
  7. 6
      lib/data/services/deapsound_ai_service.dart
  8. 15
      lib/data/services/speech_impl/volcano_asr_api_service.dart
  9. 2
      lib/main.dart
  10. 10
      lib/modules/chat/controllers/chat_controller.dart
  11. 2
      lib/modules/chat/views/chat_view.dart
  12. 3
      lib/modules/meeting/controllers/meeting_details_controller.dart
  13. 58
      lib/modules/meeting/controllers/meeting_edit_controller.dart
  14. 8
      lib/modules/meeting/views/meeting_edit_view.dart
  15. 6
      macos/Runner.xcodeproj/project.pbxproj
  16. 2
      macos/Runner/Configs/AppInfo.xcconfig

9
ios/Runner.xcodeproj/project.pbxproj

@ -523,7 +523,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = 23;
DEVELOPMENT_TEAM = 42C82SZUVX; DEVELOPMENT_TEAM = 42C82SZUVX;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@ -532,6 +532,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound; PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -723,7 +724,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = 23;
DEVELOPMENT_TEAM = 42C82SZUVX; DEVELOPMENT_TEAM = 42C82SZUVX;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@ -732,6 +733,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound; PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -748,7 +750,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = 23;
DEVELOPMENT_TEAM = 42C82SZUVX; DEVELOPMENT_TEAM = 42C82SZUVX;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@ -757,6 +759,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound; PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

4
ios/Runner/BluetoothMediaButtonHelper.swift

@ -230,8 +230,8 @@ class BluetoothMediaButtonHelper: NSObject, AVAudioPlayerDelegate {
// 创建音频专辑图片 // 创建音频专辑图片
let albumArt = UIImage(named: "AppIcon") // 使用应用图标作为专辑图片 let albumArt = UIImage(named: "AppIcon") // 使用应用图标作为专辑图片
var nowPlayingInfo: [String: Any] = [ var nowPlayingInfo: [String: Any] = [
MPMediaItemPropertyTitle: "DeepVoice 语音助手", MPMediaItemPropertyTitle: "DeepSound 语音助手",
MPMediaItemPropertyArtist: "DeepVoice", MPMediaItemPropertyArtist: "DeepSound",
MPNowPlayingInfoPropertyPlaybackRate: isPlaying ? 1.0 : 0.0, // 1.0表示正在播放 MPNowPlayingInfoPropertyPlaybackRate: isPlaying ? 1.0 : 0.0, // 1.0表示正在播放
MPNowPlayingInfoPropertyElapsedPlaybackTime: currentPlaybackTime, MPNowPlayingInfoPropertyElapsedPlaybackTime: currentPlaybackTime,
MPMediaItemPropertyPlaybackDuration: totalDuration MPMediaItemPropertyPlaybackDuration: totalDuration

4
ios/Runner/Info.plist

@ -2,12 +2,14 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key> <key>CADisableMinimumFrameDurationOnPhone</key>
<true/> <true/>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Deep Voice</string> <string>DeepSound</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>

4
lib/core/translations/language/en_us.dart

@ -99,8 +99,8 @@ const Map<String, String> enUS = {
"simultaneousTranslationInfo": "Instant translation for 80+ languages", "simultaneousTranslationInfo": "Instant translation for 80+ languages",
"aiGirlfriend": "Parent-child bondingn", "aiGirlfriend": "Parent-child bondingn",
"aiGirlfriendInfo": "Intelligent company, chat at any time", "aiGirlfriendInfo": "Intelligent company, chat at any time",
"healthConsultant": "Health Consultant", "healthConsultant": "Multi-function AI chat",
"healthConsultantInfo": "Provides scientific health advice", "healthConsultantInfo": "More AI chat features",
"conferenceAssistant": "Business Meeting Assistant", "conferenceAssistant": "Business Meeting Assistant",
"conferenceAssistantInfo": "conferenceAssistantInfo":
"Real-time minutes recording and multilingual translation", "Real-time minutes recording and multilingual translation",

4
lib/core/translations/language/zh_cn.dart

@ -98,8 +98,8 @@ const Map<String, String> zhCN = {
"simultaneousTranslationInfo": "实时翻译80+种语言", "simultaneousTranslationInfo": "实时翻译80+种语言",
"aiGirlfriend": "亲子陪伴", "aiGirlfriend": "亲子陪伴",
"aiGirlfriendInfo": "智能陪伴,随时聊天", "aiGirlfriendInfo": "智能陪伴,随时聊天",
"healthConsultant": "健康顾问", "healthConsultant": "多功能AI聊天",
"healthConsultantInfo": "提供科学健康建议", "healthConsultantInfo": "提供更多AI聊天功能",
"conferenceAssistant": "商务会议助手", "conferenceAssistant": "商务会议助手",
"conferenceAssistantInfo": "实时记录会议纪要,多语言翻译", "conferenceAssistantInfo": "实时记录会议纪要,多语言翻译",
"studyAssistant": "语言学习助手", "studyAssistant": "语言学习助手",

8
lib/data/providers/agent_provider.dart

@ -130,15 +130,13 @@ class AgentProvider {
'''), '''),
Agent( Agent(
id: 'health_advisor', id: 'health_advisor',
name: '健康顾问 吴小江博士', name: '多功能AI聊天 吴小江',
avatarUrl: 'assets/images/agents/doctor.png', avatarUrl: 'assets/images/agents/doctor.png',
description: description: '我是吴小江,我可以为你提供更多AI聊天功能。',
'我是吴博士,拥有丰富的健康管理经验。我可以为你提供科学的健康建议、生活方式指导和疾病预防知识,帮助你实现身心健康的平衡。',
tag: '健康', tag: '健康',
isOnline: true, isOnline: true,
voice: "zh_male_shaonianzixin_moon_bigtts", voice: "zh_male_shaonianzixin_moon_bigtts",
welcomeMessage: welcomeMessage: "您好,我是吴小江,很高兴能为您提供多功能AI聊天。我将用专业知识帮助您。请问有什么问题想咨询吗?",
"您好,我是李医生,很高兴能为您提供健康咨询服务。健康是人生最宝贵的财富,我将用专业知识帮助您维护和改善健康状况。请问有什么健康问题想咨询吗?",
systemPrompt: ''' systemPrompt: '''
你是一位名叫李医生的健康顾问,拥有丰富的医学知识和健康管理经验。 你是一位名叫李医生的健康顾问,拥有丰富的医学知识和健康管理经验。

6
lib/data/services/deapsound_ai_service.dart

@ -20,7 +20,7 @@ class DeapsoundAIService implements AiService {
required String systemPrompt, required String systemPrompt,
}) async* { }) async* {
final client = http.Client(); final client = http.Client();
final url = Uri.parse('https://www.deapsound.com/ai/chat'); final url = Uri.parse('https://www.deapsound.com/ai/funcchat');
final headers = { final headers = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@ -51,8 +51,8 @@ class DeapsoundAIService implements AiService {
if (data['event'] == 'workflow_finished') { if (data['event'] == 'workflow_finished') {
break; break;
} }
if (data['event'] == 'text_chunk') { if (data['content'] != null) {
String content = data['data']['text'] ?? ''; String content = data['content'] ?? '';
if (content.isNotEmpty) { if (content.isNotEmpty) {
yield content; yield content;
} }

15
lib/data/services/speech_impl/volcano_asr_api_service.dart

@ -262,7 +262,8 @@ class VolcanoAsrApiService implements AsrService {
_hostUrl = dotenv.env['VOLCANO_HOST_URL'] ?? 'ws-api-asr.volces.com'; _hostUrl = dotenv.env['VOLCANO_HOST_URL'] ?? 'ws-api-asr.volces.com';
if (_appKey.isEmpty || _secretKey.isEmpty || _serviceId.isEmpty) { if (_appKey.isEmpty || _secretKey.isEmpty || _serviceId.isEmpty) {
throw Exception('未找到火山语音API配置,请在.env文件中设置VOLCANO_APP_KEY, VOLCANO_SECRET_KEY和VOLCANO_SERVICE_ID'); throw Exception(
'未找到火山语音API配置,请在.env文件中设置VOLCANO_APP_KEY, VOLCANO_SECRET_KEY和VOLCANO_SERVICE_ID');
} }
} }
@ -379,7 +380,7 @@ class VolcanoAsrApiService implements AsrService {
// 构建请求头 // 构建请求头
final headers = <String, String>{ final headers = <String, String>{
'User-Agent': 'Deep Voice App/1.0.0', 'User-Agent': 'DeepSound App/1.0.0',
}; };
return (url, kIsWeb ? null : headers); return (url, kIsWeb ? null : headers);
@ -649,7 +650,8 @@ class VolcanoAsrApiService implements AsrService {
/// 处理结果消息 /// 处理结果消息
void _handleResultMessage(Map<String, dynamic> data) { void _handleResultMessage(Map<String, dynamic> data) {
try { try {
final Map<String, dynamic>? result = data['result'] as Map<String, dynamic>?; final Map<String, dynamic>? result =
data['result'] as Map<String, dynamic>?;
if (result == null) return; if (result == null) return;
final bool isEnd = result['is_end'] as bool? ?? false; final bool isEnd = result['is_end'] as bool? ?? false;
@ -693,7 +695,8 @@ class VolcanoAsrApiService implements AsrService {
Logger.error('语音识别开始失败: [$code] $message'); Logger.error('语音识别开始失败: [$code] $message');
if (_recognitionController != null && !_recognitionController!.isClosed) { if (_recognitionController != null && !_recognitionController!.isClosed) {
_recognitionController!.add(RecognitionEvent.error('开始失败: [$code] $message')); _recognitionController!
.add(RecognitionEvent.error('开始失败: [$code] $message'));
} }
} }
} }
@ -759,7 +762,9 @@ class VolcanoAsrApiService implements AsrService {
} }
// 通知会话已结束 // 通知会话已结束
if (_recognitionController != null && !_recognitionController!.isClosed && !_isRecognitionEndRequested) { if (_recognitionController != null &&
!_recognitionController!.isClosed &&
!_isRecognitionEndRequested) {
_recognitionController!.add(RecognitionEvent( _recognitionController!.add(RecognitionEvent(
type: RecognitionEventType.sessionStopped, type: RecognitionEventType.sessionStopped,
)); ));

2
lib/main.dart

@ -30,7 +30,7 @@ void main() async {
const double width = 375.0; const double width = 375.0;
const double height = 812.0; const double height = 812.0;
setWindowTitle('Deep Voice'); setWindowTitle('DeepSound');
setWindowMinSize(const Size(width, height)); setWindowMinSize(const Size(width, height));
setWindowMaxSize(const Size(width, height)); setWindowMaxSize(const Size(width, height));

10
lib/modules/chat/controllers/chat_controller.dart

@ -93,16 +93,16 @@ class ChatController extends GetxController {
agent = foundAgent; agent = foundAgent;
switch (agent.id) { switch (agent.id) {
case 'personal_assistant':
// 全能助手
Get.put(DeapsoundAIService());
_aiService = Get.find<DeapsoundAIService>();
break;
case 'cyber_girlfriend': case 'cyber_girlfriend':
// 亲子陪伴 // 亲子陪伴
Get.put(KouziAIService()); Get.put(KouziAIService());
_aiService = Get.find<KouziAIService>(); _aiService = Get.find<KouziAIService>();
break; break;
case 'health_advisor':
// 多功能AI聊天
Get.put(DeapsoundAIService());
_aiService = Get.find<DeapsoundAIService>();
break;
default: default:
_aiService = Get.find<VolcanoAIService>(); _aiService = Get.find<VolcanoAIService>();
} }

2
lib/modules/chat/views/chat_view.dart

@ -2,11 +2,9 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'dart:math'; import 'dart:math';
import 'package:audio_waveforms/audio_waveforms.dart';
import '../controllers/chat_controller.dart'; import '../controllers/chat_controller.dart';
import '../models/message_model.dart'; import '../models/message_model.dart';
import '../../../core/theme/app_colors.dart'; import '../../../core/theme/app_colors.dart';
import '../../../core/widgets/message_bubble.dart';
class ChatView extends GetView<ChatController> { class ChatView extends GetView<ChatController> {
const ChatView({Key? key}) : super(key: key); const ChatView({Key? key}) : super(key: key);

3
lib/modules/meeting/controllers/meeting_details_controller.dart

@ -15,6 +15,8 @@ class MeetingDetailsController extends GetxController
Rx<MeetingModel> meetingData = MeetingModel().obs; Rx<MeetingModel> meetingData = MeetingModel().obs;
Rx<MeetingDetailsModel> dataDetails = MeetingDetailsModel().obs; Rx<MeetingDetailsModel> dataDetails = MeetingDetailsModel().obs;
int seconds = 0;
RxBool isPlay = false.obs; RxBool isPlay = false.obs;
@override @override
@ -36,6 +38,7 @@ class MeetingDetailsController extends GetxController
final data = await SqfliteApi.getMeetingDetails(id); final data = await SqfliteApi.getMeetingDetails(id);
meetingData.value = MeetingModel.fromJson(data); meetingData.value = MeetingModel.fromJson(data);
dataDetails.value = MeetingDetailsModel.fromJson(data['details']); dataDetails.value = MeetingDetailsModel.fromJson(data['details']);
seconds = meetingData.value.seconds;
isLoading.value = false; isLoading.value = false;
} }

58
lib/modules/meeting/controllers/meeting_edit_controller.dart

@ -2,21 +2,23 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/db/sqflite_api.dart';
import '../model/meeting_details_model.dart'; import 'meeting_controller.dart';
import '../model/meeting_model.dart'; import 'meeting_details_controller.dart';
class MeetingEditController extends GetxController class MeetingEditController extends GetxController
with GetSingleTickerProviderStateMixin { with GetSingleTickerProviderStateMixin {
final MeetingController meetingController = Get.find<MeetingController>();
final MeetingDetailsController meetingDetailsController =
Get.find<MeetingDetailsController>();
late AnimationController lottieController; late AnimationController lottieController;
late TextEditingController titleController; late TextEditingController titleController;
late TextEditingController contentController; late TextEditingController contentController;
int id = 0; int creationTime = 0;
RxBool isLoading = true.obs; int id = 0;
Rx<MeetingModel> meetingData = MeetingModel().obs;
Rx<MeetingDetailsModel> dataDetails = MeetingDetailsModel().obs;
RxBool isPlay = false.obs; RxBool isPlay = false.obs;
@ -38,16 +40,13 @@ class MeetingEditController extends GetxController
} }
void _getDataDetails() async { void _getDataDetails() async {
final data = await SqfliteApi.getMeetingDetails(id);
meetingData.value = MeetingModel.fromJson(data);
dataDetails.value = MeetingDetailsModel.fromJson(data['details']);
titleController = TextEditingController( titleController = TextEditingController(
text: meetingData.value.title, text: meetingDetailsController.meetingData.value.title,
); );
contentController = TextEditingController( contentController = TextEditingController(
text: dataDetails.value.content, text: meetingDetailsController.dataDetails.value.content,
); );
isLoading.value = false; creationTime = meetingDetailsController.meetingData.value.creationtime;
} }
void start() { void start() {
@ -59,4 +58,39 @@ class MeetingEditController extends GetxController
isPlay.value = true; isPlay.value = true;
} }
} }
void confirm() async {
String content = contentController.text;
String firstContent =
content.length >= 20 ? content.substring(0, 20) : content;
String title = titleController.text.isNotEmpty
? titleController.text
: meetingDetailsController.meetingData.value.title;
Map<String, Object?> data = {
'title': title,
'firstContent': firstContent,
'seconds': meetingDetailsController.seconds,
'content': contentController.text,
};
final result = await SqfliteApi.editMeeting(id, data);
if (result != null) {
int index = meetingController.dataList.indexWhere(
(item) => item['id'] == id,
);
if (index != -1) {
final dataMap =
Map<String, dynamic>.from(meetingController.dataList[index]);
dataMap['title'] = title;
dataMap['content'] = firstContent;
dataMap['seconds'] = meetingDetailsController.seconds;
meetingController.dataList[index] = dataMap;
}
meetingDetailsController.meetingData.value.title = title;
meetingDetailsController.dataDetails.value.content =
contentController.text;
meetingDetailsController.meetingData.refresh();
meetingDetailsController.dataDetails.refresh();
Get.back();
}
}
} }

8
lib/modules/meeting/views/meeting_edit_view.dart

@ -17,9 +17,7 @@ class MeetingEditView extends GetView<MeetingEditController> {
return Scaffold( return Scaffold(
backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], backgroundColor: isDarkMode ? Colors.black : Colors.grey[50],
appBar: _buildAppBar(isDarkMode), appBar: _buildAppBar(isDarkMode),
body: Obx(() => !controller.isLoading.value body: _buildBody(isDarkMode),
? _buildBody(isDarkMode)
: const SizedBox()),
); );
} }
@ -38,7 +36,7 @@ class MeetingEditView extends GetView<MeetingEditController> {
), ),
actions: [ actions: [
GestureDetector( GestureDetector(
onTap: () {}, onTap: controller.confirm,
child: Padding( child: Padding(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 12.w, horizontal: 12.w,
@ -105,7 +103,7 @@ class MeetingEditView extends GetView<MeetingEditController> {
padding: EdgeInsets.symmetric(vertical: 5.w), padding: EdgeInsets.symmetric(vertical: 5.w),
child: Text( child: Text(
DateUtil.formatDateMs( DateUtil.formatDateMs(
controller.meetingData.value.creationtime, controller.creationTime,
format: DateFormats.y_mo_d_h_m, format: DateFormats.y_mo_d_h_m,
), ),
style: TextStyle( style: TextStyle(

6
macos/Runner.xcodeproj/project.pbxproj

@ -479,7 +479,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.deepVoice.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/deep_voice.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/deep_voice"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/deep_voice.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/deep_voice";
@ -494,7 +494,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.deepVoice.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/deep_voice.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/deep_voice"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/deep_voice.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/deep_voice";
@ -509,7 +509,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.deepVoice.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/deep_voice.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/deep_voice"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/deep_voice.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/deep_voice";

2
macos/Runner/Configs/AppInfo.xcconfig

@ -8,7 +8,7 @@
PRODUCT_NAME = deep_voice PRODUCT_NAME = deep_voice
// The application's bundle identifier // The application's bundle identifier
PRODUCT_BUNDLE_IDENTIFIER = com.example.deepVoice PRODUCT_BUNDLE_IDENTIFIER = com.yunqiinnovation.deepsound
// The copyright displayed in application information // The copyright displayed in application information
PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved.

Loading…
Cancel
Save