[ios] 더 이상 사용되지 않는 UIDevice uniqueIdentifier-지금 무엇을해야합니까?

UIDevice uniqueIdentifier 속성은 iOS 5 에서 더 이상 사용되지 않으며 iOS 7 이상 에서는 사용할 수 없다는 사실 밝혀 졌습니다. 다른 방법이나 속성을 사용할 수 없거나 앞으로 나올 것으로 보이지 않습니다.

기존의 많은 앱은 특정 장치를 고유하게 식별하기 위해이 속성에 밀접하게 의존합니다. 앞으로이 문제를 어떻게 처리 할 수 ​​있습니까?

2011-2012문서에서 제안한 내용 은 다음과 같습니다.

특별 고려 사항

uniqueIdentifier 속성을 사용하지 마십시오. 앱에 고유 한 식별자 CFUUIDCreate를 만들려면 함수를 호출하여 를 만들고 클래스를 UUID사용하여 기본 데이터베이스에 쓸 수 NSUserDefaults있습니다.

그러나 사용자가 앱을 제거했다가 다시 설치하는 경우이 값은 동일하지 않습니다.



답변

사용자가 앱을 제거했다가 다시 설치하는 경우에 의해 생성 된 UUID CFUUIDCreate 고유합니다. 매번 새 UI를 얻게됩니다.

그러나 고유 하지 않을 수도 있습니다 . 즉, 사용자가 앱을 제거했다가 다시 설치할 때 동일하게 유지되어야합니다. 가장 안정적인 장치 별 식별자는 MAC 주소 인 것으로 보이므로 약간의 노력이 필요합니다. MAC을 쿼리하여 UUID로 사용할 수 있습니다 .

편집 : 물론 항상 동일한 인터페이스의 MAC을 쿼리해야합니다. 가장 좋은 방법은입니다 en0. 인터페이스에 IP가 없거나 작동 중지 된 경우에도 MAC은 항상 존재합니다.

편집 2 : 다른 사람들이 지적했듯이 iOS 6 이후 선호되는 솔루션은 -[UIDevice identifierForVendor] 입니다. 대부분의 경우 이전 버전의 드롭 인 대체품으로 사용할 수 있습니다 -[UIDevice uniqueIdentifier](그러나 앱을 처음 시작할 때 생성되는 UUID는 Apple이 사용하기를 원하는 것입니다).

편집 3 : 이 주요 요점은 주석 잡음에서 길을 잃지 않습니다. MAC 을 UUID로 사용하지 말고 MAC 을 사용하여 해시를 만드십시오 . 해시가 동일한 방식으로 수행되는 경우 다시 설치 및 앱에서도 해시가 항상 동일한 결과를 생성합니다. 어쨌든 요즘 (2013) iOS <6.0에서 “안정된”장치 식별자가 필요한 경우를 제외하고는 더 이상 필요하지 않습니다.

편집 4 : iOS 7에서 Apple은 MAC을 쿼리 할 때 항상 고정 값을 반환하여 MAC을 ID 체계의 기초 로 구체적으로 방해합니다 . 따라서 실제로 -[UIDevice identifierForVendor]를 사용 하거나 설치마다 UUID를 작성해야합니다.


답변

UDID이미 Apple의 대안을 사용할 수 있습니다 . Kind guy gekitz는 장치 mac-address 및 번들 식별자 UIDeviceUDID기반으로 일종의 카테고리를 생성하는 카테고리를 작성했습니다 .

github에서 코드를 찾을 수 있습니다


답변

@moonlight가 제안한 링크를 기반으로 여러 테스트를 수행했으며 최상의 솔루션 인 것 같습니다. @DarkDust가 말했듯이 메소드 en0는 항상 사용 가능한 것을 확인 합니다. (MAC + CFBundleIdentifier의 MD5 )
와 ( MAC의 MD5)
두 가지 옵션이 있습니다. 이들은 항상 같은 값을 반환합니다.
내가 한 테스트 아래 (실제 장치로) :
uniqueDeviceIdentifier
uniqueGlobalDeviceIdentifier

#import "UIDevice+IdentifierAddition.h"

NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);
NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);

XXXX21f1f19edff198e2a2356bf4XXXX-(WIFI) UDID
XXXX7dc3c577446a2bcbd77935bdXXXX-(WIFI) GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX-(3G) UDID
XXXX7dc3c577446a2bcbd77935bdXXXX-(3G) GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX-(GPRS) UDID
XXXX7dc3c577446a2bcbd77935bdXXXX-(GPRS) GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX-(AirPlane 모드) UDID
XXXX7dc3c577446a2bcbd77935bdXXXX-(AirPlane 모드) GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX-앱 제거 및 설치 후 앱 XXXX7dc3c577446a2bcbd77935bdXXXX (Wi-Fi) 제거 및 재설치 후 (Wi-Fi)

