@midscene/ios 1.2.1 → 1.2.2-beta-20260115034338.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib/index.js CHANGED
@@ -559,12 +559,21 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
559
559
  throw new Error(`Unable to connect to iOS device ${this.deviceId}: ${e}`);
560
560
  }
561
561
  }
562
+ setAppNameMapping(mapping) {
563
+ this.appNameMapping = mapping;
564
+ }
565
+ resolveBundleId(appName) {
566
+ if (appName in this.appNameMapping) return this.appNameMapping[appName];
567
+ }
562
568
  async launch(uri) {
563
569
  this.uri = uri;
564
570
  try {
565
571
  debugDevice(`Launching app: ${uri}`);
566
572
  if (uri.startsWith('http://') || uri.startsWith('https://') || uri.includes('://')) await this.openUrl(uri);
567
- else await this.wdaBackend.launchApp(uri);
573
+ else {
574
+ const resolvedUri = this.resolveBundleId(uri) ?? uri;
575
+ await this.wdaBackend.launchApp(resolvedUri);
576
+ }
568
577
  debugDevice(`Successfully launched: ${uri}`);
569
578
  } catch (error) {
570
579
  debugDevice(`Error launching ${uri}: ${error}`);
@@ -945,6 +954,7 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
945
954
  _define_property(this, "customActions", void 0);
946
955
  _define_property(this, "wdaBackend", void 0);
947
956
  _define_property(this, "wdaManager", void 0);
957
+ _define_property(this, "appNameMapping", {});
948
958
  _define_property(this, "interfaceType", 'ios');
949
959
  _define_property(this, "uri", void 0);
950
960
  _define_property(this, "options", void 0);
@@ -965,7 +975,7 @@ const runWdaRequestParamSchema = core_namespaceObject.z.object({
965
975
  endpoint: core_namespaceObject.z.string().describe('WebDriver API endpoint'),
966
976
  data: core_namespaceObject.z.object({}).passthrough().optional().describe('Optional request body data as JSON object')
967
977
  });
968
- const launchParamSchema = core_namespaceObject.z.string().describe('App bundle ID or URL to launch');
978
+ const launchParamSchema = core_namespaceObject.z.string().describe('App bundle ID, URL, or app name');
969
979
  const createPlatformActions = (device)=>({
970
980
  RunWdaRequest: (0, device_namespaceObject.defineAction)({
971
981
  name: 'RunWdaRequest',
@@ -999,6 +1009,190 @@ const createPlatformActions = (device)=>({
999
1009
  })
1000
1010
  });
1001
1011
  const agent_namespaceObject = require("@midscene/core/agent");
1012
+ const defaultAppNameMapping = {
1013
+ 微信: 'com.tencent.xin',
1014
+ 企业微信: 'com.tencent.ww',
1015
+ 微信读书: 'com.tencent.weread',
1016
+ 微信听书: 'com.tencent.wehear',
1017
+ QQ: 'com.tencent.mqq',
1018
+ QQ音乐: 'com.tencent.QQMusic',
1019
+ QQ阅读: 'com.tencent.qqreaderiphone',
1020
+ QQ邮箱: 'com.tencent.qqmail',
1021
+ QQ浏览器: 'com.tencent.mttlite',
1022
+ TIM: 'com.tencent.tim',
1023
+ 微视: 'com.tencent.microvision',
1024
+ 腾讯新闻: 'com.tencent.info',
1025
+ 腾讯视频: 'com.tencent.live4iphone',
1026
+ 腾讯动漫: 'com.tencent.ied.app.comic',
1027
+ 腾讯微云: 'com.tencent.weiyun',
1028
+ 腾讯体育: 'com.tencent.sportskbs',
1029
+ 腾讯文档: 'com.tencent.txdocs',
1030
+ 腾讯翻译君: 'com.tencent.qqtranslator',
1031
+ 腾讯课堂: 'com.tencent.edu',
1032
+ 腾讯地图: 'com.tencent.sosomap',
1033
+ 小鹅拼拼: 'com.tencent.dwdcoco',
1034
+ 全民k歌: 'com.tencent.QQKSong',
1035
+ 支付宝: 'com.alipay.iphoneclient',
1036
+ 钉钉: 'com.laiwang.DingTalk',
1037
+ 闲鱼: 'com.taobao.fleamarket',
1038
+ 淘宝: 'com.taobao.taobao4iphone',
1039
+ 斗鱼: 'tv.douyu.live',
1040
+ 天猫: 'com.taobao.tmall',
1041
+ 口碑: 'com.taobao.kbmeishi',
1042
+ 饿了么: 'me.ele.ios.eleme',
1043
+ 高德地图: 'com.autonavi.amap',
1044
+ UC浏览器: 'com.ucweb.iphone.lowversion',
1045
+ 一淘: 'com.taobao.etaocoupon',
1046
+ 飞猪: 'com.taobao.travel',
1047
+ 虾米音乐: 'com.xiami.spark',
1048
+ 淘票票: 'com.taobao.movie.MoviePhoneClient',
1049
+ 优酷: 'com.youku.YouKu',
1050
+ 菜鸟裹裹: 'com.cainiao.cnwireless',
1051
+ 土豆视频: 'com.tudou.tudouiphone',
1052
+ 抖音: 'com.ss.iphone.ugc.Aweme',
1053
+ 抖音极速版: 'com.ss.iphone.ugc.aweme.lite',
1054
+ 抖音火山版: 'com.ss.iphone.ugc.Live',
1055
+ Tiktok: 'com.zhiliaoapp.musically',
1056
+ 飞书: 'com.bytedance.ee.lark',
1057
+ 今日头条: 'com.ss.iphone.article.News',
1058
+ 西瓜视频: 'com.ss.iphone.article.Video',
1059
+ 皮皮虾: 'com.bd.iphone.super',
1060
+ 美团: 'com.meituan.imeituan',
1061
+ 美团外卖: 'com.meituan.itakeaway',
1062
+ 大众点评: 'com.dianping.dpscope',
1063
+ 美团优选: 'com.meituan.iyouxuan',
1064
+ 美团优选团长: 'com.meituan.igrocery.gh',
1065
+ 美团骑手: 'com.meituan.banma.homebrew',
1066
+ 美团开店宝: 'com.meituan.imerchantbiz',
1067
+ 美团拍店: 'com.meituan.pai',
1068
+ 美团众包: 'com.meituan.banma.crowdsource',
1069
+ 美团买菜: 'com.baobaoaichi.imaicai',
1070
+ 京东: 'com.360buy.jdmobile',
1071
+ 京东读书: 'com.jd.reader',
1072
+ 网易新闻: 'com.netease.news',
1073
+ 网易云音乐: 'com.netease.cloudmusic',
1074
+ 网易邮箱大师: 'com.netease.macmail',
1075
+ 网易严选: 'com.netease.yanxuan',
1076
+ 网易公开课: 'com.netease.videoHD',
1077
+ 网易有道词典: 'youdaoPro',
1078
+ 有道云笔记: 'com.youdao.note.YoudaoNoteMac',
1079
+ 百度: 'com.baidu.BaiduMobile',
1080
+ 百度网盘: 'com.baidu.netdisk',
1081
+ 百度贴吧: 'com.baidu.tieba',
1082
+ 百度地图: 'com.baidu.map',
1083
+ 百度阅读: 'com.baidu.yuedu',
1084
+ 百度翻译: 'com.baidu.translate',
1085
+ 百度文库: 'com.baidu.Wenku',
1086
+ 百度视频: 'com.baidu.videoiphone',
1087
+ 百度输入法: 'com.baidu.inputMethod',
1088
+ 快手: 'com.jiangjia.gif',
1089
+ 快手极速版: 'com.kuaishou.nebula',
1090
+ 哔哩哔哩: 'tv.danmaku.bilianime',
1091
+ 芒果TV: 'com.hunantv.imgotv',
1092
+ 苏宁易购: 'SuningEMall',
1093
+ 微博: 'com.sina.weibo',
1094
+ 微博极速版: 'com.sina.weibolite',
1095
+ 微博国际: 'com.weibo.international',
1096
+ 墨客: 'com.moke.moke.iphone',
1097
+ 豆瓣: 'com.douban.frodo',
1098
+ 知乎: 'com.zhihu.ios',
1099
+ 小红书: 'com.xingin.discover',
1100
+ 喜马拉雅: 'com.gemd.iting',
1101
+ 得到: 'com.luojilab.LuoJiFM-IOS',
1102
+ 得物: 'com.siwuai.duapp',
1103
+ 起点读书: 'm.qidian.QDReaderAppStore',
1104
+ 番茄小说: 'com.dragon.read',
1105
+ 书旗小说: 'com.shuqicenter.reader',
1106
+ 拼多多: 'com.xunmeng.pinduoduo',
1107
+ 多点: 'com.dmall.dmall',
1108
+ 便利蜂: 'com.bianlifeng.customer.ios',
1109
+ 亿通行: 'com.ruubypay.yitongxing',
1110
+ 云闪付: 'com.unionpay.chsp',
1111
+ 大都会Metro: 'com.DDH.SHSubway',
1112
+ 爱奇艺视频: 'com.qiyi.iphone',
1113
+ 搜狐视频: 'com.sohu.iPhoneVideo',
1114
+ 搜狐新闻: 'com.sohu.newspaper',
1115
+ 搜狗浏览器: 'com.sogou.SogouExplorerMobile',
1116
+ 虎牙: 'com.yy.kiwi',
1117
+ 比心: 'com.yitan.bixin',
1118
+ 转转: 'com.wuba.zhuanzhuan',
1119
+ YY: 'yyvoice',
1120
+ 绿洲: 'com.sina.oasis',
1121
+ 陌陌: 'com.wemomo.momoappdemo1',
1122
+ 什么值得买: 'com.smzdm.client.ios',
1123
+ 美团秀秀: 'com.meitu.mtxx',
1124
+ 唯品会: 'com.vipshop.iphone',
1125
+ 唱吧: 'com.changba.ktv',
1126
+ 酷狗音乐: 'com.kugou.kugou1002',
1127
+ CSDN: 'net.csdn.CsdnPlus',
1128
+ 多抓鱼: 'com.duozhuyu.dejavu',
1129
+ 自如: 'com.ziroom.ZiroomProject',
1130
+ 携程: 'ctrip.com',
1131
+ 去哪儿旅行: 'com.qunar.iphoneclient8',
1132
+ Xmind: 'net.xmind.brownieapp',
1133
+ 印象笔记: 'com.yinxiang.iPhone',
1134
+ 欧陆词典: 'eusoft.eudic.pro',
1135
+ 115: 'com.115.personal',
1136
+ 名片全能王: 'com.intsig.camcard.lite',
1137
+ 中国银行: 'com.boc.BOCMBCI',
1138
+ '58同城': 'com.taofang.iphone',
1139
+ 'Google Chrome': 'com.google.chrome.ios',
1140
+ Gmail: 'com.google.Gmail',
1141
+ Facebook: 'com.facebook.Facebook',
1142
+ Firefox: 'org.mozilla.ios.Firefox',
1143
+ Messenger: 'com.facebook.Messenger',
1144
+ Instagram: 'com.burbn.instagram',
1145
+ Starbucks: 'com.starbucks.mystarbucks',
1146
+ 'Luckin Coffee': 'com.bjlc.luckycoffee',
1147
+ Line: 'jp.naver.line',
1148
+ Linkedin: 'com.linkedin.LinkedIn',
1149
+ Dcard: 'com.dcard.app.Dcard',
1150
+ Youtube: 'com.google.ios.youtube',
1151
+ Spotify: 'com.spotify.client',
1152
+ Netflix: 'com.netflix.Netflix',
1153
+ Twitter: 'com.atebits.Tweetie2',
1154
+ WhatsApp: 'net.whatsapp.WhatsApp',
1155
+ Safari: 'com.apple.mobilesafari',
1156
+ 'App Store': 'com.apple.AppStore',
1157
+ 设置: 'com.apple.Preferences',
1158
+ 相机: 'com.apple.camera',
1159
+ 照片: 'com.apple.mobileslideshow',
1160
+ 时钟: 'com.apple.mobiletimer',
1161
+ 闹钟: 'com.apple.mobiletimer',
1162
+ 备忘录: 'com.apple.mobilenotes',
1163
+ 提醒事项: 'com.apple.reminders',
1164
+ 快捷指令: 'com.apple.shortcuts',
1165
+ 天气: 'com.apple.weather',
1166
+ 日历: 'com.apple.mobilecal',
1167
+ 地图: 'com.apple.Maps',
1168
+ 电话: 'com.apple.mobilephone',
1169
+ 通讯录: 'com.apple.MobileAddressBook',
1170
+ 信息: 'com.apple.MobileSMS',
1171
+ Facetime: 'com.apple.facetime',
1172
+ FaceTime: 'com.apple.facetime',
1173
+ 计算器: 'com.apple.calculator',
1174
+ 家庭: 'com.apple.Home',
1175
+ 健康: 'com.apple.Health',
1176
+ 钱包: 'com.apple.Passbook',
1177
+ 股市: 'com.apple.stocks',
1178
+ 图书: 'com.apple.iBooks',
1179
+ 新闻: 'com.apple.news',
1180
+ 视频: 'com.apple.tv',
1181
+ 文件: 'com.apple.DocumentsApp',
1182
+ 邮件: 'com.apple.mobilemail',
1183
+ 查找: 'com.apple.findmy',
1184
+ 翻译: 'com.apple.Translate',
1185
+ 音乐: 'com.apple.Music',
1186
+ 播客: 'com.apple.podcasts',
1187
+ 库乐队: 'com.apple.mobilegarageband',
1188
+ 语音备忘录: 'com.apple.VoiceMemos',
1189
+ iMovie: 'com.apple.iMovie',
1190
+ Watch: 'com.apple.Bridge',
1191
+ 'Apple Store': 'com.apple.store.Jolly',
1192
+ TestFlight: 'com.apple.TestFlight',
1193
+ Keynote: 'com.apple.Keynote',
1194
+ 'Keynote 讲演': 'com.apple.Keynote'
1195
+ };
1002
1196
  const external_node_child_process_namespaceObject = require("node:child_process");
1003
1197
  const external_node_os_namespaceObject = require("node:os");
1004
1198
  const external_node_util_namespaceObject = require("node:util");
@@ -1065,7 +1259,12 @@ class IOSAgent extends agent_namespaceObject.Agent {
1065
1259
  return (...args)=>action(args[0]);
1066
1260
  }
1067
1261
  constructor(device, opts){
1068
- super(device, opts), agent_define_property(this, "launch", void 0), agent_define_property(this, "runWdaRequest", void 0), agent_define_property(this, "home", void 0), agent_define_property(this, "appSwitcher", void 0);
1262
+ super(device, opts), agent_define_property(this, "launch", void 0), agent_define_property(this, "runWdaRequest", void 0), agent_define_property(this, "home", void 0), agent_define_property(this, "appSwitcher", void 0), agent_define_property(this, "appNameMapping", void 0);
1263
+ this.appNameMapping = {
1264
+ ...defaultAppNameMapping,
1265
+ ...opts?.appNameMapping || {}
1266
+ };
1267
+ device.setAppNameMapping(this.appNameMapping);
1069
1268
  this.launch = this.createActionWrapper('Launch');
1070
1269
  this.runWdaRequest = this.createActionWrapper('RunWdaRequest');
1071
1270
  this.home = this.createActionWrapper('IOSHomeButton');
@@ -40,6 +40,190 @@ __webpack_require__.d(__webpack_exports__, {
40
40
  const mcp_namespaceObject = require("@midscene/shared/mcp");
41
41
  const agent_namespaceObject = require("@midscene/core/agent");
42
42
  const logger_namespaceObject = require("@midscene/shared/logger");
43
+ const defaultAppNameMapping = {
44
+ 微信: 'com.tencent.xin',
45
+ 企业微信: 'com.tencent.ww',
46
+ 微信读书: 'com.tencent.weread',
47
+ 微信听书: 'com.tencent.wehear',
48
+ QQ: 'com.tencent.mqq',
49
+ QQ音乐: 'com.tencent.QQMusic',
50
+ QQ阅读: 'com.tencent.qqreaderiphone',
51
+ QQ邮箱: 'com.tencent.qqmail',
52
+ QQ浏览器: 'com.tencent.mttlite',
53
+ TIM: 'com.tencent.tim',
54
+ 微视: 'com.tencent.microvision',
55
+ 腾讯新闻: 'com.tencent.info',
56
+ 腾讯视频: 'com.tencent.live4iphone',
57
+ 腾讯动漫: 'com.tencent.ied.app.comic',
58
+ 腾讯微云: 'com.tencent.weiyun',
59
+ 腾讯体育: 'com.tencent.sportskbs',
60
+ 腾讯文档: 'com.tencent.txdocs',
61
+ 腾讯翻译君: 'com.tencent.qqtranslator',
62
+ 腾讯课堂: 'com.tencent.edu',
63
+ 腾讯地图: 'com.tencent.sosomap',
64
+ 小鹅拼拼: 'com.tencent.dwdcoco',
65
+ 全民k歌: 'com.tencent.QQKSong',
66
+ 支付宝: 'com.alipay.iphoneclient',
67
+ 钉钉: 'com.laiwang.DingTalk',
68
+ 闲鱼: 'com.taobao.fleamarket',
69
+ 淘宝: 'com.taobao.taobao4iphone',
70
+ 斗鱼: 'tv.douyu.live',
71
+ 天猫: 'com.taobao.tmall',
72
+ 口碑: 'com.taobao.kbmeishi',
73
+ 饿了么: 'me.ele.ios.eleme',
74
+ 高德地图: 'com.autonavi.amap',
75
+ UC浏览器: 'com.ucweb.iphone.lowversion',
76
+ 一淘: 'com.taobao.etaocoupon',
77
+ 飞猪: 'com.taobao.travel',
78
+ 虾米音乐: 'com.xiami.spark',
79
+ 淘票票: 'com.taobao.movie.MoviePhoneClient',
80
+ 优酷: 'com.youku.YouKu',
81
+ 菜鸟裹裹: 'com.cainiao.cnwireless',
82
+ 土豆视频: 'com.tudou.tudouiphone',
83
+ 抖音: 'com.ss.iphone.ugc.Aweme',
84
+ 抖音极速版: 'com.ss.iphone.ugc.aweme.lite',
85
+ 抖音火山版: 'com.ss.iphone.ugc.Live',
86
+ Tiktok: 'com.zhiliaoapp.musically',
87
+ 飞书: 'com.bytedance.ee.lark',
88
+ 今日头条: 'com.ss.iphone.article.News',
89
+ 西瓜视频: 'com.ss.iphone.article.Video',
90
+ 皮皮虾: 'com.bd.iphone.super',
91
+ 美团: 'com.meituan.imeituan',
92
+ 美团外卖: 'com.meituan.itakeaway',
93
+ 大众点评: 'com.dianping.dpscope',
94
+ 美团优选: 'com.meituan.iyouxuan',
95
+ 美团优选团长: 'com.meituan.igrocery.gh',
96
+ 美团骑手: 'com.meituan.banma.homebrew',
97
+ 美团开店宝: 'com.meituan.imerchantbiz',
98
+ 美团拍店: 'com.meituan.pai',
99
+ 美团众包: 'com.meituan.banma.crowdsource',
100
+ 美团买菜: 'com.baobaoaichi.imaicai',
101
+ 京东: 'com.360buy.jdmobile',
102
+ 京东读书: 'com.jd.reader',
103
+ 网易新闻: 'com.netease.news',
104
+ 网易云音乐: 'com.netease.cloudmusic',
105
+ 网易邮箱大师: 'com.netease.macmail',
106
+ 网易严选: 'com.netease.yanxuan',
107
+ 网易公开课: 'com.netease.videoHD',
108
+ 网易有道词典: 'youdaoPro',
109
+ 有道云笔记: 'com.youdao.note.YoudaoNoteMac',
110
+ 百度: 'com.baidu.BaiduMobile',
111
+ 百度网盘: 'com.baidu.netdisk',
112
+ 百度贴吧: 'com.baidu.tieba',
113
+ 百度地图: 'com.baidu.map',
114
+ 百度阅读: 'com.baidu.yuedu',
115
+ 百度翻译: 'com.baidu.translate',
116
+ 百度文库: 'com.baidu.Wenku',
117
+ 百度视频: 'com.baidu.videoiphone',
118
+ 百度输入法: 'com.baidu.inputMethod',
119
+ 快手: 'com.jiangjia.gif',
120
+ 快手极速版: 'com.kuaishou.nebula',
121
+ 哔哩哔哩: 'tv.danmaku.bilianime',
122
+ 芒果TV: 'com.hunantv.imgotv',
123
+ 苏宁易购: 'SuningEMall',
124
+ 微博: 'com.sina.weibo',
125
+ 微博极速版: 'com.sina.weibolite',
126
+ 微博国际: 'com.weibo.international',
127
+ 墨客: 'com.moke.moke.iphone',
128
+ 豆瓣: 'com.douban.frodo',
129
+ 知乎: 'com.zhihu.ios',
130
+ 小红书: 'com.xingin.discover',
131
+ 喜马拉雅: 'com.gemd.iting',
132
+ 得到: 'com.luojilab.LuoJiFM-IOS',
133
+ 得物: 'com.siwuai.duapp',
134
+ 起点读书: 'm.qidian.QDReaderAppStore',
135
+ 番茄小说: 'com.dragon.read',
136
+ 书旗小说: 'com.shuqicenter.reader',
137
+ 拼多多: 'com.xunmeng.pinduoduo',
138
+ 多点: 'com.dmall.dmall',
139
+ 便利蜂: 'com.bianlifeng.customer.ios',
140
+ 亿通行: 'com.ruubypay.yitongxing',
141
+ 云闪付: 'com.unionpay.chsp',
142
+ 大都会Metro: 'com.DDH.SHSubway',
143
+ 爱奇艺视频: 'com.qiyi.iphone',
144
+ 搜狐视频: 'com.sohu.iPhoneVideo',
145
+ 搜狐新闻: 'com.sohu.newspaper',
146
+ 搜狗浏览器: 'com.sogou.SogouExplorerMobile',
147
+ 虎牙: 'com.yy.kiwi',
148
+ 比心: 'com.yitan.bixin',
149
+ 转转: 'com.wuba.zhuanzhuan',
150
+ YY: 'yyvoice',
151
+ 绿洲: 'com.sina.oasis',
152
+ 陌陌: 'com.wemomo.momoappdemo1',
153
+ 什么值得买: 'com.smzdm.client.ios',
154
+ 美团秀秀: 'com.meitu.mtxx',
155
+ 唯品会: 'com.vipshop.iphone',
156
+ 唱吧: 'com.changba.ktv',
157
+ 酷狗音乐: 'com.kugou.kugou1002',
158
+ CSDN: 'net.csdn.CsdnPlus',
159
+ 多抓鱼: 'com.duozhuyu.dejavu',
160
+ 自如: 'com.ziroom.ZiroomProject',
161
+ 携程: 'ctrip.com',
162
+ 去哪儿旅行: 'com.qunar.iphoneclient8',
163
+ Xmind: 'net.xmind.brownieapp',
164
+ 印象笔记: 'com.yinxiang.iPhone',
165
+ 欧陆词典: 'eusoft.eudic.pro',
166
+ 115: 'com.115.personal',
167
+ 名片全能王: 'com.intsig.camcard.lite',
168
+ 中国银行: 'com.boc.BOCMBCI',
169
+ '58同城': 'com.taofang.iphone',
170
+ 'Google Chrome': 'com.google.chrome.ios',
171
+ Gmail: 'com.google.Gmail',
172
+ Facebook: 'com.facebook.Facebook',
173
+ Firefox: 'org.mozilla.ios.Firefox',
174
+ Messenger: 'com.facebook.Messenger',
175
+ Instagram: 'com.burbn.instagram',
176
+ Starbucks: 'com.starbucks.mystarbucks',
177
+ 'Luckin Coffee': 'com.bjlc.luckycoffee',
178
+ Line: 'jp.naver.line',
179
+ Linkedin: 'com.linkedin.LinkedIn',
180
+ Dcard: 'com.dcard.app.Dcard',
181
+ Youtube: 'com.google.ios.youtube',
182
+ Spotify: 'com.spotify.client',
183
+ Netflix: 'com.netflix.Netflix',
184
+ Twitter: 'com.atebits.Tweetie2',
185
+ WhatsApp: 'net.whatsapp.WhatsApp',
186
+ Safari: 'com.apple.mobilesafari',
187
+ 'App Store': 'com.apple.AppStore',
188
+ 设置: 'com.apple.Preferences',
189
+ 相机: 'com.apple.camera',
190
+ 照片: 'com.apple.mobileslideshow',
191
+ 时钟: 'com.apple.mobiletimer',
192
+ 闹钟: 'com.apple.mobiletimer',
193
+ 备忘录: 'com.apple.mobilenotes',
194
+ 提醒事项: 'com.apple.reminders',
195
+ 快捷指令: 'com.apple.shortcuts',
196
+ 天气: 'com.apple.weather',
197
+ 日历: 'com.apple.mobilecal',
198
+ 地图: 'com.apple.Maps',
199
+ 电话: 'com.apple.mobilephone',
200
+ 通讯录: 'com.apple.MobileAddressBook',
201
+ 信息: 'com.apple.MobileSMS',
202
+ Facetime: 'com.apple.facetime',
203
+ FaceTime: 'com.apple.facetime',
204
+ 计算器: 'com.apple.calculator',
205
+ 家庭: 'com.apple.Home',
206
+ 健康: 'com.apple.Health',
207
+ 钱包: 'com.apple.Passbook',
208
+ 股市: 'com.apple.stocks',
209
+ 图书: 'com.apple.iBooks',
210
+ 新闻: 'com.apple.news',
211
+ 视频: 'com.apple.tv',
212
+ 文件: 'com.apple.DocumentsApp',
213
+ 邮件: 'com.apple.mobilemail',
214
+ 查找: 'com.apple.findmy',
215
+ 翻译: 'com.apple.Translate',
216
+ 音乐: 'com.apple.Music',
217
+ 播客: 'com.apple.podcasts',
218
+ 库乐队: 'com.apple.mobilegarageband',
219
+ 语音备忘录: 'com.apple.VoiceMemos',
220
+ iMovie: 'com.apple.iMovie',
221
+ Watch: 'com.apple.Bridge',
222
+ 'Apple Store': 'com.apple.store.Jolly',
223
+ TestFlight: 'com.apple.TestFlight',
224
+ Keynote: 'com.apple.Keynote',
225
+ 'Keynote 讲演': 'com.apple.Keynote'
226
+ };
43
227
  const external_node_assert_namespaceObject = require("node:assert");
44
228
  var external_node_assert_default = /*#__PURE__*/ __webpack_require__.n(external_node_assert_namespaceObject);
45
229
  const core_namespaceObject = require("@midscene/core");
@@ -558,12 +742,21 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
558
742
  throw new Error(`Unable to connect to iOS device ${this.deviceId}: ${e}`);
559
743
  }
560
744
  }
745
+ setAppNameMapping(mapping) {
746
+ this.appNameMapping = mapping;
747
+ }
748
+ resolveBundleId(appName) {
749
+ if (appName in this.appNameMapping) return this.appNameMapping[appName];
750
+ }
561
751
  async launch(uri) {
562
752
  this.uri = uri;
563
753
  try {
564
754
  debugDevice(`Launching app: ${uri}`);
565
755
  if (uri.startsWith('http://') || uri.startsWith('https://') || uri.includes('://')) await this.openUrl(uri);
566
- else await this.wdaBackend.launchApp(uri);
756
+ else {
757
+ const resolvedUri = this.resolveBundleId(uri) ?? uri;
758
+ await this.wdaBackend.launchApp(resolvedUri);
759
+ }
567
760
  debugDevice(`Successfully launched: ${uri}`);
568
761
  } catch (error) {
569
762
  debugDevice(`Error launching ${uri}: ${error}`);
@@ -944,6 +1137,7 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
944
1137
  _define_property(this, "customActions", void 0);
945
1138
  _define_property(this, "wdaBackend", void 0);
946
1139
  _define_property(this, "wdaManager", void 0);
1140
+ _define_property(this, "appNameMapping", {});
947
1141
  _define_property(this, "interfaceType", 'ios');
948
1142
  _define_property(this, "uri", void 0);
949
1143
  _define_property(this, "options", void 0);
@@ -964,7 +1158,7 @@ const runWdaRequestParamSchema = core_namespaceObject.z.object({
964
1158
  endpoint: core_namespaceObject.z.string().describe('WebDriver API endpoint'),
965
1159
  data: core_namespaceObject.z.object({}).passthrough().optional().describe('Optional request body data as JSON object')
966
1160
  });
967
- const launchParamSchema = core_namespaceObject.z.string().describe('App bundle ID or URL to launch');
1161
+ const launchParamSchema = core_namespaceObject.z.string().describe('App bundle ID, URL, or app name');
968
1162
  const createPlatformActions = (device)=>({
969
1163
  RunWdaRequest: (0, device_namespaceObject.defineAction)({
970
1164
  name: 'RunWdaRequest',
@@ -1063,7 +1257,12 @@ class IOSAgent extends agent_namespaceObject.Agent {
1063
1257
  return (...args)=>action(args[0]);
1064
1258
  }
1065
1259
  constructor(device, opts){
1066
- super(device, opts), agent_define_property(this, "launch", void 0), agent_define_property(this, "runWdaRequest", void 0), agent_define_property(this, "home", void 0), agent_define_property(this, "appSwitcher", void 0);
1260
+ super(device, opts), agent_define_property(this, "launch", void 0), agent_define_property(this, "runWdaRequest", void 0), agent_define_property(this, "home", void 0), agent_define_property(this, "appSwitcher", void 0), agent_define_property(this, "appNameMapping", void 0);
1261
+ this.appNameMapping = {
1262
+ ...defaultAppNameMapping,
1263
+ ...opts?.appNameMapping || {}
1264
+ };
1265
+ device.setAppNameMapping(this.appNameMapping);
1067
1266
  this.launch = this.createActionWrapper('Launch');
1068
1267
  this.runWdaRequest = this.createActionWrapper('RunWdaRequest');
1069
1268
  this.home = this.createActionWrapper('IOSHomeButton');
@@ -1128,7 +1327,7 @@ class IOSMCPServer extends mcp_namespaceObject.BaseMCPServer {
1128
1327
  constructor(toolsManager){
1129
1328
  super({
1130
1329
  name: '@midscene/ios-mcp',
1131
- version: "1.2.1",
1330
+ version: "1.2.2-beta-20260115034338.0",
1132
1331
  description: 'Control the iOS device using natural language commands'
1133
1332
  }, toolsManager);
1134
1333
  }
@@ -50,11 +50,21 @@ export declare class IOSAgent extends Agent<IOSDevice> {
50
50
  * Trigger the system app switcher operation on iOS devices
51
51
  */
52
52
  appSwitcher: WrappedAction<DeviceActionIOSAppSwitcher>;
53
+ /**
54
+ * User-provided app name to bundle ID mapping
55
+ */
56
+ private appNameMapping;
53
57
  constructor(device: IOSDevice, opts?: IOSAgentOpt);
54
58
  private createActionWrapper;
55
59
  }
56
60
 
57
- export declare type IOSAgentOpt = AgentOpt;
61
+ export declare type IOSAgentOpt = AgentOpt & {
62
+ /**
63
+ * Custom mapping of app names to bundle IDs
64
+ * User-provided mappings will take precedence over default mappings
65
+ */
66
+ appNameMapping?: Record<string, string>;
67
+ };
58
68
 
59
69
  export declare class IOSDevice implements AbstractInterface {
60
70
  private deviceId;
@@ -65,6 +75,7 @@ export declare class IOSDevice implements AbstractInterface {
65
75
  private customActions?;
66
76
  private wdaBackend;
67
77
  private wdaManager;
78
+ private appNameMapping;
68
79
  interfaceType: InterfaceType;
69
80
  uri: string | undefined;
70
81
  options?: IOSDeviceOpt;
@@ -77,6 +88,17 @@ export declare class IOSDevice implements AbstractInterface {
77
88
  model: string;
78
89
  } | null>;
79
90
  connect(): Promise<void>;
91
+ /**
92
+ * Set the app name to bundle ID mapping
93
+ */
94
+ setAppNameMapping(mapping: Record<string, string>): void;
95
+ /**
96
+ * Resolve app name to bundle ID using the mapping.
97
+ * Returns the bundle ID if found, otherwise undefined.
98
+ *
99
+ * @param appName The app name to resolve.
100
+ */
101
+ private resolveBundleId;
80
102
  launch(uri: string): Promise<IOSDevice>;
81
103
  getElementsInfo(): Promise<ElementInfo[]>;
82
104
  getElementsNodeTree(): Promise<any>;
@@ -47,11 +47,21 @@ declare class IOSAgent extends Agent<IOSDevice> {
47
47
  * Trigger the system app switcher operation on iOS devices
48
48
  */
49
49
  appSwitcher: WrappedAction<DeviceActionIOSAppSwitcher>;
50
+ /**
51
+ * User-provided app name to bundle ID mapping
52
+ */
53
+ private appNameMapping;
50
54
  constructor(device: IOSDevice, opts?: IOSAgentOpt);
51
55
  private createActionWrapper;
52
56
  }
53
57
 
54
- declare type IOSAgentOpt = AgentOpt;
58
+ declare type IOSAgentOpt = AgentOpt & {
59
+ /**
60
+ * Custom mapping of app names to bundle IDs
61
+ * User-provided mappings will take precedence over default mappings
62
+ */
63
+ appNameMapping?: Record<string, string>;
64
+ };
55
65
 
56
66
  declare class IOSDevice implements AbstractInterface {
57
67
  private deviceId;
@@ -62,6 +72,7 @@ declare class IOSDevice implements AbstractInterface {
62
72
  private customActions?;
63
73
  private wdaBackend;
64
74
  private wdaManager;
75
+ private appNameMapping;
65
76
  interfaceType: InterfaceType;
66
77
  uri: string | undefined;
67
78
  options?: IOSDeviceOpt;
@@ -74,6 +85,17 @@ declare class IOSDevice implements AbstractInterface {
74
85
  model: string;
75
86
  } | null>;
76
87
  connect(): Promise<void>;
88
+ /**
89
+ * Set the app name to bundle ID mapping
90
+ */
91
+ setAppNameMapping(mapping: Record<string, string>): void;
92
+ /**
93
+ * Resolve app name to bundle ID using the mapping.
94
+ * Returns the bundle ID if found, otherwise undefined.
95
+ *
96
+ * @param appName The app name to resolve.
97
+ */
98
+ private resolveBundleId;
77
99
  launch(uri: string): Promise<IOSDevice>;
78
100
  getElementsInfo(): Promise<ElementInfo[]>;
79
101
  getElementsNodeTree(): Promise<any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/ios",
3
- "version": "1.2.1",
3
+ "version": "1.2.2-beta-20260115034338.0",
4
4
  "description": "iOS automation library for Midscene",
5
5
  "keywords": [
6
6
  "iOS UI automation",
@@ -43,9 +43,9 @@
43
43
  "dependencies": {
44
44
  "@inquirer/prompts": "^7.8.6",
45
45
  "open": "10.1.0",
46
- "@midscene/core": "1.2.1",
47
- "@midscene/shared": "1.2.1",
48
- "@midscene/webdriver": "1.2.1"
46
+ "@midscene/webdriver": "1.2.2-beta-20260115034338.0",
47
+ "@midscene/shared": "1.2.2-beta-20260115034338.0",
48
+ "@midscene/core": "1.2.2-beta-20260115034338.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@rslib/core": "^0.18.3",
@@ -55,7 +55,7 @@
55
55
  "tsx": "^4.19.2",
56
56
  "vitest": "3.0.5",
57
57
  "zod": "3.24.3",
58
- "@midscene/playground": "1.2.1"
58
+ "@midscene/playground": "1.2.2-beta-20260115034338.0"
59
59
  },
60
60
  "license": "MIT",
61
61
  "scripts": {
package/static/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html><head><link rel="icon" href="/favicon.ico"><title>Midscene Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.7b1abe58.js"></script><script defer src="/static/js/430.53da0b9c.js"></script><script defer src="/static/js/index.c1613c65.js"></script><link href="/static/css/index.58968da2.css" rel="stylesheet"></head><body><div id="root"></div></body></html>
1
+ <!doctype html><html><head><link rel="icon" href="/favicon.ico"><title>Midscene Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.7b1abe58.js"></script><script defer src="/static/js/430.53da0b9c.js"></script><script defer src="/static/js/index.2cb4c005.js"></script><link href="/static/css/index.58968da2.css" rel="stylesheet"></head><body><div id="root"></div></body></html>