Como obter um ID de dispositivo exclusivo no Swift?

181

Como posso obter um ID exclusivo de dispositivo no Swift?

Preciso de um ID para usar no banco de dados e como a chave da API do meu serviço da Web no meu aplicativo social. Algo para acompanhar o uso diário desses dispositivos e limitar suas consultas ao banco de dados.

Obrigado!

Do utilizador
fonte

Respostas:

386

Você pode usar isso (Swift 3):

UIDevice.current.identifierForVendor!.uuidString

Para versões mais antigas:

UIDevice.currentDevice().identifierForVendor

ou se você quiser uma string:

UIDevice.currentDevice().identifierForVendor!.UUIDString


Não há mais uma maneira de identificar exclusivamente um dispositivo depois que o usuário desinstalou o (s) aplicativo (s). A documentação diz:

O valor nessa propriedade permanece o mesmo enquanto o aplicativo (ou outro aplicativo do mesmo fornecedor) está instalado no dispositivo iOS. O valor muda quando o usuário exclui todos os aplicativos desse fornecedor do dispositivo e, posteriormente, reinstala um ou mais deles.


Você também pode ler este artigo de Mattt Thompson para obter mais detalhes:
http://nshipster.com/uuid-udid-unique-identifier/

Atualização para o Swift 4.1 , você precisará usar:

UIDevice.current.identifierForVendor?.uuidString
Atomix
fonte
talvez adicione .UUIDString para que possa realmente ser enviado para um servidor?
Daniel Galasko
2
Sim. Achei que era a coisa mais óbvia a se fazer, mas incluí-a na resposta.
Atomix
19
Após a desinstalação do aplicativo, esse número não é mais o mesmo. Existe uma maneira de rastrear um dispositivo mesmo após a desinstalação do aplicativo?
precisa saber é o seguinte
5
A melhor pergunta é: se for removido após a desinstalação, como você exclui a conta no servidor quando o ID não está mais em uso?
Jason G
2
@UmairAfzal Muitas coisas não funcionam no simulador. Você tentou no dispositivo real?
precisa
10

Você pode usar a propriedade pública identifierForVendor presente na classe UIDevice

let UUIDValue = UIDevice.currentDevice().identifierForVendor!.UUIDString
        print("UUID: \(UUIDValue)")

EDIT Swift 3:

UIDevice.current.identifierForVendor!.uuidString

EDIT FIM

Captura de tela para hierarquia de propriedades

Jayprakash Dubey
fonte
3
Esta é apenas uma cópia da resposta da Atomix #
Ashley Mills
10

Para o Swift 3.X , o código de trabalho mais recente, uso fácil;

   let deviceID = UIDevice.current.identifierForVendor!.uuidString
   print(deviceID)
SwiftDeveloper
fonte
3
Isso muda sempre que você usa a desinstalação e instala o aplicativo novamente.
iPeter 15/06/18
7
Esta é apenas uma cópia das respostas de @Atomix e JayprakasDubey #
Ashley Mills
10

Você pode usar a documentação da Apple devicecheck (no Swift 4)

func sendEphemeralToken() {
        //check if DCDevice is available (iOS 11)

        //get the **ephemeral** token
        DCDevice.current.generateToken {
        (data, error) in
        guard let data = data else {
            return
        }

        //send **ephemeral** token to server to 
        let token = data.base64EncodedString()
        //Alamofire.request("https://myServer/deviceToken" ...
    }
}

Uso típico:

Normalmente, você usa as APIs do DeviceCheck para garantir que um novo usuário ainda não tenha resgatado uma oferta com um nome de usuário diferente no mesmo dispositivo.

Necessidades de ação do servidor:

Ver WWDC 2017 - Sessão 702

mais do artigo de Santosh Botre - Identificador exclusivo para dispositivos iOS

Seu servidor associado combina esse token com uma chave de autenticação que você recebe da Apple e usa o resultado para solicitar acesso aos bits por dispositivo.

