钥匙串+临时分发

2024-01-09

首先,一些细节:我们正在开发一个 iOS 应用程序,目前使用 Swift/Xcode 6.1 GM 2 进行开发。

在临时分发应用程序时,我们在钥匙串访问方面遇到了一些令人困惑的问题,并且在追踪原因方面遇到了问题。所有配置文件都与我们应用程序的捆绑包名称匹配。我们使用 TestFlight 进行分发,尽管我认为这不是问题。

我们只能让它在之前没有安装该应用程序的 iOS 7 设备上运行。没有一台 iOS 8 设备可以临时运行。我们一开始遇到的错误是 25300 (errSecItemNotFound),现在重置配置文件后,我们得到一个普通的 0(在加载时保存,但仍然无法检索数据)。从 Xcode 部署开发版本时,一切都运行良好。

我已经分离了我们使用的钥匙串包装器的代码:

import UIKit
import Security

let serviceIdentifier = "com.Test.KeychainTest"

let kSecClassValue = kSecClass as NSString
let kSecAttrAccountValue = kSecAttrAccount as NSString
let kSecValueDataValue = kSecValueData as NSString
let kSecClassGenericPasswordValue = kSecClassGenericPassword as NSString
let kSecAttrServiceValue = kSecAttrService as NSString
let kSecMatchLimitValue = kSecMatchLimit as NSString
let kSecReturnDataValue = kSecReturnData as NSString
let kSecMatchLimitOneValue = kSecMatchLimitOne as NSString

class KeychainManager {

class func setString(value: NSString, forKey: String) {
    self.save(serviceIdentifier, key: forKey, data: value)
}

class func stringForKey(key: String) -> NSString? {
    var token = self.load(serviceIdentifier, key: key)

    return token
}

class func removeItemForKey(key: String) {
    self.save(serviceIdentifier, key: key, data: "")
}



class func save(service: NSString, key: String, data: NSString) {
    var dataFromString: NSData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
    // Instantiate a new default keychain query
    var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, key, dataFromString], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecValueDataValue])

    // Delete any existing items
    SecItemDelete(keychainQuery as CFDictionaryRef)

    if data == "" { return }

    // Add the new keychain item
    var status: OSStatus = SecItemAdd(keychainQuery as CFDictionaryRef, nil)
    var alertView = UIAlertView();
    alertView.addButtonWithTitle("Ok");
    alertView.title = "Status";
    alertView.message = "Saving \(status)";
    alertView.show();
}

class func load(service: NSString, key: String) -> NSString? {
    // Instantiate a new default keychain query
    // Tell the query to return a result
    // Limit our results to one item
    var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, key, kCFBooleanTrue, kSecMatchLimitOneValue], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue])

    var dataTypeRef :Unmanaged<AnyObject>?

    // Search for the keychain items
    let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
    var alertView = UIAlertView();
    alertView.addButtonWithTitle("Ok");
    alertView.title = "Status";
    alertView.message = "Loading \(status)";
    alertView.show();

    let opaque = dataTypeRef?.toOpaque()

    var contentsOfKeychain: NSString?

    if let op = opaque? {
        let retrievedData = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue()

        // Convert the data retrieved from the keychain into a string
        contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding)
    } else {
        return nil
    }

    return contentsOfKeychain
}


}
  1. 有什么我们可能错过的吗?
  2. 解决此问题的最佳方法是什么?我们在日志/iPhone 配置实用程序中没有从钥匙串中收到任何错误。目前,我只是在代码中添加了一些简单的警报,以了解操作的状态。

配置文件和钥匙串代码中的所有内容似乎都很好。问题出在 Swift 编译器中的设置...将“Release”的优化级别从“Fastest”更改为“None”,这似乎可以解决问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

钥匙串+临时分发 的相关文章

