uni-app native.js 中的isiOSAppOnMac 属性在 iOS 18 中不存在

发布于 1周前 作者 vueper 来自 Uni-App

uni-app native.js 中的isiOSAppOnMac 属性在 iOS 18 中不存在

开发环境 版本号 项目创建方式
Mac macOS 13.5 HBuilderX
(22G74)

示例代码:

const NSProcessInfo = plus.ios.importClass('NSProcessInfo')  
console.log('NSProcessInfo:', NSProcessInfo)  
const processInfo = NSProcessInfo.processInfo()  
console.log('processInfo:', processInfo)  
const isiOSAppOnMac = processInfo.isiOSAppOnMac()  
console.log('isiOSAppOnMac:', isiOSAppOnMac)

报错如下:

TypeError: processInfo.isiOSAppOnMac is not a function. (In 'processInfo.isiOSAppOnMac()', 'processInfo.isiOSAppOnMac' is undefined)

操作步骤:

const NSProcessInfo = plus.ios.importClass('NSProcessInfo')  
console.log('NSProcessInfo:', NSProcessInfo)  
const processInfo = NSProcessInfo.processInfo()  
console.log('processInfo:', processInfo)  
const isiOSAppOnMac = processInfo.isiOSAppOnMac()  
console.log('isiOSAppOnMac:', isiOSAppOnMac)

预期结果:

期望processInfo.isiOSAppOnMac()返回 true 或 false

实际结果:

抛出异常

bug描述:

native.js 中的isiOSAppOnMac 属性在 iOS 18 中不存在了


3 回复

native.js调用的是系统API,请查找苹果官方网站寻找替代API。


iOS 原生开发中对应的 api 是let isiOSAppOnMac = ProcessInfo.processInfo.isiOSAppOnMac。报告的问题就是下面的代码在 iOS 17 上是能正常执行的,不会抛出异常。但是在 iOS18 上会抛出异常。并且我用 iOS 原生开发写了个demo,在 iOS18 上调用let isiOSAppOnMac = ProcessInfo.processInfo.isiOSAppOnMac 是能正常执行的。
const NSProcessInfo = plus.ios.importClass(‘NSProcessInfo’)
console.log(‘NSProcessInfo:’, NSProcessInfo)
const processInfo = NSProcessInfo.processInfo()
console.log(‘processInfo:’, processInfo)
const isiOSAppOnMac = processInfo.isiOSAppOnMac()
console.log(‘isiOSAppOnMac:’, isiOSAppOnMac)

在uni-app的开发中,native.js 提供了访问原生功能的接口,这对于需要在H5和App端做差异化处理的场景非常有用。你提到的isiOSAppOnMac属性,通常用于判断当前应用是否运行在iOS设备上的Mac催化剂(Catalyst)环境中。然而,根据Apple的更新,某些属性或方法可能随着iOS版本的迭代而发生变化,甚至在最新的iOS版本中被移除。

针对你提到的问题,isiOSAppOnMac属性在iOS 18中不存在,这意味着我们不能直接通过该属性进行判断。但我们可以采用其他方式来实现类似的功能检测,比如通过用户代理字符串(User Agent)或者尝试访问特定于Mac Catalyst的API并捕获异常来进行判断。

下面是一个使用JavaScript尝试检测应用是否运行在Mac Catalyst环境中的示例代码,这段代码不依赖于isiOSAppOnMac属性:

function isRunningOnMacCatalyst() {
    try {
        // 尝试访问一个仅Mac Catalyst可用的API,比如NSTouchBar
        // 注意:这里实际上不会真正创建或使用NSTouchBar,只是检测其存在性
        if (typeof NSTouchBar !== 'undefined') {
            // 如果NSTouchBar存在,很可能是运行在Mac Catalyst环境下
            // 进一步确认是否同时运行在iOS设备上(通过user agent或其他方式)
            const userAgent = navigator.userAgent || navigator.vendor || window.opera;
            return userAgent.includes('iPhone') || userAgent.includes('iPad');
        }
    } catch (e) {
        // 如果捕获到异常,说明NSTouchBar不存在,不是Mac Catalyst环境
    }
    return false;
}

// 使用示例
if (isRunningOnMacCatalyst()) {
    console.log('当前应用运行在Mac Catalyst环境下');
} else {
    console.log('当前应用不运行在Mac Catalyst环境下');
}

需要注意的是,上述代码片段尝试通过检测NSTouchBar的存在性来间接判断是否为Mac Catalyst环境,但这并不是一个官方推荐或保证的方法,因为Apple的内部API可能会在未来的版本中发生变化。此外,由于安全限制,直接在Web环境中访问原生API(如NSTouchBar)通常是不可能的,这段代码更适用于通过uni-app打包为原生应用时的环境。

在实际开发中,建议根据具体的业务需求和目标平台的API文档来选择最合适的方法。同时,关注Apple的官方文档和更新日志,以确保代码的长期兼容性和稳定性。

回到顶部