小编Gee*_*e.E的帖子

在iOS上使用Touch ID加密数据

我想做什么

基本上我正在尝试做的是找出一种使用Touch ID加密数据的方法.

遗憾的是,我没有找到使用Touch ID创建encryptionKey的方法,因为LAContextAPI只返回aye/nay响应.


为什么我要尝试它

我正在应用程序中实现不同的登录方法.支持的登录方法是密码,PIN码Touch ID.用户可以自由选择他/她想要的任何登录方法.
但是,只有密码才会发送到服务器,服务器将对用户进行身份验证.因此,只有密码存储在钥匙串中.

encryptionKey,用于第一加密和然后存储密码在钥匙串中,使用任何方法,用户选择作为登录方法创建的.
如果用户选择使用PIN码,encryptionKey则从该PIN码导出,当用户选择密码作为登录方法时,可以说同样的.


我的问题是:

如何在此图片中使用Touch ID?

我在互联网上搜索过,但只发现了我已经害怕的东西.
由于iOS只返回一个truefalse来自Secure Enclave,因此无法创建一个encryptionKey.

我知道钥匙串是自己加密的,但出于安全考虑(请不要详细说明)我需要一个存储在钥匙串中的加密密码.


编辑:

背后的原因存储在钥匙串加密数据是因为钥匙串可以通过越狱的装置被破坏.由于我正在开发的应用程序允许用户查看(主要)企业敏感数据,因此我需要考虑越狱.

encryption keychain ios touch-id

14
推荐指数
2
解决办法
2544
查看次数

XCode中与null相关的属性属性有什么作用?

使用XCode 6.3,我注意到了一些属性属性,即:

  • nonnull
  • null_resettable
  • nullable

有人可以解释他们在申请时做了什么吗?

xcode objective-c

10
推荐指数
1
解决办法
2158
查看次数

在<Project name>的实现中,模块'<module name>'的Swift @import; 使用#import

我正在尝试创建一个混合的ObjC-Swift框架.但是我试图为我的Swift文件制作一个私有模块,我失去了很多头发.

我在iOS混合动态框架中遵循了一些步骤- 将私有模块桥接objc头与/sf/answers/2581462621/中的一些步骤相结合

基本上我现在有一个module.modulemap,其中包含以下内容:

module MyCore {    //Adding 'framework' before module is giving me an "Umbrella not found"-error :/
umbrella header "MyCore.h"

export *
module * { export * }

explicit module MyCorePrivate {
    header "MyCore_PrivateUmbrella.h"
    export *
}
Run Code Online (Sandbox Code Playgroud)

}

MyCore_PrivateUmbrella.h进口所有的头我想私下接触到我的SWIFT CODE.其背后的原因只是在模块中包含1个标题然后所有要显示的标题更容易(因为您需要包含标题的特定路径...).

我的构建设置如下:

  • DEFINES_MODULE:是的
  • PRODUCT_MODULE_NAME:MyCore
  • CLANG_ENABLE_MODULES:是的
  • SWIFT_OBJC_INTERFACE_HEADER_NAME:MyCore-Swift.h
  • SWIFT_INCLUDE_PATHS:目录的路径module.modulemap

最后但并非最不重要; ALWAYS_SEARCH_USER_PATHS设置为NO

在我的Swift文件中,我使用导入模块import MyCore.MyCorePrivate.这按预期工作,我可以使用Objective-C中的代码.
构建项目会给我一个这样的错误(黑条只隐藏项目名称和文件路径):

这个错误是什么?

现在点击错误将我带到生成MyCore-Swift.h@import MyCore.MyCorePrivate看似错误的地方.

我不知道为什么这是错的,我也不知道如何解决这个问题.特别是因为它是由XCode生成的文件.

有谁知道这里发生了什么?

xcode module clang swift

6
推荐指数
1
解决办法
1614
查看次数

为什么在使用Quick进行单元测试时多次调用before-andAach块?

我写了一个包含beforeEach和的示例组的测试用例afterEach.我希望每个beforeEachafterEach将每个调用一次it.

唉,单个itbeforeEach,并afterEach得到了多次调用.

