LSApplicationWorkspace不适用于iOS 11吗?

我有一个私人的应用程序需要扫描所有的应用程序和scheme,并通过使用私人API LSApplicationWorkspace defaultWorkspace与其他function的方法,如privateURLSchemes allInstalledApplications得到它。 这个应用程序工作得很好,我可以从iOS 11之前的私有API获取所需的所有内容,但是在此版本中,我只收到一些警告和一个空数组。 看来苹果公司限制了开发人员在iOS 11中不能私人使用的私人API。

所以我的问题是什么替代方法可以实现我的需要在iOS 11?

有一种方法来查找是否安装了特定的应用程序,而不是像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; } 

私有API就是那个私有API。 使用它是完全不受支持的,因此,您不能依赖私有API继续在未来版本的操作系统中工作。

另外,如果一个使用私有API的应用程序能够进入App Store,我会非常惊讶,因为这是苹果公司的审查人员所search的内容之一。

在企业中,您可以使用Apple移动设备pipe理(MDM)协议ManagedApplicationList命令来获取托pipe应用程序的状态

从这个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 } 

我得到了同样的苹果拒绝。

苹果说

您的应用使用或引用以下非公开API:

LSApplicationWorkspace

应用程序商店不允许使用非公共API,因为如果这些API发生更改,可能会导致糟糕的用户体验。

在未来提交的应用程序中继续使用或隐藏非公开API可能会导致您的Apple开发者帐户被终止,并从App Store中删除所有关联的应用程序。

解决scheme

要找出哪个库或代码导致此问题使用以下代码剪切。

1-)在macbook(cmd +空格)打开terminal,然后写terminal

2-)用下面的代码改变项目目录

 cd /Users/emreg/Documents/{your project url} 

3-)search适当的单词

 grep -r LSApplicationWorkspace . grep -r allApplications . 

在我的情况下,Blesh SDK包含了Apple不允许的LSApplicationWorkspace和allApplications关键字。 当我提高了SDK,我的问题解决了。

我希望,这个答案会帮助别人。