我有一个私人应用需要扫描所有应用程序和方案,并使用私有API LSApplicationWorkspace defaultWorkspace
和其他功能方法(例如privateURLSchemes
allInstalledApplications
)来获取它。这个应用程序运行良好,我可以在iOS 11之前从私有API获得我所需要的一切,但在这个版本中我只得到一些警告和一个空数组。似乎Apple限制了开发人员无法在iOS 11中私下使用的私有API。
所以我的问题是在iOS 11中有哪些替代方法可以满足我的需求?
答案 0 :(得分:2)
更新:此方法在iOS 12上不起作用 - 需要权利
有一种方法可以查找是否安装了特定的应用程序,它不是返回所有应用程序的列表,例如allInstalledApplications
,但它对查询特定的包ID很有用
以下是一个示例,该方法接收到包ID,如果已在设备上安装,则返回true:
- (BOOL)checkIfAppInstalled: (NSString*)bundleID {
dlopen("/System/Library/PrivateFrameworks/MobileContainerManager.framework/MobileContainerManager",RTLD_NOW);
Class MBAppManager = NSClassFromString(@"MCMAppDataContainer");
NSError * error ;
id contentApp = [MBAppManager performSelector:@selector(containerWithIdentifier:error:) withObject:bundleID withObject:error];
return contentApp != nil;
}
答案 1 :(得分:0)
私有API就是私有API。使用它是完全不受支持的,因此,您不能依赖私有API继续在操作系统的未来版本中工作。
此外,如果使用私有API的应用程序能够进入App Store,我会非常惊讶,因为它是Apple审核人员扫描的内容之一。
答案 2 :(得分:0)
在企业中,您可以使用Apple移动设备管理(MDM)协议ManagedApplicationList命令来获取托管应用程序的状态
答案 3 :(得分:0)
来自this post。从原始问题下@ovo的评论来看,似乎有效。
使用MobileContainerManager.framework
可以使用捆绑包ID检查是否安装了应用。
//If the device is iOS11
if ([[UIDevice currentDevice].systemVersion floatValue] >= 11.0) {
NSBundle *container = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];
if ([container load]) {
Class appContainer = NSClassFromString(@"MCMAppContainer");
id test = [appContainer performSelector:@selector(containerWithIdentifier:error:) withObject:bundleId withObject:nil];
NSLog(@"%@",test);
if (test) {
return YES;
} else {
return NO;
}
}
return NO;
} else {
//Usual way
}
答案 4 :(得分:-1)
我得到了同样的Apple Reject。
Apple说
您的应用使用或引用了以下非公开API:
LSApplicationWorkspace
App Store上不允许使用非公共API,因为 如果这些API发生变化,它可能会导致糟糕的用户体验。
在未来的提交中继续使用或隐藏非公共API 此应用程序可能会导致Apple Developer终止 帐户,以及从App Store删除所有相关应用程序。
<强>解决方案强>
要找出导致此问题的库或代码,请使用以下代码剪切。
1-)在macbook(cmd + space)中打开终端,然后在写入终端
2-)使用以下代码
更改项目目录cd /Users/emreg/Documents/{your project url}
3-)搜索适当的单词
grep -r LSApplicationWorkspace .
grep -r allApplications .
就我而言,Blesh SDK包含了Apple不允许的LSApplicationWorkspace和allApplications关键字。当我提升SDK时,我的问题就解决了。
我希望,这个答案对某人有帮助。