我查看了一些文档(即Quick自己的文档和http://jasmine.github.io/2.1/introduction.html),但这些文档并没有帮助我.

这是一个小片段,演示了这一点:

class CheckerTests:QuickSpec {

override func spec() {

    describe("something") {
        beforeEach {
            tLog.info("describe before")
        }
        afterEach {
            tLog.info("describe after")
        }

        context("of something") {
            beforeEach {
                tLog.info("context before")
            }
            afterEach {
                tLog.info("context after")
            }

            it("should behave like something") {
                tLog.info("in the `IT`")
                expect(true).to(beTrue())
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

}


我的控制台记录:

控制台日志之前

以上日志提出了两个问题:

  • 我不知道 beforeEachafterEach现在被称为; 我也不知道为什么我会看到多个日志调用它们.为什么他们多次被召唤?

- 上面的日志显示在示例通过之前 …

unit-testing ios quick-nimble

6
推荐指数
1
解决办法
407
查看次数

从未调用过的自定义 ActionProvider 中的 onPrepareSubMenu

在我问这个问题之前,让我提供一些额外的信息:

我有一个片段,它MenuItemonCreateOptionsMenu. 添加的 MenuItem 还ActionProvider添加了一个自定义项。

自定义ActionProvider不使用 ActionView 而是准备一个SubMenu具有某些可供选择的项目。出于这个原因,我设置ActionProvider如下:

  • nullonCreateActionView方法中返回
  • hasSubMenu() 返回 true
  • onPrepareSubMenu(SubMenu Menu)我首先清除当前菜单,然后添加需要的项目
  • onMenuItemClick在 ActionProvider 中正确处理了
  • 因为我使用的是 ActionBarSherlock,所以我的 ActionProvider 扩展com.actionbarsherlock.view.ActionProvider而不是android.support.v4.view.ActionProvider(不知道它是否应该有任何区别,但此时我不知道是什么)

这一切在 Android 版本高于 3.0 的设备上运行良好。我看到添加的MenuItem,它具有正确的SubMenu(来自边界ActionProvider)并且为每个菜单选项执行正确的操作。但是对于运行低于 3.0 的 Android 版本的设备(我只能在运行 2.3.6 的设备上进行测试),会发生一些奇怪的事情;因此有以下问题。

谷歌明确指出:

"onPerformDefaultAction()

当从操作溢出中选择菜单项时,系统会调用它,并且操作提供者应该为菜单项执行默认操作。但是,如果您的操作提供程序通过 onPrepareSubMenu() 回调提供子菜单,则即使将操作提供程序置于操作溢出中,也会显示子菜单。因此,当有子菜单时,永远不会调用 onPerformDefaultAction()。”

取自:http : //developer.android.com/guide/topics/ui/actionbar.html#CreatingActionProvider

从我的摘录来看,onPerformDefaultAction()永远不应该在我的自定义 ActionProvider 中调用它。然而,在运行 Android 2.3.6 版的设备上, …

android menuitem shareactionprovider

5
推荐指数
0
解决办法
531
查看次数

如何创建一个空的Results &lt;T&gt;对象?

我正在尝试创建一个MutableProperty包含的Results收件者Realm.objects(_:)。要创建属性,我需要给它一个初始值。因此是“空” Results

我尝试使用创建一个:

var someThings = Results<SomeObject>()
MutableProperty(someThings)
Run Code Online (Sandbox Code Playgroud)

但是,编译器给我的错误:Cannot invoke initializer for type 'Results<SomeObject>' with no arguments

虽然我理解该错误,但我不确定如何Results在此上下文中创建对象。从源头来看,Results我也找不到init


所以我的问题是;我如何创建Results自己的用在MutableProperty

编辑:

我已经看到了这个问题 ……但这并没有真正的帮助(除非我要为MutableProperty或其他东西创建一个“包装器”)。

realm ios swift

5
推荐指数
1
解决办法
1757
查看次数

将十六进制转换为 Swift 格式的字符串以保持相同的位数

我试图从数组中的十六进制值创建一个字符串,但是每当数组中的十六进制以零开头时,它也会在结果字符串中消失。

String(value:radix:uppercase)用来创建字符串。


一个例子:

这是一个数组:[0x13245678, 0x12345678, 0x12345678, 0x12345678].
这给了我字符串:12345678123456781234567812345678 (32 个字符)

但是下面的数组:([0x02345678, 0x12345678, 0x02345678, 0x12345678]注意我1用零替换了两个)。
给我字符串:234567812345678234567812345678 (30 个字符)


我不确定为什么它会删除零。我知道这个是正确的;如果它在那里,我如何格式化它以保持零?

string int hex swift

3
推荐指数
1
解决办法
511
查看次数