在iOS 11上,LSApplicationWorkspace无法工作吗?

14

我有一个私有应用程序,需要使用私有APILSApplicationWorkspace defaultWorkspace和其他功能性方法(如privateURLSchemes allInstalledApplications)扫描所有应用程序和方案并获取它们。在iOS 11之前,这个应用程序运行良好,我可以从私有API中获取所有我需要的内容,但在这个版本中,我只得到了一些警告和一个空数组。看起来苹果限制开发者在iOS 11中不能在私有环境中使用私有API。

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


1
我也非常关心我们如何继续。我们需要从“allInstalledApplications”中获取信息,以在我们自己的公司范围内的企业应用商店中检查已安装的应用程序。你是否已经向苹果提交了雷达反馈? - AxM
1
没有,但是谢谢你的提醒。 - ovo
1
好的,所以我们需要另一个解决方案。:/ 有什么想法吗? - AxM
1
这里提供了一个可能的解决方案。它是中文的,所以我相信Google翻译 :) 我没有iOS 11设备,所以无法尝试。这可能会有所帮助。 - strano
1
这是一个用于检查应用程序是否已安装的私有API,使用bundle id进行验证。它运行良好,非常棒。 - ovo
显示剩余4条评论
5个回答

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;
}

搜索API...(在大海捞针) - inspector_60

1

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

此外,如果一个应用程序使用了私有API,我会非常惊讶它能否进入App Store,因为这是苹果审核人员扫描的内容之一。


0
在企业中,您可以使用苹果移动设备管理(MDM)协议ManagedApplicationList命令来获取受管理应用程序的状态。

0

来自这篇文章。根据原问题下@ovo的评论,似乎有效。

使用MobileContainerManager.framework可以通过bundle 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
    }

已在iOS 11上进行测试。这段代码不起作用。containerWithIdentifier对所有内容都返回nil。 - mafonya
刚刚测试过了,它可以工作。同时@inspector_60的答案也是这样工作的。 - strano

-1

我也遇到了苹果拒绝的问题。

苹果公司表示:

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

LSApplicationWorkspace

在App Store上不允许使用非公开API,因为这可能会导致用户体验差,如果这些API发生更改。

在将来提交此应用程序时继续使用或隐藏非公开API可能会导致您的Apple开发人员帐户终止,以及从App Store中删除所有相关应用程序。

解决方案

要找出哪个库或代码引起了此问题,请使用以下代码片段。

1-) 在Macbook上打开终端(cmd+空格),然后写入终端

2-) 使用以下代码更改项目目录

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

3-) 搜索适当的单词

grep -r LSApplicationWorkspace .
grep -r allApplications .

在我的情况下,Blesh SDK 包含了 LSApplicationWorkspace 和 allApplications 关键字,这是苹果不允许的。当我更新了 SDK 后,我的问题得到了解决。

我希望这个答案能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接