如何在NativeScript中使用本机API?

时间:2019-07-17 23:08:14

标签: android ios swift angular nativescript

我正在构建一个需要使用本机API的应用程序,但是事实证明,使用这些API极其困难,因为许多参数在TypeScript中没有明确的类似物,缺少定义等。人们如何实际使用NativeScript进行构建?

作为示例,我正在尝试使用Apple的Secure Enclave在this页面之后生成一个公共-私有密钥对。这些片段是用Swift编写的(我认为),因此打字稿中不存在语法的许多方面。经过数小时的反复试验,我提出了不会引起错误的参数。但是然后我得到的privateKey值是null。

我可以尝试的几十种或一百种不同的参数排列,它们等同于Swift代码的 sort ……这不是人们在NativeScript上的构建方式吗?我到处都看过,我问过NativeScript Slack,我看过帖子...

tns create
(choose Angular and hello-world)
npm install --save-dev tns-platform-declarations

在项目根目录中添加reference.d.ts。将以下内容放入其中:

/// <reference path="./node_modules/tns-platform-declarations/ios.d.ts" />
/// <reference path="./node_modules/tns-platform-declarations/android.d.ts" />

更新tsconfig.json,使paths看起来像这样:

"~/*": ["src/*", "./node_modules/tns-core-modules/*", "./node_modules/*"]

app.component.html修改为只有一个按钮

<Button (tap)="onTap()"></Button>

修改app.component.ts,添加按钮代码:

    onTap() {
        const access = SecAccessControlCreateWithFlags(
            kCFAllocatorDefault,
            kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
           SecAccessControlCreateFlags.kSecAccessControlPrivateKeyUsage,
            new interop.Pointer(0)
        );
        const attributes = {
            kSecAttrKeyType: 'type',
            kSecAttrKeySizeInBits: '256',
            kSecAttrTokenID: kSecAttrTokenIDSecureEnclave,
            kSecPrivateKeyAttrs: {
                kSecAttrIsPermanent: 'true',
                kSecAttrApplicationTag: '<# a tag #>',
                kSecAttrAccessControl: 'access',
            },
        };
        const privateKey = SecKeyCreateRandomKey(attributes as any, new interop.Pointer(0));
        console.info(privateKey);
    }

我确定我对Swift代码的解释(如上所示)存在很多问题。对此的解决方案将是不错的。但是我真正的问题是人们实际上如何使用Angular(纯NativeScript)进行构建?我不能只是猜测打字稿中这些参数应该是什么!

预期结果:

privateKey不为null,这是访问本机API的明智方式吗?

1 个答案:

答案 0 :(得分:2)

是的,根据类型确切地解释要写的内容并不总是那么容易,因此确实需要实践,并且需要通过搜索iOS运行时存储库(在测试,问题甚至是开发环境中)获得一些经验。代码库本身)。即使是我们最好的人也可能会时不时地“发疯”。

在浏览Apple API文档时,最好将语言设置为Obj-C(因为TypeScript类型是从中生成的运行时)。

如果您已经完全熟悉如何调用API(例如,您已经设法使其先在本机应用程序中运行),它也将大有帮助。是的,这对Swift开发人员而言是艰巨的任务。

猜测,您需要清理try{ //the code that wants from the user to enter the radius }catch(Exception e){ JOptionPane.showMessageDialog(null,"Invalid entry, please try again"); } 字典。我参考了“ Generating New Cryptographic Keys”(生成下面的链接)文档,以更好地了解要输入的值。这是一个刺痛点:

attributes

警告:我尚未运行代码。仍然很可能是错误的..!

参考文献:

  

但是我真正的问题是人们实际上如何使用Angular进行构建?我不能只是猜测打字稿中这些参数应该是什么!

Angular不会出现在此;对于所有口味的NativeScript,访问本机API的方式都相同。 NativeScript的各种非核心风格只是为了以不同方式(即声明式)管理UI。

TypeScript类型为编写内容提供了很好的指导,但是确实需要一些额外的经验来弄清楚如何解释它。问题的部分原因是Obj-C不能完美地映射到TypeScript中,但是我想说NativeScript团队对此做了惊人的工作。

如果这一切似乎都无法克服,则可以改为制作本机模块,用Obj-C(或Swift)编写,然后将简单的API绑定公开给本机模块。但是如果您也决定走那条路,那么期望会遇到学习上的弯路!

如果您遇到其他问题,建议您在Slack forums的#ios频道中发布。那里有一些专业人士,他们内外都了解这种黑暗的艺术,他们乐于提供帮助。只是在正确的时间赶上他们的问题。

如果它可以帮助阅读本文的任何人,我将通过NativeScript here提供各种不同的iOS API调用示例片段,尽管我以前从未处理过此安全框架中的API。