如何确定一个应用程序是作为移动端还是桌面端的AIR应用程序运行?

3

如何确定当前应用程序的类型?即它是在移动设备上运行还是作为桌面Air应用程序运行?

我尝试过以下方法:

if(FlexGlobals.topLevelApplicatoin as WindowedApplication)
 //desktop

然而,移动版找不到WindowedApplication类。

我该如何区分?

7个回答

8

好的,这个有效:

public static function isAndroid():Boolean
{
    return (Capabilities.version.substr(0,3) == "AND");
}
public static function isIOS():Boolean
{
    return (Capabilities.version.substr(0,3) == "IOS");
}
 ... //is Blackberry

public static function isMobile():Boolean
{
    return (isAndroid() || isIOS()); // || isBlackberry()
}

公共静态函数获取isBlackBerry():布尔值 { 返回(Capabilities.version.substr(0,3) == "QNX"); } - Onur Yıldırım
1
将“作为移动设备”的定义限定于“Android”或“iOS”是非常错误的。无论您将哪些平台添加到列表中,这种方法都是错误的。永远保持可能的移动平台列表的最新状态是一个非常糟糕的想法。 - FrancescoMM

2
您可以使用Capabilities.OS属性,但请注意文档中的警告:

不要使用Capabilities.os或Capabilities.manufacturer来基于操作系统确定能力。基于操作系统的能力是一个坏的想法,因为如果一个应用程序没有考虑到所有可能的目标操作系统,就会导致问题。相反,请使用与您正在测试的能力相对应的属性。


是的,没错。我想这会让测试变得困难。虽然我没有解决方案。模拟器有很多问题。但是,请提交一个增强请求,我会投票支持它。 - JeffryHouser

1

这是我用来确定操作系统及其是否为移动设备的类。当然,这只涵盖了Windows、Linux、Android和iOS。

package com.fw3dlogical.utils {

    import flash.system.Capabilities;

    /**
     * Platform
     * @author Juan Fernando Velez
     */
    public class Platform {

            public static function get isWin():Boolean {
                return (Capabilities.version.indexOf("WIN") != -1);
            }

            public static function get isLinux():Boolean {
                return (Capabilities.version.indexOf("LNX") != -1);
            }

            public static function get isAndroid():Boolean {
                return (Capabilities.version.indexOf("AND") != -1);
            }

            public static function get isiOS():Boolean {
                return (Capabilities.version.indexOf("IOS") != -1);
            }

            public static function isMobile():Boolean {
                return (isAndroid() || isiOS());
            }

        }
    }
}

1

如果您需要知道您正在使用移动设备还是桌面设备,您应该检查 Capabilities.cpuArchitecture:

if(Capabilities.cpuArchitecture=="ARM")
{
  
}

这对英特尔x86 Android手机是否正常工作?像华硕ZenFone一样? - sydd

0
我不确定, 但是我们无法将FlexGlobals.topLevelApplication转换为Mobile Application中的WindowedApplication。
因此,移动应用程序可以是以下类型之一:
1. TabbedViewNavigatorApplication - 用于标签式视图导航应用程序
2. viewnavigatorapplication - 基于视图的导航应用程序
所以根据您的应用程序类型,您应该尝试以上两个选项进行转换...

这是不完整的。我制作了扩展Application的移动应用程序;事实上,我认为这甚至是Flash Builder中的向导选项。 - JeffryHouser

0

这个测试可以在移动应用程序中工作,而不需要测试特定的操作系统名称(如Capabilities.os或Capabilities.version)。它的优点是在桌面上调试移动应用程序时始终能够正常工作,而Capabilities.os可能无法给出您想要的答案:

import flash.utils.getDefinitionByName;
...

var hasWindowedApp:Boolean = false;
try
{
    hasWindowedApp = getDefinitionByName("spark.components.WindowedApplication") != null;
}
catch (error:ReferenceError)
{
}

if (!hasWindowedApp)
{
    try
    {
        hasWindowedApp = getDefinitionByName("mx.core.WindowedApplication") != null;
    }
    catch (error:ReferenceError)
    {
    }
}

-2

C#函数用于检查IOS(iPad,iPhone)

    public bool isIOS()
    {
        HttpContext context = HttpContext.Current;

        if (context.Request.ServerVariables["HTTP_USER_AGENT"] != null)
        {
            foreach (string s in new[] { "iPad", "iphone" })
            {
                if (context.Request.ServerVariables["HTTP_USER_AGENT"].ToLower().Contains(s.ToLower()))
                {
                    return true;
                }
            }
        }

        return false;
    }

使用被接受答案中展示的方法会不会更好呢? - Austin Henley
原始问题涉及AIR/AS3,而非ASP.NET/C#。 - OMA

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