유용하기를 바랍니다.

편집 :
다른 사람들이 지적했듯이 iOS 7 의이 솔루션 uniqueIdentifier은 더 이상 사용할 수 없으므로 MAC 주소를 쿼리하면 항상 02 : 00 : 00 : 00 : 00 : 00을 반환합니다.


답변

이것 좀 봐,

우리는 대신 키 체인을 사용할 수 있습니다 NSUserDefaults저장하려면, 클래스 UUID에 의해 생성 CFUUIDCreate.

이런 식으로 우리는 UUID재설치 로 인한 레크리에이션을 피할 수 UUID있으며 동일한 응용 프로그램에서 사용자 제거 및 다시 설치조차 항상 동일한 것을 얻을 수 있습니다.

UUID 사용자가 기기를 재설정 할 때만 다시 생성됩니다.

SFHFKeychainUtils 로이 방법을 시도했지만 매력처럼 작동합니다.


답변

자신 만의 UUID를 만든 다음 키 체인에 저장하십시오. 따라서 앱이 제거 되어도 지속됩니다. 대부분의 경우 사용자가 장치간에 마이그레이션하더라도 (예 : 전체 백업 및 다른 장치로 복원) 지속됩니다.

실제로는 사용자 가 관심을 갖는 한 고유 한 사용자 식별자가 됩니다. ( 기기 식별자 보다 낫습니다 ).

예:

UUIDas 를 만들기위한 사용자 정의 방법을 정의하고 있습니다.

- (NSString *)createNewUUID
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

그런 다음 KEYCHAIN앱을 처음 시작할 때 저장할 수 있습니다 . 따라서 처음 시작한 후 키 체인에서 간단히 사용할 수 있으므로 다시 생성 할 필요가 없습니다. 키 체인을 사용하여 저장하는 주된 이유는 다음과 같습니다. 키 체인을 설정 UUID하면 사용자가 앱을 완전히 제거한 후 다시 설치하더라도 키 체인이 유지됩니다. . 따라서 이것은 영구적으로 저장하는 방식이므로 키가 완전히 고유합니다.

     #import "SSKeychain.h"
     #import <Security/Security.h>

applictaion 발사에 다음 코드를 포함 :

 // getting the unique key (if present ) from keychain , assuming "your app identifier" as a key
       NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];
      if (retrieveuuid == nil) { // if this is the first time app lunching , create key for device
        NSString *uuid  = [self createNewUUID];
// save newly created key to Keychain
        [SSKeychain setPassword:uuid forService:@"your app identifier" account:@"user"];
// this is the one time process
}

sskeychain에서 SSKeychain.m 및 .h 파일을 다운로드하고 SSKeychain.m 및 .h 파일을 프로젝트 로 드래그하고 “Security.framework”를 프로젝트에 추가하십시오. 나중에 UUID를 사용하려면 다음을 사용하십시오.

NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];


답변

아마도 당신은 사용할 수 있습니다 :

[UIDevice currentDevice].identifierForVendor.UUIDString

다음과 같이 애플의 문서는 identifierForVender을 설명합니다 :

이 속성의 값은 동일한 장치에서 실행되는 동일한 공급 업체에서 온 앱의 경우와 동일합니다. 다른 공급 업체에서 제공하는 동일한 장치의 앱과 공급 업체에 관계없이 다른 장치의 앱에 대해 다른 값이 반환됩니다.


답변

OpenUDID더 이상 사용되지 않는에 대한 드롭 인 대체를 사용 하는 것이 UDID좋습니다.

기본적으로와 일치하려면 UDID다음 기능이 필요합니다.

  1. 독특하거나 충분히 독특함 (낮은 확률의 충돌이 허용 될 수 있음)
  2. 재부팅, 복원, 제거를 통한 지속성
  3. 여러 공급 업체의 앱에서 사용 가능 (CPI 네트워크를 통해 사용자를 확보하는 데 유용)-

OpenUDID 위의 사항을 충족하며 나중에 고려할 수 있도록 기본 제공 옵트 아웃 메커니즘이 있습니다.

해당 GitHub를 가리키는 http://OpenUDID.org를 확인 하십시오 . 도움이 되었기를 바랍니다!

부수적으로, 나는 MAC 주소 대안에서 멀어 질 것입니다. MAC 주소는 유혹적이고 보편적 인 해결책처럼 보이지만이 낮은 매달린 과일은 중독되어 있어야합니다. MAC 주소는 매우 중요하며 “이 응용 프로그램 제출”이라고 말하기 전에 Apple이이 응용 프로그램에 대한 액세스를 상당히 사용하지 않을 수 있습니다. MAC 네트워크 주소는 개인 LAN (WLAN) 또는 기타 가상 개인의 특정 장치를 인증하는 데 사용됩니다. 네트워크 (VPN). .. 그것은 이전 UDID보다 훨씬 더 민감합니다!