programing

iOS KeyChain이 백그라운드에서 값을 검색하지 않음

css3 2023. 10. 2. 15:21

iOS KeyChain이 백그라운드에서 값을 검색하지 않음

저는 현재 iOS KeyChain에 사용자명(이메일)과 이메일과 비밀번호의 솔티드 해시를 저장하고 있습니다.여기 있는 ARC'ifed 버전을 사용하고 있습니다.

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];

앱이 활성화되어 있는 동안 네트워크 호출에 대한 토큰을 꺼내야 할 때 이 모든 것이 잘 작동합니다.이는 모든 네트워크 호출뿐만 아니라 클린 스타트업에서 로그인할 때도 작동합니다.문제는 앱이 백그라운드에 있을 때 시작됩니다.

이는 산발적으로 발생할 뿐이며 아직 특정 iOS 버전이나 기기에 고정하지는 못했습니다.

사용자가 위치(지역 모니터링)를 트립하고 서버 상태를 업데이트하고 싶습니다.저는 다른 네트워크 호출 때마다 하는 것과 동일하게 토큰을 키체인에서 꺼내 상태를 업데이트하려고 합니다.그러나 일부 사용자의 경우 값이 0입니다.그것이 없으면 네트워크를 업데이트할 수 없습니다.왜 이것이 적은 비율이 아니라 대부분의 사람들에게 효과가 있을까요?

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];

키체인 래퍼의 비ARC 버전으로 돌아갔지만 여전히 동일한 결과가 나타납니다.이에 대한 피드백을 주시면 감사하겠습니다.제 사용자 중 극히 일부일 뿐이지만, 제가 걱정하지 않고 바로잡고 싶은 문제입니다.

또한 모든 백그라운드 작업은 시간 초과를 방지하기 위해 백그라운드 작업으로 설정됩니다.저는 열쇠고리를 둘러싼 일에 아무런 문제가 없지만, 토큰이 채워질 때까지 일을 진전시키지 않습니다.

편집 나는 키체인이 백그라운드에서 값을 검색하지 않는 문제를 파악했습니다.이 질문이 나중에 다른 사람들에게 가치가 있을 것 같아 아래에 답을 올리고 받아들이겠습니다.

내 질문은 그 이유에 대해 거의 정확하게 맞았지만, 확실하지는 않았습니다.블로그, 튜토리얼을 거쳐 블로그, 튜토리얼을 통해 읽은 결과, 무슨 일이 일어나고 있는지 힌트를 주는 것을 발견했습니다.

홈 스크린이 잠겨 있습니다.키체인 튜토리얼은 항상 키체인에 대한 접근성 설정을 비워두므로 기본적으로 애플의 가장 낮은/안전한 접근 수준으로 설정됩니다.그러나 이 수준은 사용자가 잠금 화면에 암호를 가지고 있는 경우 키체인 액세스를 허용하지 않습니다.빙고!이것은 산발적인 행동과 왜 이런 일이 소수의 사용자에게만 발생하는지를 설명해 줍니다.

코드 한 줄이면 모든 혼란을 해결할 수 있습니다.

[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];

사용자 이름과 비밀번호 값을 설정하는 곳에 이 줄을 추가합니다.매력적으로 작용합니다.이것이 누군가에게 도움이 되길 바랍니다.그것은 제가 조각들을 조립할 수 있을 때까지 꽤 오랫동안 저를 혼란스럽게 했습니다.

사용하다kSecAttrAccessibleAfterFirstUnlock대신에kSecAttrAccessibleAlways.


Apple의 설명서에서:

kSecAttrAccessibleAfterFirstUnlock
다시 시작한 후 사용자가 장치의 잠금을 한 번 해제할 때까지 키체인 항목의 데이터에 액세스할 수 없습니다.

첫 번째 잠금 해제 후 다음 다시 시작할 때까지 데이터에 액세스할 수 있습니다.백그라운드 응용 프로그램에서 액세스해야 하는 항목에 권장됩니다.이 속성을 가진 항목은 암호화된 백업을 사용할 때 새 장치로 마이그레이션됩니다.

나같은 경우는, 봐봐요.OS2는 iOS 쪽에서 키체인 데이터에 접근합니다.

처음에 kSecAttrAccessable잠금 해제 시이 DeviceOnly가 사용됩니다.나는 아이폰이 잠기든 안 잠기든 데이터를 읽을 수 있습니다.Watch가 키체인에 액세스하려고 할 때 Error가 표시되는 것이 매우 혼란스럽습니다: SecTrustEvaluate [leaf IssuerCommonName]

그리고 어떤 경우는 다음과 같이 됩니다: : SecOSSStatusWitherror:[-25308] Error Domain=NSOSSStatusErrorDomain Code=-25308 "ks_crypt:e00002e2에서 아이템 'oe' 실패(클래스 6, 가방: 0) 키체인이 잠긴 상태에서 시도된 아이템에 대한 접근이 가능합니다.UserInfo={NSDescription=ks_crypt:e00002e2에서 항목 'oe'에 실패했습니다(클래스 6, 가방: 0) 키체인이 잠겨 있는 동안 항목에 액세스하려고 시도했습니다.}

더 많은 정보가 나오면 답변을 업데이트하겠습니다.

이는 개발자의 관점에서 모호한 수준의 Apple 데이터 보호 정책으로 인해 발생할 수 있습니다.해결 방법은 앱이 시작되면 키체인에 액세스할 수 있는지 여부를 확인하고, 액세스할 수 없다면 앱 유형에 따라 (적절한 팝업으로) 앱을 죽일 수 있습니다.

+(BOOL) isKeychainAccessible
{
    NSString *keychainTestKey = @"keychainTestKey";
    NSString *keychainTestValue = @"keychainTestValue";
    [self createKeychainValue:keychainTestValue forIdentifier:keychainTestKey];
    NSString *loadedValue = [self keychainStringFromMatchingIdentifier:keychainTestKey];
    [self deleteItemFromKeychainWithIdentifier:keychainTestKey];
    return ([keychainTestValue isEqualToString: loadedValue]);
}

언급URL : https://stackoverflow.com/questions/10536859/ios-keychain-not-retrieving-values-from-background