feat: Added iOS support
This commit is contained in:
339
phone_agent/config/apps_ios.py
Normal file
339
phone_agent/config/apps_ios.py
Normal file
@@ -0,0 +1,339 @@
|
||||
"""App name to iOS bundle ID mapping for supported applications.
|
||||
|
||||
Based on iOS app bundle ID conventions and common iOS applications.
|
||||
Bundle IDs are in the format: com.company.appName
|
||||
"""
|
||||
|
||||
APP_PACKAGES_IOS: dict[str, str] = {
|
||||
# Tencent Apps (腾讯系)
|
||||
"微信": "com.tencent.xin",
|
||||
"企业微信": "com.tencent.ww",
|
||||
"微信读书": "com.tencent.weread",
|
||||
"微信听书": "com.tencent.wehear",
|
||||
"QQ": "com.tencent.mqq",
|
||||
"QQ音乐": "com.tencent.QQMusic",
|
||||
"QQ阅读": "com.tencent.qqreaderiphone",
|
||||
"QQ邮箱": "com.tencent.qqmail",
|
||||
"QQ浏览器": "com.tencent.mttlite",
|
||||
"TIM": "com.tencent.tim",
|
||||
"微视": "com.tencent.microvision",
|
||||
"腾讯新闻": "com.tencent.info",
|
||||
"腾讯视频": "com.tencent.live4iphone",
|
||||
"腾讯动漫": "com.tencent.ied.app.comic",
|
||||
"腾讯微云": "com.tencent.weiyun",
|
||||
"腾讯体育": "com.tencent.sportskbs",
|
||||
"腾讯文档": "com.tencent.txdocs",
|
||||
"腾讯翻译君": "com.tencent.qqtranslator",
|
||||
"腾讯课堂": "com.tencent.edu",
|
||||
"腾讯地图": "com.tencent.sosomap",
|
||||
"小鹅拼拼": "com.tencent.dwdcoco",
|
||||
"全民k歌": "com.tencent.QQKSong",
|
||||
# Alibaba Apps (阿里系)
|
||||
"支付宝": "com.alipay.iphoneclient",
|
||||
"钉钉": "com.laiwang.DingTalk",
|
||||
"闲鱼": "com.taobao.fleamarket",
|
||||
"淘宝": "com.taobao.taobao4iphone",
|
||||
"斗鱼": "tv.douyu.live",
|
||||
"天猫": "com.taobao.tmall",
|
||||
"口碑": "com.taobao.kbmeishi",
|
||||
"饿了么": "me.ele.ios.eleme",
|
||||
"高德地图": "com.autonavi.amap",
|
||||
"UC浏览器": "com.ucweb.iphone.lowversion",
|
||||
"一淘": "com.taobao.etaocoupon",
|
||||
"飞猪": "com.taobao.travel",
|
||||
"虾米音乐": "com.xiami.spark",
|
||||
"淘票票": "com.taobao.movie.MoviePhoneClient",
|
||||
"优酷": "com.youku.YouKu",
|
||||
"菜鸟裹裹": "com.cainiao.cnwireless",
|
||||
"土豆视频": "com.tudou.tudouiphone",
|
||||
# ByteDance Apps (字节系)
|
||||
"抖音": "com.ss.iphone.ugc.Aweme",
|
||||
"抖音极速版": "com.ss.iphone.ugc.aweme.lite",
|
||||
"抖音火山版": "com.ss.iphone.ugc.Live",
|
||||
"Tiktok": "com.zhiliaoapp.musically",
|
||||
"飞书": "com.bytedance.ee.lark",
|
||||
"今日头条": "com.ss.iphone.article.News",
|
||||
"西瓜视频": "com.ss.iphone.article.Video",
|
||||
"皮皮虾": "com.bd.iphone.super",
|
||||
# Meituan Apps (美团系)
|
||||
"美团": "com.meituan.imeituan",
|
||||
"美团外卖": "com.meituan.itakeaway",
|
||||
"大众点评": "com.dianping.dpscope",
|
||||
"美团优选": "com.meituan.iyouxuan",
|
||||
"美团优选团长": "com.meituan.igrocery.gh",
|
||||
"美团骑手": "com.meituan.banma.homebrew",
|
||||
"美团开店宝": "com.meituan.imerchantbiz",
|
||||
"美团拍店": "com.meituan.pai",
|
||||
"美团众包": "com.meituan.banma.crowdsource",
|
||||
"美团买菜": "com.baobaoaichi.imaicai",
|
||||
# JD Apps (京东系)
|
||||
"京东": "com.360buy.jdmobile",
|
||||
"京东读书": "com.jd.reader",
|
||||
# NetEase Apps (网易系)
|
||||
"网易新闻": "com.netease.news",
|
||||
"网易云音乐": "com.netease.cloudmusic",
|
||||
"网易邮箱大师": "com.netease.macmail",
|
||||
"网易严选": "com.netease.yanxuan",
|
||||
"网易公开课": "com.netease.videoHD",
|
||||
"网易有道词典": "youdaoPro",
|
||||
"有道云笔记": "com.youdao.note.YoudaoNoteMac",
|
||||
# Baidu Apps (百度系)
|
||||
"百度": "com.baidu.BaiduMobile",
|
||||
"百度网盘": "com.baidu.netdisk",
|
||||
"百度贴吧": "com.baidu.tieba",
|
||||
"百度地图": "com.baidu.map",
|
||||
"百度阅读": "com.baidu.yuedu",
|
||||
"百度翻译": "com.baidu.translate",
|
||||
"百度文库": "com.baidu.Wenku",
|
||||
"百度视频": "com.baidu.videoiphone",
|
||||
"百度输入法": "com.baidu.inputMethod",
|
||||
# Kuaishou Apps (快手系)
|
||||
"快手": "com.jiangjia.gif",
|
||||
"快手极速版": "com.kuaishou.nebula",
|
||||
# Other Popular Apps
|
||||
"哔哩哔哩": "tv.danmaku.bilianime",
|
||||
"芒果TV": "com.hunantv.imgotv",
|
||||
"苏宁易购": "SuningEMall",
|
||||
"微博": "com.sina.weibo",
|
||||
"微博极速版": "com.sina.weibolite",
|
||||
"微博国际": "com.weibo.international",
|
||||
"墨客": "com.moke.moke.iphone",
|
||||
"豆瓣": "com.douban.frodo",
|
||||
"知乎": "com.zhihu.ios",
|
||||
"小红书": "com.xingin.discover",
|
||||
"喜马拉雅": "com.gemd.iting",
|
||||
"得到": "com.luojilab.LuoJiFM-IOS",
|
||||
"得物": "com.siwuai.duapp",
|
||||
"起点读书": "m.qidian.QDReaderAppStore",
|
||||
"番茄小说": "com.dragon.read",
|
||||
"书旗小说": "com.shuqicenter.reader",
|
||||
"拼多多": "com.xunmeng.pinduoduo",
|
||||
"多点": "com.dmall.dmall",
|
||||
"便利蜂": "com.bianlifeng.customer.ios",
|
||||
"亿通行": "com.ruubypay.yitongxing",
|
||||
"云闪付": "com.unionpay.chsp",
|
||||
"大都会Metro": "com.DDH.SHSubway",
|
||||
"爱奇艺视频": "com.qiyi.iphone",
|
||||
"搜狐视频": "com.sohu.iPhoneVideo",
|
||||
"搜狐新闻": "com.sohu.newspaper",
|
||||
"搜狗浏览器": "com.sogou.SogouExplorerMobile",
|
||||
"虎牙": "com.yy.kiwi",
|
||||
"比心": "com.yitan.bixin",
|
||||
"转转": "com.wuba.zhuanzhuan",
|
||||
"YY": "yyvoice",
|
||||
"绿洲": "com.sina.oasis",
|
||||
"陌陌": "com.wemomo.momoappdemo1",
|
||||
"什么值得买": "com.smzdm.client.ios",
|
||||
"美团秀秀": "com.meitu.mtxx",
|
||||
"唯品会": "com.vipshop.iphone",
|
||||
"唱吧": "com.changba.ktv",
|
||||
"酷狗音乐": "com.kugou.kugou1002",
|
||||
"CSDN": "net.csdn.CsdnPlus",
|
||||
"多抓鱼": "com.duozhuyu.dejavu",
|
||||
"自如": "com.ziroom.ZiroomProject",
|
||||
"携程": "ctrip.com",
|
||||
"去哪儿旅行": "com.qunar.iphoneclient8",
|
||||
"Xmind": "net.xmind.brownieapp",
|
||||
"印象笔记": "com.yinxiang.iPhone",
|
||||
"欧陆词典": "eusoft.eudic.pro",
|
||||
"115": "com.115.personal",
|
||||
"名片全能王": "com.intsig.camcard.lite",
|
||||
"中国银行": "com.boc.BOCMBCI",
|
||||
"58同城": "com.taofang.iphone",
|
||||
# International Apps
|
||||
"Google Chrome": "com.google.chrome.ios",
|
||||
"Gmail": "com.google.Gmail",
|
||||
"Facebook": "com.facebook.Facebook",
|
||||
"Firefox": "org.mozilla.ios.Firefox",
|
||||
"Messenger": "com.facebook.Messenger",
|
||||
"Instagram": "com.burbn.instagram",
|
||||
"Starbucks": "com.starbucks.mystarbucks",
|
||||
"Luckin Coffee": "com.bjlc.luckycoffee",
|
||||
"Line": "jp.naver.line",
|
||||
"Linkedin": "com.linkedin.LinkedIn",
|
||||
"Dcard": "com.dcard.app.Dcard",
|
||||
"Youtube": "com.google.ios.youtube",
|
||||
"Spotify": "com.spotify.client",
|
||||
"Netflix": "com.netflix.Netflix",
|
||||
"Twitter": "com.atebits.Tweetie2",
|
||||
"WhatsApp": "net.whatsapp.WhatsApp",
|
||||
# Apple Native Apps (Apple 原生应用)
|
||||
"Safari": "com.apple.mobilesafari",
|
||||
"App Store": "com.apple.AppStore",
|
||||
"设置": "com.apple.Preferences",
|
||||
"相机": "com.apple.camera",
|
||||
"照片": "com.apple.mobileslideshow",
|
||||
"时钟": "com.apple.mobiletimer",
|
||||
"闹钟": "com.apple.mobiletimer",
|
||||
"备忘录": "com.apple.mobilenotes",
|
||||
"提醒事项": "com.apple.reminders",
|
||||
"快捷指令": "com.apple.shortcuts",
|
||||
"天气": "com.apple.weather",
|
||||
"日历": "com.apple.mobilecal",
|
||||
"地图": "com.apple.Maps",
|
||||
"电话": "com.apple.mobilephone",
|
||||
"通讯录": "com.apple.MobileAddressBook",
|
||||
"信息": "com.apple.MobileSMS",
|
||||
"Facetime": "com.apple.facetime",
|
||||
"FaceTime": "com.apple.facetime",
|
||||
"计算器": "com.apple.calculator",
|
||||
"家庭": "com.apple.Home",
|
||||
"健康": "com.apple.Health",
|
||||
"钱包": "com.apple.Passbook",
|
||||
"股市": "com.apple.stocks",
|
||||
"图书": "com.apple.iBooks",
|
||||
"新闻": "com.apple.news",
|
||||
"视频": "com.apple.tv",
|
||||
"文件": "com.apple.DocumentsApp",
|
||||
"邮件": "com.apple.mobilemail",
|
||||
"查找": "com.apple.findmy",
|
||||
"翻译": "com.apple.Translate",
|
||||
"音乐": "com.apple.Music",
|
||||
"播客": "com.apple.podcasts",
|
||||
"库乐队": "com.apple.mobilegarageband",
|
||||
"语音备忘录": "com.apple.VoiceMemos",
|
||||
"iMovie": "com.apple.iMovie",
|
||||
"Watch": "com.apple.Bridge",
|
||||
"Apple Store": "com.apple.store.Jolly",
|
||||
"TestFlight": "com.apple.TestFlight",
|
||||
"Keynote": "com.apple.Keynote",
|
||||
"Keynote 讲演": "com.apple.Keynote",
|
||||
}
|
||||
|
||||
|
||||
def get_bundle_id(app_name: str) -> str | None:
|
||||
"""
|
||||
Get the iOS bundle ID for an app.
|
||||
|
||||
Args:
|
||||
app_name: The display name of the app.
|
||||
|
||||
Returns:
|
||||
The iOS bundle ID, or None if not found.
|
||||
"""
|
||||
return APP_PACKAGES_IOS.get(app_name)
|
||||
|
||||
|
||||
def get_app_name(bundle_id: str) -> str | None:
|
||||
"""
|
||||
Get the app name from an iOS bundle ID.
|
||||
|
||||
Args:
|
||||
bundle_id: The iOS bundle ID.
|
||||
|
||||
Returns:
|
||||
The display name of the app, or None if not found.
|
||||
"""
|
||||
for name, bid in APP_PACKAGES_IOS.items():
|
||||
if bid == bundle_id:
|
||||
return name
|
||||
return None
|
||||
|
||||
|
||||
def list_supported_apps() -> list[str]:
|
||||
"""
|
||||
Get a list of all supported iOS app names.
|
||||
|
||||
Returns:
|
||||
List of app names.
|
||||
"""
|
||||
return list(APP_PACKAGES_IOS.keys())
|
||||
|
||||
|
||||
def check_app_installed(app_name: str, wda_url: str = "http://localhost:8100") -> bool:
|
||||
"""
|
||||
Check if an app is installed on the iOS device.
|
||||
|
||||
Args:
|
||||
app_name: The display name of the app.
|
||||
wda_url: WebDriverAgent URL.
|
||||
|
||||
Returns:
|
||||
True if app is installed, False otherwise.
|
||||
|
||||
Note:
|
||||
This uses the iTunes API to get app information. For actual
|
||||
installation check on device, you would need to use WDA's
|
||||
app listing capabilities or URL scheme checking.
|
||||
"""
|
||||
bundle_id = get_bundle_id(app_name)
|
||||
if not bundle_id:
|
||||
return False
|
||||
|
||||
try:
|
||||
import requests
|
||||
|
||||
# Query iTunes API for app info
|
||||
url = f"https://itunes.apple.com/lookup?bundleId={bundle_id}"
|
||||
response = requests.get(url, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return data.get("resultCount", 0) > 0
|
||||
|
||||
except ImportError:
|
||||
print("Error: requests library required. Install: pip install requests")
|
||||
except Exception as e:
|
||||
print(f"Error checking app installation: {e}")
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def get_app_info_from_itunes(bundle_id: str) -> dict | None:
|
||||
"""
|
||||
Get app information from iTunes API using bundle ID.
|
||||
|
||||
Args:
|
||||
bundle_id: The iOS bundle ID.
|
||||
|
||||
Returns:
|
||||
Dictionary with app info (name, version, etc.) or None if not found.
|
||||
"""
|
||||
try:
|
||||
import requests
|
||||
|
||||
url = f"https://itunes.apple.com/lookup?bundleId={bundle_id}"
|
||||
response = requests.get(url, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
results = data.get("results", [])
|
||||
if results:
|
||||
return results[0]
|
||||
|
||||
except ImportError:
|
||||
print("Error: requests library required. Install: pip install requests")
|
||||
except Exception as e:
|
||||
print(f"Error fetching app info: {e}")
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_app_info_by_id(app_store_id: str) -> dict | None:
|
||||
"""
|
||||
Get app information from iTunes API using App Store ID.
|
||||
|
||||
Args:
|
||||
app_store_id: The numeric App Store ID (e.g., "414478124" for WeChat).
|
||||
|
||||
Returns:
|
||||
Dictionary with app info or None if not found.
|
||||
"""
|
||||
try:
|
||||
import requests
|
||||
|
||||
url = f"https://itunes.apple.com/lookup?id={app_store_id}"
|
||||
response = requests.get(url, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
results = data.get("results", [])
|
||||
if results:
|
||||
return results[0]
|
||||
|
||||
except ImportError:
|
||||
print("Error: requests library required. Install: pip install requests")
|
||||
except Exception as e:
|
||||
print(f"Error fetching app info by ID: {e}")
|
||||
|
||||
return None
|
||||
Reference in New Issue
Block a user