iluvatar_GR
fonte
1
Se eu entendi direito, a geração de token é realizada usando DCDevice.generateToken (), e toda chamada gera um dispositivo_token aleatório exclusivo. Portanto, o device_token não é persistente, mas efêmero. O que não entendo é como o servidor pode associar um token efêmero a um dispositivo.
user1118764
@ user1118764 "Definir dois bits - o servidor de aplicativos será responsável por compartilhar esse token e definir o valor do bit." leia mais aqui medium.com/@santoshbotre01/… e também aqui da documentação oficial developer.apple.com/documentation/devicecheck/… e 702 sessão developer.apple.com/videos/play/wwdc2017/702
iluvatar_GR
1

Swift 2.2

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey("ApplicationIdentifier") == nil {
        let UUID = NSUUID().UUIDString
        userDefaults.setObject(UUID, forKey: "ApplicationIdentifier")
        userDefaults.synchronize()
    }
    return true
}

//Retrieve
print(NSUserDefaults.standardUserDefaults().valueForKey("ApplicationIdentifier")!)
n.by.n
fonte
2
É inútil se o usuário excluir o aplicativo porque os padrões do usuário também serão excluídos com a desinstalação do aplicativo.
Rehan Ali
0
if (UIDevice.current.identifierForVendor?.uuidString) != nil
        {
            self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
        }
Davender Verma
fonte
1
Comente seu código e / ou detalhes da oferta e uma explicação de como isso resolve a pergunta postada.
RyanNerd
-1
class func uuid(completionHandler: @escaping (String) -> ()) {
    if let uuid = UIDevice.current.identifierForVendor?.uuidString {
        completionHandler(uuid)
    }
    else {
        // If the value is nil, wait and get the value again later. This happens, for example, after the device has been restarted but before the user has unlocked the device.
        // https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor?language=objc
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            uuid(completionHandler: completionHandler)
        }
    }
}
Joey
fonte
-1

O valor de identifierForVendor muda quando o usuário exclui todos os aplicativos desse fornecedor do dispositivo. Se você deseja manter o ID exclusivo mesmo para as instalações novas subsequentes, pode tentar usar a seguinte função

func vendorIdentifierForDevice()->String {
    //Get common part of Applicatoin Bundle ID, Note : getCommonPartOfApplicationBundleID is to be defined.
    let commonAppBundleID = getCommonPartOfApplicationBundleID()
    //Read from KeyChain using bunndle ID, Note : readFromKeyChain is to be defined.
    if let vendorID = readFromKeyChain(commonAppBundleID) {
        return vendorID
    } else {
        var vendorID = NSUUID().uuidString
        //Save to KeyChain using bunndle ID, Note : saveToKeyChain is to be defined.
        saveToKeyChain(commonAppBundleID, vendorID)
        return vendorID
    }
}
Shihab
fonte
Quem já votou negativamente nesta resposta, pode explicar por que essa votação foi negada? getCommonPartOfApplicationBundleID (), readFromKeyChain, saveToKeyChain são os métodos personalizados que você precisa implementar, não incluí essas definições pensando em não aumentar o tamanho da resposta.
Shihab 25/02
Os valores armazenados no chaveiro persistem quando o aplicativo é desinstalado?
Anees
1
@Anees, você está correto, minha resposta não é válida no iOS 10.3 Beta 2, ele exclui automaticamente os itens de chaveiro após a desinstalação do aplicativo, se não houver aplicativos compartilhados. Portanto, finalmente, será o mesmo comportamento do método identifierForVendor.
Shihab
-18

Eu tentei com

let UUID = UIDevice.currentDevice().identifierForVendor?.UUIDString

em vez de

let UUID = NSUUID().UUIDString

e funciona.

Matt
fonte
30
NSUUID () .UUIDString sempre fornecerá uma nova string sempre #
Eric Eric