LSApplicationWorkspace不能在iOS 11上运行吗?

时间:2017-06-28 03:35:12

标签: ios iphone-privateapi ios11

我有一个私人应用需要扫描所有应用程序和方案,并使用私有API LSApplicationWorkspace defaultWorkspace和其他功能方法(例如privateURLSchemes allInstalledApplications)来获取它。这个应用程序运行良好,我可以在iOS 11之前从私有API获得我所需要的一切,但在这个版本中我只得到一些警告和一个空数组。似乎Apple限制了开发人员无法在iOS 11中私下使用的私有API。

所以我的问题是在iOS 11中有哪些替代方法可以满足我的需求?

5 个答案:

答案 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时,我的问题就解决了。

我希望,这个答案对某人有帮助。