OC 需求 检测手机是否安装某个App,app是否安装(删除)appmusic
一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。
前言:2022.08.09的时候做公司的音乐播放器的时候越到了一个很难解决的问题,公司的moods app音乐播放器是用规定用appmusic播放,所以appmusic一旦被删除moods app就不能播放音乐,所以需要检测appmusic是否被删除。很多人判断app是否被删除都会用canOpenURL,但是用来判断appmusic是不行的。他永远返回true,然后用我下面的封装OC CheckAppInstall(检测App是否安装)会导致审核不通过。然后我翻遍了整个百度都没有很好的解决办法,下面的方法一,方法二是网上面,方法三是我自己想出来的,但是没有能力解决崩溃的问题,如果能解决这个问题就解决,但是在绝望之际,我想出了方法四,最终把它解决了,这个方法是基于公司的业务的基础上面来解决的。(解决办法在方法四)
重要提示:下面的封装会导致审核不通过
OC CheckAppInstall(检测App是否安装)(这个封装会导致审核不通过)
下面还提供一些解决办法。
前言
2022.06.23.今天写了一个检测App是否安装的封装,比较准确。
正题
使用起来非常简单。
// 检测手机是否安装否个App
NSLog(@"%ld",[CheckAppInstall checkAppInstallWithBundle:@"com.apple.Music"]);
目前公司有这样一个需求,需要我检测是否安装applemusic的app这个app是苹果手机自带的app有点特殊,因为我们一般检测app是否安装都会用下面的方法。
但是我发现这个方法用来判断非手机自带的app就可以,但是用来判断手机自带的app是不行。当时我删除了appleMusic,使用上面的方法检测发现还是进入了安装了方法,说明这个方法是不行的。
所以才使用上面的封装,上面的封装需要传递app的boundleID去检测,他是获取手机所以app的列表,拿到app的boundleID进行比较,如果列表里面有我传递进去的boundleID一致就返回YES,没有就返回NO。
那么怎么样能拿到app的boundleID呢?
如果是想拿到非苹果自带的app就是在AppStore下载下来的boundleID可以下载。爱思助手
但是不能查苹果手机自带的app,因为爱思助手没有显示苹果自带的app。
还有一个方法,使用下面的网站搜索,输入app名称,然后拿到appid
查找App-按到appid网站
复制Appid然后使用下面的网站,复制进去就可以获取到app的bundle ID
输入AppID–获取iOS App bundle ID 包名
关于boundleID 之前也有人发过博客的获取方法
iOS学习(二十八)AppID/应用ID/Bundle ID 获取、查询和使用
然后下面贴一下长虹app的跳转标识和跳转系统的标识
常用APP的Url Scheme 前缀
QQ mqq://
微信是 weixin://
网易新闻 newsapp://
淘宝 taobao://
点评 dianping:// dianping://search
微博 sinaweibo://
weico微博 weico://
支付宝 alipay://
豆瓣fm doubanradio://
微盘 sinavdisk://
网易公开课 ntesopen://
美团 imeituan://
人人 renren://
我查查 wcc://
1号店 wccbyihaodian://
有道词典 yddictproapp://
知乎 zhihu://
优酷 youku://
ZAKER zakeripad://
mdict mdict://
京东hd openApp.jdiPad://
易迅 icson://;yixunipad://
wunderlist wunderlist://
支付宝 alipay://
查找朋友 grenada://;findmyfriends://;fmf1://
查找iphone fmip1://
触宝拨号 dialer://
蜂窝网络 prefs:root=MOBILE_DATA_SETTINGS_ID
WIFI prefs:root=WIFI(WIFI这几个字母一定要大写)
定位服务 prefs:root=LOCATION_SERVICES
备忘录 mobilenotes://
高德地图 iosamap://
今日头条 snssdk141://
挖财记账 wacai://
QQ音乐 :QQmusic://
猎豹浏览器:sinaweibosso.422729959://
UC浏览器:ucbrowser://
支付宝:alipay://
新浪微博:weibo://
优酷:youku://
节奏大师:节奏大师tencentrm://
刀塔传奇:刀塔传奇teiron2273://
天天动听:ttpod://
淘宝taobao://
名片全能王camcard://
支付宝alipay://
豆瓣fm doubanradio://
微盘 sinavdisk://
网易公开课ntesopen://
我查查 wcc://
1号店wccbyihaodian://
有道词典yddictproapp://
知乎zhihu://
墨客 com.moke.moke-1://
名片全能王 camcard://
扫描全能王 camscanner://
12306订票助手 trainassist://
金山词霸 com.kingsoft.powerword.6://
节奏大师 tencentrm://
凤凰新闻 comIfeng3GifengNews://
高铁管家 gtgj://
飞信 fetion://
豆瓣FM doubanradio://
大智慧 dzhiphone://
布卡漫画 buka://
爱奇艺PPS ppstream://
哔哩哔哩动画 bilibili://
56视频 com.56Video://
365日历 rili365://
58同城 wbmain://
遇见 iaround://
陌陌 momochat://
旺旺卖家版 wangwangseller://
有道词典 yddict://
掌阅iReader iReader://
艺龙旅行 elongIPhone://
迅雷+迅雷云播 thunder://
熊猫公交 wb1405365637://
携程无线 CtripWireless://
无线苏州 SuZhouTV://
唯品会 vipshop://
微视 weishiiosscheme://
微拍 wpweipai://
旺信 wangxin://
网易公开课 ntesopen://
网易将军令 netease-mkey://
万年历 youloft.419805549://
土豆视频 tudou://
同花顺 amihexin://
天涯社区 tianya://
天气通Pro sinaweatherpro://
天气通 sinaweather://
墨迹天气 rm434209233MojiWeather://
腾讯新闻 qqnews://
腾讯微云 weiyun://
腾讯地图 sosomap://
淘宝旅行 taobaotravel://
人人 renrenios://
蜻蜓FM qtfmp://
浦发银行 wx1cb534bb13ba3dbd://
招商银行 cmbmobilebank://
支付宝 alipay://
建设银行 wx2654d9155d70a468://
工商银行 com.icbc.iphoneclient://
酷我音乐 com.kuwo.kwmusic.kwmusicForKwsing://
酷狗音乐 kugouURL://
京东 openApp.jdMobile://
QQ音乐 qqmusic://
QQ斗地主 tencent382://
QQ浏览器 mttbrowser://
QQ安全中心 qmtoken://
QQ国际版 mqqiapi://
PPTV pptv://
爱奇艺视频 qiyi-iphone://
暴风影音 com.baofeng.play://
保卫萝卜2 wb2217954495://
保卫萝卜 wb1308702128://
百度云 baiduyun://
百度音乐 baidumusic://
百度视频 baiduvideoiphone:// 或 bdviphapp://
百度糯米 bainuo://
百度魔图 photowonder://
百度魔拍 wondercamera://
百度地图 baidumap://
百度导航 bdNavi://
百度视频hd BaiduVideoiPad://;baiduvideoipadapp://
百度相册hd BaiDuCloudAlbumHD://
百度浏览器hd bdbrowser://
百度文库hd bdwenku://
搜狗输入法 com.sogou.sogouinput://
搜狐视频 sohuvideo-iphone:// 或 sohuvideo://
搜狐新闻 sohunews://
随手记 FDMoney://
腾讯企业邮箱 qqbizmailDistribute2://
腾讯手机管家 mqqsecure://
腾讯视频 tenvideo:// 或 tenvideo2:// 或 tenvideo3://
腾讯微博 TencentWeibo://
天猫 tmall://
天天星连萌 tencent100689806://
天天爱消除 tencent100689805://
天天酷跑 tencent100692648://
天天飞车 tencent100695850://
天天动听 ttpod://
威锋网 com.weiphone.forum://
新浪微博 weibo:// 或 sinaweibo://
网易邮箱 neteasemail://
百度输入法 BaiduIMShop://
C浏览器 ucbrowser://
一个one clover-one://
当当hd dangdanghd://;ddhd://
大众点评hd dianpinghd://
多看阅读 duokan-reader://
艺龙旅行hd elongiPad://
圈点hd skitch://
印象笔记hd enx://
电话 mobilephone://
备忘录 mobilenotes://
设置 prefs:root=SETTING
定位服务 prefs:root=LOCATION_SERVICES
E-Mail MESSAGE://
popAgraph popagraphtumblr://
dropbox db-auth://;dbapi-1://;dbapi-2://;dbapi-3://
goodreader ghttp://;ghttps://;grhttp://;grhttps://;giwhttp://;giwhttps://;gropen://;com.goodreader.sendtogr://
ifttt ifttt://
名片全能王hd camcard://;CamCardHDOpenAPI://
拉手团购hd LaShouGroupHDPay://
美团hd iMeituan://
evermemo evermemo://
网易云课堂 wangyiyunketang://
网易公开课 ntesopen://
订票助手2 trainassistfree://
pcalc lite pcalc://
爱奇艺视频 QIYIHD-iPad://
三国kill sgk://
扇贝新闻 shanbaynews://
扇贝单词 shanbay://
扇贝单词hd shanbaywordshd://
skype skype://
搜狐视频hd sohu-SViPad://;sohuvideohd://
teamviewer:teamviewer8://
格志 griddiary://;sumi-interactive://
淘宝hd taobao://;itaobao://;taobaohd://
天猫 tmall://
腾讯视频hd tenvideohd://;tenvideo2://
qq通讯录 tencentappqqpim://
同步推正版HD tbtui://;tuihd://
航旅纵横pro umetrippro://
mathpad myscriptmathpad://
雅虎天气! yweather://
一号店 ipadstore://
优酷hd youkuhd://
知乎 zhihu://
欧陆词典pro eudic://
拓词 towordsp://
TuneIn Radio tunein:// 或 tuneinpro://
OfficeSuite mobisystemsofficesuite://
WPS Office KingsoftOfficeApp://
Line line://
1Password onepassword://
Clear(著名的Todo应用) clearapp://
Chrome谷歌浏览器 googlechrome://
Calendars 5 calendars://
PDF Expert 5 pdfexpert5presence://
Documents 5 rdocs://
nPlayer nplayer-http://
GPlayer gplayer://
AVPlayer HD AVPlayerHD://
AVPlayer AVPlayer://
Ace Player aceplayer://
易信 yixin://
Whatsapp whatsapp://
常用iOS 系统功能的Url Scheme 前缀
蜂窝网络 prefs:root=MOBILE_DATA_SETTINGS_ID
VPN prefs:root=General&path=Network/VPN
Wi-Fi prefs:root=WIFI
定位服务 prefs:root=LOCATION_SERVICES
个人热点 prefs:root=INTERNET_TETHERING
关于本机 prefs:root=General&path=About
辅助功能 prefs:root=General&path=ACCESSIBILITY
飞行模式 prefs:root=AIRPLANE_MODE
锁定 prefs:root=General&path=AUTOLOCK
亮度 prefs:root=Brightness
蓝牙 prefs:root=General&path=Bluetooth
时间设置 prefs:root=General&path=DATE_AND_TIME
FaceTime prefs:root=FACETIME
设置 prefs:root=General
键盘设置 prefs:root=General&path=Keyboard
iCloud prefs:root=CASTLE
iCloud备份 prefs:root=CASTLE&path=STORAGE_AND_BACKUP
语言 prefs:root=General&path=INTERNATIONAL
定位 prefs:root=LOCATION_SERVICES
音乐 prefs:root=MUSIC
Music Equalizer prefs:root=MUSIC&path=EQ
Music Volume Limit prefs:root=MUSIC&path=VolumeLimit
Network prefs:root=General&path=Network
Nike + iPod prefs:root=NIKE_PLUS_IPOD
Notes prefs:root=NOTES
Notification prefs:root=NOTIFICATIONS_ID
Phone prefs:root=Phone
Photos prefs:root=Photos
Profile prefs:root=General&path=ManagedConfigurationList
Reset prefs:root=General&path=Reset
Safari prefs:root=Safari
Siri prefs:root=General&path=Assistant
Sounds prefs:root=Sounds
Software Update prefs:root=General&path=SOFTWARE_UPDATE_LINK
Store prefs:root=STORE
Twitter prefs:root=TWITTER
Usage prefs:root=General&path=USAGE
Wallpaper prefs:root=Wallpaper
说明一下:由于下面的图片方法对苹果播放器applemusic判断时候失效,永远返回true,这个是本来是最好的判断方法,所以目前没有其他更好,更直接的解决方法。
也就是说,没有这个判断appmusic是否被删除没有直接的办法判断,但是有见解的办法,但是不太问题喝按键,下买呢介绍一下
另外的解决办法
方法一:我们可以吊起appmusic的界面看看行不行,如果不行就没有安装,行就安装
缺点:吊起appmusic的界面需要用户同意,不同意就没有办法判断是否安装
吊起界面需要需要一个控制器,比较麻烦,如果启动时想在Appdelegate里面完成时不行的,但是一启动就想拿到是否安装的值就麻烦了
import UIKit
import MediaPlayer
import StoreKitclass CheckAppInstall: UIViewController {func checkAppInstall(vc: UIViewController) {if !isMinimize {return}isMinimize = falselet picker = MPMediaPickerController(mediaTypes: MPMediaType.music)picker.prompt = ""picker.showsCloudItems = truepicker.allowsPickingMultipleItems = truevc.present(picker, animated: false) {currentVC = vcvc.dismiss(animated: false)isInstallAppMusic = true}isInstallAppMusic = false}}
方法二:SKCloudServiceController()
目的是想拿首歌吊起appmusic看看预加载歌曲是否成功,如果不成功就证明删除app,如果成功就有安装。
这个方法有一个缺点,访问appmusic也要用户同意是否允许访问资源,不同意就没有办法。(用在我们公司的就需求更加不行,如果在播放歌曲过程中,最少化app,然后进入前台,预加载歌曲会把当前播放的歌曲停止掉)
import StoreKit
import MediaPlayer
import AVFoundationSKCloudServiceController().requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) inguard err == nil else {print("error in capability check is \(err!)")return}if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && UIApplication.shared.canOpenURL(URL(string: "music://")!) {print("user has Apple Music subscription and has the apple music app installed")MPMusicPlayerController.systemMusicPlayer.setQueue(with: ["1532970889"])//1108845248MPMusicPlayerController.systemMusicPlayer.prepareToPlay { (error) inprint("ok")if error == nil {print("安装")} else {print("未安装")}if error != nil && error!.localizedDescription == "The operation couldn’t be completed. (MPCPlayerRequestErrorDomain error 1.)" {print("11111")}}}if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) || !UIApplication.shared.canOpenURL(URL(string: "music://")!) {print("user does not have subscription or doesn't have apple music installed")}}
方法三:不怎么行
我在MPMusicPlayerController里面用runtime发现这里类有一个私有方法,是用来判断是否跟appmusic连接成功的。
我们可以尝试调用他
这个方法如果连接不成功,会返回com.apple.Music
但是问题在于如果连接成功,调用上面的方法程序会崩溃,目前就是不知道怎么处理这个崩溃的问题。如果能处理这个办法就解决了。主要是这个_establishConnectionIfNeeded不知道里面是怎么实现的。
换成.takeRetainedValue()
换成。takeUnretainedValue()
全部删除一样不行
let selector = NSSelectorFromString("_establishConnectionIfNeeded")
self.mediaPlayer.perform(selector)
let value = self.mediaPlayer.perform(selector)
print("value: \(value)")
方法四:
首先文字上面先介绍一下公司的业务,就是在播放歌曲的时候,先判断appmusic是否被删除,如果检测到删除app:就提示用户下载app,
如果检测到没有删除app:就直接播放歌曲。
判断相关的地方有:
1.播放列表的随机按键
2.播放列表的cell
3.迷你播放器的播放按键
4.播放详情控制器-》前一首按键
5.播放详情控制器-》后一首按键
6.播放详情控制器-》播放模式按键
7.播放详情控制器-》播放随机按键
8.播放详情控制器-》播放按键
解决办法:
播放器进行播放的时候,需要把歌曲的id添加到播放器里面
添加进去之后,我们去播放器再拿一下添加进去的id
如果拿出来的playbackStoreID是nil,证明appmusic被删除了,如果添加进去拿出来的歌曲id就是我们上面添加进去的歌曲id,所以添加成功,appmusic没有被删除。
由于基于我们公司的业务,使用播放器播放歌曲前必须要添加歌曲,所以添加上面的8个按键的时候就已经把歌曲添加到播放器里面,然后再看看playbackStoreID是否为nil就知道了
其实如果开发别的需求,可以用这种办法来判断的。自己封装一个方法,方法里面创建控制器把歌曲id添加进去再判断一下playbackStoreID就可以了。
OC 需求 检测手机是否安装某个App,app是否安装(删除)appmusic相关推荐
- 【Win11尝鲜】Win11安装需求检测、iso镜像文件、直接升级助手
Win11安装需求检测.iso安装.直接升级 1.Win11 安装需求检测: 2.Win11 iso镜像文件安装: 3.Win11 直接升级: 1.Win11 安装需求检测: https://www. ...
- 如何在一个APP内检测手机内安装了另外一个APP并且跳转到另外一个APP内?
开发情景:(uniapp) 前段时间,公司开发了一款拼团类型的购物软件,但是,突然被人举报有病毒,涉嫌欺诈(此APP还未上架),升级会报病毒,不升级交易支付时会有金融风险. 挽救措施: 改包名,移动开 ...
- 如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP?
如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP? IOS由于系统机制问题不支持版本回退 某些更新可能导致闪退 卡顿等未知 ...
- 华为app安装失败与已安装签名_手机APP为什么总是安装失败
整天"机不离手"的我们 每个人手机里都装有好几十个APP 但安装的时候总会出现跳出 手机APP无法安装或安装失败的页面 这究竟是怎么回事呢? 小翼带你瞅瞅 一.手机安全认证 在安装 ...
- Android异种机型系统适配:application定义的app名字和安装到手机后桌面显示app名字不一致
Android异种机型系统适配:application定义的app名字和安装到手机后桌面显示app名字不一致 这种情况在个别国内稀奇古怪定制化的Android机型上会出现.正常情况下,Android的 ...
- 解决小米手机用Android studio安装不了app的问题
这两天我的小米手机用Android studio直接run的情况下安装不了app.在之前没有出现这种情况.于是查找各种解决办法. 1.INSTALL_FAILED_USER_RESTRICTED错误: ...
- UserAgent和获取手机内安装的所有app列表
获取手机内安装的所有app列表 注意: 获取收集所有app的信息,很耗时,需要在子线程中执行 1.新建两个实体类 BaseBean和ListAppBean import android.text.Te ...
- IOS手机安装旧版APP(不要问我为什么安装旧版,有的旧版功能更强大)
1.背景 在网上冲浪的时候,有网友提到ios老版本的漂亮插画软件Sankaku(SKK)拥有更强大的功能,现在的SKK属实属于被阉割的版本,很多有用的功能都被删除了.那么能不能在ios手机上安装老版本 ...
- 瞳距自测软件app 测试准确吗,瞳孔距离检测手机app-瞳孔距离检测最新版手机软件预约 v1.0-友情手机站...
瞳孔距离检测手机app是一款非常专业且优质便捷轻松靠谱的一站式省心好用的手机软件,轻松的在线手机上面测试各种各类的眼睛瞳孔的数据,轻松的在线检测手机的操作更加的优质且轻松的便捷,了解自己的眼睛更加的轻 ...
- 如何保障手机钱包账户安全?iCard App集成系统完整性检测功能,从登录环节防范风险
iCard是保加利亚一款热门的手机钱包App,为30多个欧洲国家和地区提供银行卡管理.收付款.购物支付.国际转账.外币兑换等服务,已拥有超过12年行业经验和庞大的用户群体.因此,如何保障用户账户和资金 ...
最新文章
- oracle 导入数据
- OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换
- extern C 作用
- 使用Hybris Commerce User API读取用户信息时,电话字段没有返回
- 使用maven构建的Spring boot项目在开始搭建的时候出的一些错误
- 开奖|1024中奖名单公布以及Postman资料分享
- java_object的具体使用--上帝
- 【NLPCC 2021】 First Call For Papers
- 如何选择合适的网站程序
- spyder python_spyder python2.7下载
- linux phpstudy卸载,linux 安装phpstudy
- 推荐一个维基百科的中文镜像网站
- ES6模板字符串中使用循环并取值
- 新变局、新机遇,新发展 新华锦受邀参加2020中欧企业家峰会青岛论坛
- 最新仿720云全景制作源码|krpano仿720云全景网站源码
- 数据结构 创建结构体学生表 c语言
- OPNsense用户手册-Netflow导出和分析
- Json及Jsoncpp开源库的应用
- Python大屏看板最全教程之Pyecharts图表
- Linux-重命名命令rename