一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

前言: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相关推荐

  1. 【Win11尝鲜】Win11安装需求检测、iso镜像文件、直接升级助手

    Win11安装需求检测.iso安装.直接升级 1.Win11 安装需求检测: 2.Win11 iso镜像文件安装: 3.Win11 直接升级: 1.Win11 安装需求检测: https://www. ...

  2. 如何在一个APP内检测手机内安装了另外一个APP并且跳转到另外一个APP内?

    开发情景:(uniapp) 前段时间,公司开发了一款拼团类型的购物软件,但是,突然被人举报有病毒,涉嫌欺诈(此APP还未上架),升级会报病毒,不升级交易支付时会有金融风险. 挽救措施: 改包名,移动开 ...

  3. 如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP?

    如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP? IOS由于系统机制问题不支持版本回退 某些更新可能导致闪退 卡顿等未知 ...

  4. 华为app安装失败与已安装签名_手机APP为什么总是安装失败

    整天"机不离手"的我们 每个人手机里都装有好几十个APP 但安装的时候总会出现跳出 手机APP无法安装或安装失败的页面 这究竟是怎么回事呢? 小翼带你瞅瞅 一.手机安全认证 在安装 ...

  5. Android异种机型系统适配:application定义的app名字和安装到手机后桌面显示app名字不一致

    Android异种机型系统适配:application定义的app名字和安装到手机后桌面显示app名字不一致 这种情况在个别国内稀奇古怪定制化的Android机型上会出现.正常情况下,Android的 ...

  6. 解决小米手机用Android studio安装不了app的问题

    这两天我的小米手机用Android studio直接run的情况下安装不了app.在之前没有出现这种情况.于是查找各种解决办法. 1.INSTALL_FAILED_USER_RESTRICTED错误: ...

  7. UserAgent和获取手机内安装的所有app列表

    获取手机内安装的所有app列表 注意: 获取收集所有app的信息,很耗时,需要在子线程中执行 1.新建两个实体类 BaseBean和ListAppBean import android.text.Te ...

  8. IOS手机安装旧版APP(不要问我为什么安装旧版,有的旧版功能更强大)

    1.背景 在网上冲浪的时候,有网友提到ios老版本的漂亮插画软件Sankaku(SKK)拥有更强大的功能,现在的SKK属实属于被阉割的版本,很多有用的功能都被删除了.那么能不能在ios手机上安装老版本 ...

  9. 瞳距自测软件app 测试准确吗,瞳孔距离检测手机app-瞳孔距离检测最新版手机软件预约 v1.0-友情手机站...

    瞳孔距离检测手机app是一款非常专业且优质便捷轻松靠谱的一站式省心好用的手机软件,轻松的在线手机上面测试各种各类的眼睛瞳孔的数据,轻松的在线检测手机的操作更加的优质且轻松的便捷,了解自己的眼睛更加的轻 ...

  10. 如何保障手机钱包账户安全?iCard App集成系统完整性检测功能,从登录环节防范风险

    iCard是保加利亚一款热门的手机钱包App,为30多个欧洲国家和地区提供银行卡管理.收付款.购物支付.国际转账.外币兑换等服务,已拥有超过12年行业经验和庞大的用户群体.因此,如何保障用户账户和资金 ...

最新文章

  1. oracle 导入数据
  2. OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换
  3. extern C 作用
  4. 使用Hybris Commerce User API读取用户信息时,电话字段没有返回
  5. 使用maven构建的Spring boot项目在开始搭建的时候出的一些错误
  6. 开奖|1024中奖名单公布以及Postman资料分享
  7. java_object的具体使用--上帝
  8. 【NLPCC 2021】 First Call For Papers
  9. 如何选择合适的网站程序
  10. spyder python_spyder python2.7下载
  11. linux phpstudy卸载,linux 安装phpstudy
  12. 推荐一个维基百科的中文镜像网站
  13. ES6模板字符串中使用循环并取值
  14. 新变局、新机遇,新发展 新华锦受邀参加2020中欧企业家峰会青岛论坛
  15. 最新仿720云全景制作源码|krpano仿720云全景网站源码
  16. 数据结构 创建结构体学生表 c语言
  17. OPNsense用户手册-Netflow导出和分析
  18. Json及Jsoncpp开源库的应用
  19. Python大屏看板最全教程之Pyecharts图表
  20. Linux-重命名命令rename

热门文章

  1. 域名备案、公安网备案
  2. 51单片机学习:蜂鸣器实验
  3. 2022保研经验帖——吉大、华师、浙大、中大、南航/理、东南、南开等
  4. 【Pycharm】安装及激活、界面调整、导入anaconda的依赖库、字体设置微软雅黑
  5. 1.Linux系统编程入门
  6. ccf试题1:小中大
  7. 肠道微生物组测试说明解读
  8. [小传]任正非:高中三年的理想只是吃个白面馒头 [zz.IS2120]
  9. 经典网络模型 —— 盘点 22篇必读论文与网络模型 + 5种常见数据集
  10. Vue学习之旅----vuex不同组件间数据共享-状态一致