首页 > 其他分享 >【Swift 开发】IDFA存储到钥匙串中保证永久不变,除非系统重装

【Swift 开发】IDFA存储到钥匙串中保证永久不变,除非系统重装

时间:2023-05-22 12:03:12浏览次数:38  
标签:String service NSCopying IDFA 设置 串中 系统重装 keychainQuery


一、 IDFA值会发生改变的情况

在何种情况下 , 应用的IDFA值会发生改变?

在iOS的设置应用中选择“重置所有设置”
*没有影响

在iOS的设置应用中“清除所有的内容和设置”
*advertisingIdentifier 和 identifierForVendor 都会受到影响重新设置变为新值

通过iTunes还原设备
*advertisingIdentifier 和 identifierForVendor 都会受到影响重新设置变为新值

从设备上删除该APP
*如果该APP是某个开发者账号下在该设备上的最后一个APP时,会影响identifierForVendor 的值,否则不会影响该字段的值。

升级应用
*无影响

启用或关闭“限制广告追踪”
*应影响advertisingIdentifier 字段的具体值

系统升级(通过手机自己升级或通过iTunes升级)
*会改变identifierForVendor 字段的值

在iOS的设置应用中“重新设置广告标示符”
*会改变advertisingIdentifier 的值。如果一些应用正在请求该字段,那么在该应用重新启动前该字段的值并不会发生改变。

通过iTunes进行备份
*对这两个字段没有影响

通过iTunes对备份进行还原
*两个字段都会被重置

二、如何保证IDFA不变

将IDFA存到系统的钥匙串里面

//
//  BCSKeyChainTool.swift
//  BlockChainStep
//
//  Created by Hanrovey on 2018/7/9.
//  Copyright © 2018年 com. All rights reserved.
//  系统钥匙串管理工具类

import UIKit

class BCSKeyChainTool: NSObject {

    /// 查询
    static func getKeychainQuery(service: String) -> NSMutableDictionary {
        return NSMutableDictionary.init(objects: [kSecClassGenericPassword, service, service, kSecAttrAccessibleAfterFirstUnlock], forKeys: [kSecClass as! NSCopying, kSecAttrService as! NSCopying, kSecAttrAccount as! NSCopying, kSecAttrAccessible as! NSCopying])
    }

    /// 保存
    static func save(service: String, data: Any) {
        // Get search dictionary
        let keychainQuery = self.getKeychainQuery(service: service)
        // Delete old item before add new item
        SecItemDelete(keychainQuery)
        // Add new object to search dictionary(Attention:the data format)
        keychainQuery.setObject(NSKeyedArchiver.archivedData(withRootObject: data), forKey: kSecValueData as! NSCopying)
        // Add item to keychain with the search dictionary
        SecItemAdd(keychainQuery, nil)
    }

    /// 加载
    static func load(service: String) -> String {
        var ret: String = ""
        let keychainQuery = self.getKeychainQuery(service: service)
        // Configure the search setting
        // Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
        keychainQuery.setObject(kCFBooleanTrue, forKey: kSecReturnData as! NSCopying)
        keychainQuery.setObject(kSecMatchLimitOne, forKey: kSecMatchLimit as! NSCopying)
        var keyData: CFTypeRef?
        if SecItemCopyMatching(keychainQuery, &keyData) == noErr {
            ret = NSKeyedUnarchiver.unarchiveObject(with: keyData as! Data) as! String
        }
        return ret
    }

    /// 删除
    static func deleteKeyData(service: String) {
        let keychainQuery = self.getKeychainQuery(service: service)
        SecItemDelete(keychainQuery)
    }
}


标签:String,service,NSCopying,IDFA,设置,串中,系统重装,keychainQuery
From: https://blog.51cto.com/u_13481937/6322873

相关文章

  • 字符串中的第一个唯一字符
    给定一个字符串 s ,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回-1 。示例1:输入:s="leetcode"输出:0示例2:输入:s="loveleetcode"输出:2示例3:输入:s="aabb"输出:-1来源:力扣(LeetCode)链接:https://leetcode.cn/problems/first-unique-char......
  • 代码随想录算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项
    【参考链接】20.有效的括号【注意】1.括号匹配是使用栈解决的经典问题。2.这个命令最后进入a目录,系统是如何知道进入了a目录呢,这就是栈的应用(其实可以出一道相应的面试题了)。3.有三种不匹配的情况,第一种情况,字符串里左方向的括号多余了;第二种情况,括号没有多余,但是括号的......
  • 代码随想录算法训练营第九天|28. 找出字符串中第一个匹配项的下标、459. 重复的子字符
    【参考链接】28.找出字符串中第一个匹配项的下标【注意】1.kmp解决的就是字符串匹配的问题。2.kmp如何知道匹配过哪些字符串,并跳到匹配过的内容后面的字符。---前缀表3.找到一个子字符串里它的最长相等前后缀。4.前缀是包含首字母,不包含尾字母的所有子串;后缀只包含尾字母,不......
  • LeetCode 1047. 删除字符串中的所有相邻重复项
    题目链接:LeetCode1047.删除字符串中的所有相邻重复项题意:给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重复项删除操作,直到无法继续删除。解题思路:开一个栈,然后扫描整个字符串。如果当前字符和栈顶元素不相等,则当前......
  • LeetCode 151. 反转字符串中的单词
    题目链接:LeetCode151.反转字符串中的单词题意:给你一个字符串s,请你反转字符串中单词的顺序。解题思路:如果我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。所以解题思路如下:移除多余空格将整个字......
  • java获取json字符串中json对象
    StringruleDetail=paperRule.getRuleDetail();if(ruleDetail!=null){JSONObjectjsonObject=JSONObject.fromObject(ruleDetail);//转json对象ObjectpaperRules=jsonObject.get("paper......
  • AcWing 771. 字符串中最长的连续出现的字符
    AcWing771.字符串中最长的连续出现的字符1.地址https://www.acwing.com/problem/content/description/773/2.题解#include<iostream>#include<cstdio>#include<string>usingnamespacestd;intmain(){intn;intsum;intmax;int......
  • 力扣---2390. 从字符串中移除星号
    给你一个包含若干星号*的字符串s。在一步操作中,你可以:选中s中的一个星号。移除星号左侧最近的那个非星号字符,并移除该星号自身。返回移除所有星号之后的字符串。注意:生成的输入保证总是可以执行题面中描述的操作。可以证明结果字符串是唯一的。 示例1:输入:s=......
  • 查找指定字符串在某个字符串中的出现次数
    c语言代码实现:此处)折叠或打开1.#include<stdio.h>2.<string.h>3.intsearchnum(char*str,char*pattern)4.{5.if(str==NULL)6.;7.*pos=NULL;8.intcount=0;9.while((pos=strstr(str,pattern))!=NULL)10.{11.++;1......
  • 字符串插值替换器,替换字符串中的插值表达式(简单实现,仅用于短文本)
    packagecom.geostar.geoonline.tools.config_write.util;importlombok.Builder;importlombok.Getter;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.regex.Pattern;/***字符串插值替换器,......