随机推荐

  • 如何创建可在多个 React 项目中使用的私有共享组件库

    以下场景 项目1需要使用CustomButton jsx 项目2需要使用CustomButton jsx 目前的解决方案 复制粘贴CustomButton jsx进入项目 1 和 2 所需的解决方案 创建项目 3 其中包括CustomBut
  • iOS 8 共享扩展无法在设备上运行

    我在 xcode 中创建了一个新的目标共享扩展 然后我在我的设备上运行它 我不知道为什么当我在我的设备 iPhone 5c iPhone 5s iPhone 6 上运行共享扩展时 不会显示 请帮助我 任何有关如何解决此问题的建议将不胜感激
  • 将 Keras 预训练模型扩展到具有附加通道或波段的图像

    我只是希望澄清之前一篇文章的一些信息 该文章讨论了如何将 Keras 预训练模型 如 VGG 或 InceptionV3 扩展到不同大小的图像 我的问题是我有一些 8 波段的卫星图像 所以图像可能是650x650x8而不是通常的 RBG 3
  • 如何在XMPP(Openfire)中删除群聊消息?

    我想从 openfire 历史记录中删除单个群聊消息 是否可以 历史记录不保存在 OfMessageArchive 表中 删除应用程序中的消息后 该消息消失 但重新登录后从 Openfire 的 基础 下载 它仍然可见 到目前为止 您还无法
  • QtabBar 文本和图标

    您好 我想在 QtabBar 小部件中选项卡栏的每个选项卡中的图标下方放置图标和文本 默认情况下 文本和图标设置为彼此相邻 我想将一个显示在另一个下方 我们怎样才能做到呢 似乎只有一种方法可以更改图标位置 重新实现 QTabBar 的pai
  • 按下时如何将数据从第二个活动传递到第一个活动? - 安卓

    我有2个活动 活动1 and 活动2 In Activity1 I ve a Button and TextView 当按钮被点击时活动2已开始 In Activity2我有一个EditText 我想显示检索到的数据EditText in
  • 如何使用 aws lambda 将文件写入 s3 (python)?

    我尝试使用 lambda 函数将文件写入 S3 然后测试显示 成功 但我的 S3 存储桶中没有出现任何内容 发生了什么 有人可以给我一些建议或解决方案吗 多谢 这是我的代码 import json import boto3 def lamb
  • 获取轴上 numpy.argmax 元素的索引

    我有 N 维矩阵 其中包含具有 N 个参数的函数的值 每个参数都有离散数量的值 我需要在除一个参数之外的所有参数上最大化该函数 从而产生一个大小等于非最大化参数值的数量的一维向量 我还需要保存其他参数采用的值 为此 我想迭代应用numpy
  • 16 字节实数的 MPI_AllReduce 的奇怪结果

    编译器 gfortran 4 8 5 MPI 库 OpenMPI 1 7 2 预装 OpenSuSE 13 2 这个程序 use mpi implicit none real 16 x integer ierr irank type16 c
  • Java 8 中接口方法的隐式声明是什么?

    我正在读我的旧 SCJP 6 书 作者 Kathy Sierra Bert Bates 提到的 All the interface方法是隐含地 public and abstract默认情况下 interface方法一定不能是static
  • 如果 StringBuilder 或 StringBuffer 可以做 String 所做的事情,为什么还要有 String 类呢? [复制]

    这个问题在这里已经有答案了 我一直想知道为什么JAVA和C 有String 不可变和线程安全 类 如果有StringBuilder 可变且非线程安全 或StringBuffer 可变和线程安全 类 不是StringBuilder Strin
  • 如何查看origin/master 领先于master 的提交消息?

    当 git 通知我我的本地分支落后于 master 时 我如何告诉 git 打印出我落后的日志消息 例如 在下面的情况下 如何查看在 origin master 上我在 master 上没有的 2 个提交的日志消息 git status O
  • 如何在显示 UIMenu 之前修改它以支持动态操作

    iOS 14 添加了点击或长按 UIBarButtonItem 或 UIButton 时显示菜单的功能 如下所示 let menu UIMenu children UIAction title Action image nil action
  • T-SQL 将不同行中最大长度列的行分组(?)

    我正在尝试想出一种方法 根据基于行键的任何行中最长的字符串来组合表中的行 example CREATE TABLE test1 akey int not null text1 varchar 50 NULL text2 varchar 50
  • 使用 openshift rhc tail 命令

    如何跟踪 openshift 日志文件 我发出了以下命令 rhc tail myapp 它似乎显示第一个错误行 然后停止 但不退出 如果我按 ctrl C 它会询问是否停止批处理 如何显示最后几个错误并可以逐页浏览 有向下翻页 向上翻页快捷
  • selenium 将两个 xpath 测试合二为一

    我尝试结合检查两种情况 如果启动检查失败 我们会看到重试按钮 el WebDriverWait self driver 10 until EC element to be clickable By NAME Try again 或者启动检查
  • DELETE_ON_CLOSE 在 Linux 上关闭之前删除文件

    我使用 Java 7 nio API 有以下代码 import java io IOException import java io ObjectOutputStream import java io OutputStream import
  • Google App Engine 批量加载器转换的参考页面在哪里?

    从空数据存储中 我能够自动生成bulkloader yaml文件 它只包含python preamble 但是transformers部分是空的 python preamble import google appengine ext bul
  • 将数字向下舍入

    I have numeric就像这个 a lt 1 542045 我想将它们四舍五入 或四舍五入abs 到小数点后 2 位 signif a 3 会将其向下舍入并给出 1 54 作为结果 但对于本示例 我想要的结果是 1 55 任何想法 我
  • 钥匙串+临时分发

    首先 一些细节 我们正在开发一个 iOS 应用程序 目前使用 Swift Xcode 6 1 GM 2 进行开发 在临时分发应用程序时 我们在钥匙串访问方面遇到了一些令人困惑的问题 并且在追踪原因方面遇到了问题 所有配置文件都与我们应用程序