检查Salesforce中是否安装了特定扩展

检查Salesforce中是否安装了特定扩展,salesforce,apex-code,visualforce,Salesforce,Apex Code,Visualforce,我正在开发一个Salesforce应用程序。应用程序包含一些自定义对象,其中一个是Project。我创建了一个Visualforce页面来管理这些项目。我们还正在开发一个扩展。在扩展中,将向项目对象添加一个新的自定义字段。 在最初的包中,我想更改visualforce页面,以显示该字段的值(如果安装了扩展名)。因此,我需要检查扩展是否已插入,如果是,则显示该扩展中的字段 有什么方法可以做到这一点吗?你最好同时问同样的问题。似乎有许多成员构建托管包 我会尝试一些动态顶点(比如)来检查对象和字段是否

我正在开发一个Salesforce应用程序。应用程序包含一些自定义对象,其中一个是Project。我创建了一个Visualforce页面来管理这些项目。我们还正在开发一个扩展。在扩展中,将向项目对象添加一个新的自定义字段。 在最初的包中,我想更改visualforce页面,以显示该字段的值(如果安装了扩展名)。因此,我需要检查扩展是否已插入,如果是,则显示该扩展中的字段


有什么方法可以做到这一点吗?

你最好同时问同样的问题。似乎有许多成员构建托管包

我会尝试一些动态顶点(比如)来检查对象和字段是否存在

例如,如果您已从AppExchange安装Chatter Unfollow应用程序,并希望依赖其“对象:

String objectName = 'chttrunfollow__UnfollowRule__c';
String fieldName = 'chttrunfollow__Active__c';

Map<String, Schema.SObjectType> gd = Schema.getGlobalDescribe();
Schema.SObjectType t = gd.get(objectName);
if(t != null) {
    Schema.DescribeSObjectResult sobjectDescribe = t.getDescribe();
    System.debug(sobjectDescribe.isAccessible());

    Map<String, Schema.SObjectField> fields = sobjectDescribe.fields.getMap();
    if(fields != null && fields.get(fieldName) != null && fields.get(fieldName).getDescribe().isAccessible()) {
        System.debug('Show it!');
    }
} else {
    System.debug(LoggingLevel.ERROR, 'Not found');
}
String objectName='chtrunfollow\uuuu UnfollowRule\uuuu c';
字符串字段名='chtrunfollow__Active__c';
Map gd=Schema.getGlobalDescripte();
Schema.SObjectType t=gd.get(objectName);
如果(t!=null){
Schema.descripesObjectResult SobjectDescripte=t.getDescripte();
System.debug(sobjectdescription.isAccessible());
Map fields=SobjectDescripte.fields.getMap();
if(fields!=null&&fields.get(fieldName)!=null&&fields.get(fieldName.getDescripte().isAccessible()){
System.debug('Show it!');
}
}否则{
System.debug(LoggingLevel.ERROR,“未找到”);
}
这可能是一个非常昂贵的操作,因此您可能希望将结果缓存到某个位置(自定义设置?)


有一个
System.requestVersion()
调用,但我认为它只返回“您的”当前版本(不能使用它询问给定组织中还安装了什么)。如果您使用许可证-
UserInfo.isCurrentUserLicensed('namespace')
可能值得检查?

我最终使用的解决方案是在基类中创建一个默认实现的接口,该实现没有太多功能。然后,我创建了一个自定义设置,其中应该输入实现该接口的另一个类名。同样在基类中,我创建了一个工厂,可用于获取接口的实现。我用它作为基础。

谢谢你的回复。我找到了解决问题的另一个方法,使用反射实现基类中定义的接口。这也是一个很酷的技巧!请给出一个完整的答案并接受它:)我一定有一个愚蠢的时刻。。。您还可以查询
ApexClass
表。。。嗯。