我们首先要告诉您,几年来 NativeScript 存在一些误解。
🚨 剧透警告 🚨
它不是一项专门用于在 iOS 和 Android 设备上提供原生视图的技术。这当然也是它的一项功能,但只是该技术设计目标的副作用。
☀️ 我现在看得清清楚楚了 ☀️
NativeScript === 从 JavaScript 直接访问平台 API。
这适用于各种形状和大小的许多有益的开发体验。
https://capacitor.nativescript.org/
毫无疑问,浏览器开发不仅是一种愉快的体验,而且拥有广泛的交付载体,使 Web 开发成为一项影响深远的爱。从丰富的插件生态系统,到开发资源的规模经济,再到浏览器直接支持越来越多的硬件 API。
Ionic 团队以提供出色的 UI 组件框架套件以及在 Capacitor 中支持生态系统而闻名,该生态系统使 Web 开发人员能够轻松访问平台功能。
我们 100% 支持 Capacitor,并致力于帮助加强 Capacitor 社区。
一个带有 notify
方法的 Capacitor 插件,为 Capacitor 生态系统提供 NativeScript 的所有功能。
它提供了一个方便的 native
对象,在需要时可以快速直接访问您的平台。
一个独立且隔离的代码段,您可以在其中编写自己的原生平台 API 代码,并可选地扩展您自己的原生帮助器,以实现您能想到的任何功能。
让我们概述一些使用 Capacitor 社区提案 的示例和实际案例,从一些简单的案例开始,逐步走向更复杂的案例。
屏幕亮度:https://github.com/capacitor-community/proposals/issues/77
使用此插件,解决方案 77:https://capacitor.nativescript.org/solution-77.html
native.setScreenBrightness = (value: number) => {
if (native.isAndroid) {
const context = native.androidCapacitorActivity;
if (android.os.Build.VERSION.SDK_INT < 23) {
const attr = context.getWindow().getAttributes();
attr.screenBrightness = value;
context.getWindow().setAttributes(attr);
} else {
if (!android.provider.Settings.System.canWrite(context)) {
const intent = new android.content.Intent(
android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS
);
intent.setData(
android.net.Uri.parse("package:" + context.getPackageName())
);
intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
if (android.provider.Settings.System.canWrite(context)) {
android.provider.Settings.System.putInt(
context.getContentResolver(),
android.provider.Settings.System.SCREEN_BRIGHTNESS,
value * 100
);
}
}
} else {
UIScreen.mainScreen.brightness = value;
}
};
在您的 Ionic Web 代码库中使用
import { native } from '@nativescript/capacitor';
native.setScreenBrightness(.8);
电源模式:https://github.com/capacitor-community/proposals/issues/79
使用此插件,解决方案 79:https://capacitor.nativescript.org/solution-79.html
import {
androidBroadcastReceiverRegister,
androidBroadcastReceiverUnRegister,
} from "@nativescript/capacitor/bridge";
let isListening = false;
let clientCallback: (isEnabled: boolean) => void;
let observer;
native.togglePowerModeListener = (callback?: (isEnabled: boolean) => void) => {
clientCallback = callback;
if (native.isAndroid) {
const action = "android.os.action.POWER_SAVE_MODE_CHANGED";
if (!isListening) {
isListening = true;
androidBroadcastReceiverRegister(action, (context, intent) => {
const manager: android.os.PowerManager = native.androidCapacitorActivity.getSystemService(
android.content.Context.POWER_SERVICE
);
if (manager && clientCallback) {
clientCallback(manager.isPowerSaveMode());
}
});
} else {
isListening = false;
androidBroadcastReceiverUnRegister(action);
}
} else {
if (!isListening) {
isListening = true;
observer = NSNotificationCenter.defaultCenter.addObserverForNameObjectQueueUsingBlock(
NSProcessInfoPowerStateDidChangeNotification,
null,
null,
(n: NSNotification) => {
if (clientCallback) {
clientCallback(NSProcessInfo.processInfo.lowPowerModeEnabled);
}
}
);
} else {
isListening = false;
NSNotificationCenter.defaultCenter.removeObserver(observer);
}
}
};
在您的 Ionic Web 代码库中使用
import { native } from '@nativescript/capacitor';
native.togglePowerModeListener((isEnabled: boolean) => {
console.log("Power Mode changed:", isEnabled);
});
此示例演示了如何执行原生 UI 混合,例如根据需要使用纯原生模态实现。
native.openNativeModalView = () => {
if (native.isAndroid) {
androidCreateDialog(() => {
const activity = native.androidCapacitorActivity;
const layout = new android.widget.LinearLayout(activity);
layout.setGravity(android.view.Gravity.CENTER);
layout.setOrientation(android.widget.LinearLayout.VERTICAL);
const btn = new android.widget.Button(activity);
btn.setText('Ionic');
layout.addView(btn);
const btn1 = new android.widget.Button(activity);
btn1.setText('Capacitor');
layout.addView(btn1);
return layout;
});
} else {
const vc = UIViewController.alloc().init();
vc.view.backgroundColor = UIColor.blueColor;
const label = UILabel.alloc().initWithFrame(
CGRectMake(0, 30, UIScreen.mainScreen.bounds.size.width, 50),
);
label.text = `Well this is fun.`;
label.textColor = UIColor.orangeColor;
label.textAlignment = NSTextAlignment.Center;
label.font = UIFont.systemFontOfSize(35);
vc.view.addSubview(label);
iosRootViewController().presentModalViewControllerAnimated(vc, true);
}
};
在您的 Ionic Web 代码库中使用
import { native } from '@nativescript/capacitor';
native.openNativeModalView();
管理依赖项是软件可扩展性和维护的乐趣和痛苦之一。
如果它是开源的,您可以派生该插件,进行修改(贡献拉取请求!)并重新集成到您的项目中。这需要时间,因为通常存在多个集成点(例如,您通常必须单独构建它,如果出现问题,这可能会导致其他延迟),然后也需要重新集成到您的项目中。
NativeScript 一直旨在有效地解决这些情况,为您提供另一种缓解产品开发障碍和问题的选择。
最后但并非最不重要的是,在不离开主要 IDE 的情况下,触手可及的平台带来极大的乐趣。
NativeScript 设计了一个元数据生成器。这是其设计的核心部分,这意味着平台所说的任何公共 API 都是可调用的,并且可用于开发的,都映射到 TypeScript 结构中。这意味着您在 Xcode 或 Android Studio 中获得的相同强类型检查,现在可以在您的 TypeScript 代码库中使用。
每当您为平台目标构建项目时,都会运行此元数据生成器。因此,如果平台更新发生(新的 Xcode、新的 iOS、新的 Android 版本等),您将看到相同的构建错误。这一次,您无需打开访问这些功能的插件以解决并重新集成,而可以直接处理,无需进一步延迟。
从字面上讲,NativeScript 是平台目标到 TypeScript 代码库的映射。
对于前 10 位使用此插件为任何 此处列出的 Capacitor 社区提案 创建有帮助的解决方案的开发者,我们将赠送您
2 个漂亮的开瓶器
2 双漂亮的袜子
还有...