@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/es/bin.mjs +202 -3
- package/dist/es/index.mjs +202 -3
- package/dist/es/mcp-server.mjs +203 -4
- package/dist/lib/bin.js +202 -3
- package/dist/lib/index.js +202 -3
- package/dist/lib/mcp-server.js +203 -4
- package/dist/types/index.d.ts +23 -1
- package/dist/types/mcp-server.d.ts +23 -1
- package/package.json +5 -5
- package/static/index.html +1 -1
- package/static/static/js/{index.c1613c65.js → index.2cb4c005.js} +3 -3
- package/static/static/js/{index.c1613c65.js.map → index.2cb4c005.js.map} +1 -1
- /package/static/static/js/{index.c1613c65.js.LICENSE.txt → index.2cb4c005.js.LICENSE.txt} +0 -0
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
|
|
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
|
|
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');
|
package/dist/lib/mcp-server.js
CHANGED
|
@@ -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
|
|
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
|
|
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.
|
|
1330
|
+
version: "1.2.2-beta-20260115034338.0",
|
|
1132
1331
|
description: 'Control the iOS device using natural language commands'
|
|
1133
1332
|
}, toolsManager);
|
|
1134
1333
|
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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.
|
|
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/
|
|
47
|
-
"@midscene/shared": "1.2.
|
|
48
|
-
"@midscene/
|
|
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.
|
|
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.
|
|
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>
|