Acabou de constatar que a propriedade UIDevice uniqueIdentifier está obsoleta no iOS 5 e indisponível no iOS 7 e superior. Nenhum método ou propriedade alternativa parece estar disponível ou disponível.
Muitos de nossos aplicativos existentes dependem fortemente dessa propriedade para identificar exclusivamente um dispositivo específico. Como podemos lidar com esse problema daqui para frente?
A sugestão da documentação em 2011-2012 foi:
Considerações Especiais
Não use a propriedade uniqueIdentifier. Para criar um identificador exclusivo específico para seu aplicativo, você pode chamar a
CFUUIDCreate
função para criar umUUID
e gravá-lo no banco de dados de padrões usando aNSUserDefaults
classe
No entanto, esse valor não será o mesmo se um usuário desinstalar e reinstalar o aplicativo.
fonte
Respostas:
Um UUID criado por
CFUUIDCreate
é único se um usuário desinstalar e reinstalar o aplicativo: você receberá um novo a cada vez.Mas você pode querer que ele não seja exclusivo, ou seja, deve permanecer o mesmo quando o usuário desinstalar e reinstalar o aplicativo. Isso requer um pouco de esforço, pois o identificador por dispositivo mais confiável parece ser o endereço MAC. Você pode consultar o MAC e usá-lo como UUID.Editar: é preciso sempre consultar o MAC da mesma interface, é claro. Eu acho que a melhor aposta é comen0
. O MAC está sempre presente, mesmo que a interface não tenha IP / esteja inoperante.Edit 2: Como foi apontado por outros, a solução preferida desde o iOS 6 é - [UIDevice identifierForVendor] . Na maioria dos casos, você deve usá-lo como um substituto para o antigo
-[UIDevice uniqueIdentifier]
(mas um UUID criado quando o aplicativo é iniciado pela primeira vez é o que a Apple quer que você use).Edit 3: Portanto, este ponto importante não se perde no ruído do comentário: não use o MAC como UUID, crie um hash usando o MAC . Esse hash sempre criará o mesmo resultado sempre, mesmo em reinstalações e aplicativos (se o hash for feito da mesma maneira). De qualquer forma, atualmente (2013) isso não é mais necessário, exceto se você precisar de um identificador de dispositivo "estável" no iOS <6.0.Edição 4: no iOS 7, a Apple agora sempre retorna um valor fixo ao consultar o MAC para impedir especificamente o MAC como base para um esquema de ID . Então agora você realmente deve usar - [UIDevice identifierForVendor] ou criar um UUID por instalação.
fonte
Você já pode usar sua alternativa para a Apple
UDID
. O tipo gekitz escreveu uma categoria naUIDevice
qual irá gerar algum tipo deUDID
baseado no endereço mac do dispositivo e no identificador de pacote.Você pode encontrar código no github
fonte
02:00:00:00:00:00
quando você solicita o endereço MAC em qualquer dispositivo. Verifique aqui: developer.apple.com/library/prerelease/ios/releasenotes/General/…Com base no link proposto pelo @moonlight, fiz vários testes e parece ser a melhor solução. Como o @DarkDust diz, o método verifica se
en0
está sempre disponível.Existem 2 opções:
uniqueDeviceIdentifier
(MD5 do MAC + CFBundleIdentifier)e
uniqueGlobalDeviceIdentifier
(MD5 do MAC), sempre retornam os mesmos valores.Abaixo dos testes que fiz (com o dispositivo real):
Espero que seja útil.
EDIT:
Como outros salientaram, esta solução no iOS 7 não é mais útil, pois
uniqueIdentifier
não está mais disponível e a consulta de endereços MAC agora sempre retorna 02: 00: 00: 00: 00: 00fonte
Veja isso,
podemos usar Keychain em vez de
NSUserDefaults
classe, para armazenarUUID
criado porCFUUIDCreate
.dessa maneira, poderíamos evitar a
UUID
recreação com a reinstalação e obter sempre o mesmoUUID
para o mesmo aplicativo, mesmo o usuário desinstala e reinstala novamente.UUID
será recriado apenas quando o dispositivo for redefinido pelo usuário.Eu tentei esse método com SFHFKeychainUtils e funciona como um encanto.
fonte
kSecAttrAccessibleAlwaysThisDeviceOnly
. Isso garantirá que o seu UUID não seja migrado para nenhum outro dispositivo. Para acessar seu UUID a partir de outros aplicativos, utilize akSecAttrAccessGroup
teclaCrie seu próprio UUID e armazene-o no chaveiro. Portanto, ele persiste mesmo quando seu aplicativo é desinstalado. Em muitos casos, ele também persiste mesmo que o usuário migre entre dispositivos (por exemplo, backup completo e restauração para outro dispositivo).
Efetivamente, ele se torna um identificador de usuário exclusivo para você. (ainda melhor que o identificador de dispositivo ).
Exemplo:
Estou definindo um método personalizado para criar um
UUID
as:Você pode armazená-lo logo no
KEYCHAIN
primeiro lançamento do seu aplicativo. Para que, após o primeiro lançamento, possamos simplesmente usá-lo no chaveiro, sem necessidade de regenerá-lo. O principal motivo para usar o Keychain para armazenar é: Quando você define oUUID
Keychain, ele persiste mesmo que o usuário desinstale completamente o aplicativo e o instale novamente. . Portanto, essa é a maneira permanente de armazená-la, o que significa que a chave será única o tempo todo.No lançamento do aplicativo, inclua o seguinte código:
Faça o download do arquivo SSKeychain.m e .h do sskeychain e arraste o arquivo SSKeychain.m e .h para o seu projeto e adicione "Security.framework" ao seu projeto. Para usar o UUID depois, basta usar:
fonte
Talvez você possa usar:
A documentação da Apple descreve identifierFor coleta da seguinte maneira:
O valor dessa propriedade é o mesmo para aplicativos provenientes do mesmo fornecedor em execução no mesmo dispositivo. Um valor diferente é retornado para aplicativos no mesmo dispositivo provenientes de diferentes fornecedores e para aplicativos em dispositivos diferentes, independentemente do fornecedor.
fonte
Você pode considerar o uso de
OpenUDID
um substituto para os obsoletosUDID
.Basicamente, para corresponder a
UDID
, os seguintes recursos são necessários:OpenUDID
cumpre o disposto acima e ainda possui um mecanismo de desativação interno para consideração posterior.Verifique http://OpenUDID.org e aponte para o GitHub correspondente. Espero que isto ajude!
Como uma observação lateral, eu evitaria qualquer alternativa de endereço MAC. Embora o endereço MAC pareça uma solução tentadora e universal, certifique-se de que esta fruta baixa seja envenenada. O endereço MAC é muito sensível, e a Apple pode muito bem descontinuar o acesso a esse antes mesmo que você possa dizer "ENVIAR ESTE APP" ... o endereço de rede MAC é usado para autenticar determinados dispositivos em redes privadas (WLANs) ou outras redes virtuais privadas. redes (VPNs). .. é ainda mais sensível que o antigo UDID!
fonte
Tenho certeza que a Apple incomodou muitas pessoas com essa mudança. Desenvolvo um aplicativo de contabilidade para iOS e tenho um serviço online para sincronizar alterações feitas em diferentes dispositivos. O serviço mantém um banco de dados de todos os dispositivos e as alterações que precisam ser propagadas para eles. Portanto, é importante saber quais dispositivos são quais. Estou acompanhando os dispositivos usando o UIDevice uniqueIdentifier e, para o que vale, aqui estão os meus pensamentos.
Gerar um UUID e armazenar os padrões do usuário? Não é bom porque isso não persiste quando o usuário exclui o aplicativo. Se eles instalarem novamente mais tarde, o serviço online não deve criar um novo registro de dispositivo, isso desperdiçaria recursos no servidor e forneceria uma lista de dispositivos contendo o mesmo duas ou mais vezes. Os usuários verão mais de um "iPhone de Bob" listado se reinstalarem o aplicativo.
Gerar um UUID e armazenar no chaveiro? Esse era meu plano, pois persiste mesmo quando o aplicativo é desinstalado. Mas, ao restaurar um backup do iTunes para um novo dispositivo iOS, as chaves serão transferidas se o backup for criptografado. Isso pode levar a dois dispositivos que contêm a mesma identificação de dispositivo, se os dispositivos antigos e novos estiverem em serviço. Eles devem ser listados como dois dispositivos no serviço online, mesmo que o nome do dispositivo seja o mesmo.
Gerar um hash com o endereço MAC e o ID do pacote? Parece a melhor solução para o que eu preciso. Ao fazer o hash com o ID do pacote, o ID do dispositivo gerado não permitirá que o dispositivo seja rastreado nos aplicativos e recebo um ID exclusivo para a combinação de aplicativo + dispositivo.
É interessante notar que a documentação da Apple se refere à validação de recibos da Mac App Store, calculando um hash do endereço MAC do sistema, além do ID e versão do pacote. Portanto, isso parece permitido pela política, seja passando pela revisão do aplicativo que ainda não conheço.
fonte
kSecAttrAccessibleAlwaysThisDeviceOnly
. Isso garantirá que seu UUID não seja restaurado para outros dispositivos, mesmo se o backup estiver criptografado.Parece que no iOS 6, a Apple está recomendando o uso da classe NSUUID .
Na mensagem agora nos documentos do UIDevice para a
uniqueIdentifier
propriedade:fonte
Pode ajudar: use o código abaixo, ele sempre será exclusivo, exceto que você apaga (formata) o seu dispositivo.
fonte
Eu também sugeriria a mudança
uniqueIdentifier
para essa biblioteca de código aberto (duas categorias simples) que utilizam o endereço MAC do dispositivo junto com o App Bundle Identifier para gerar um ID exclusivo em seus aplicativos que pode ser usado como um substituto de UDID.Lembre-se de que, diferentemente do UDID, esse número será diferente para cada aplicativo.
Você só precisa importar os incluídos
NSString
eUIDevice
categorias e chamada[[UIDevice currentDevice] uniqueDeviceIdentifier]
assim:Você pode encontrá-lo no Github aqui:
UIDevice com UniqueIdentifier para iOS 5
Aqui estão as categorias (apenas os arquivos .m - verifique os cabeçalhos no projeto github):
fonte
Você pode obter com este código: UIDevice-with-UniqueIdentifier-for-iOS-5
fonte
O endereço MAC pode ser falsificado, o que torna essa abordagem inútil para vincular conteúdo a usuários específicos ou implementar recursos de segurança como listas negras.
Após algumas pesquisas, me parece que ficamos sem uma alternativa adequada a partir de agora. Eu realmente espero que a Apple reconsidere sua decisão.
Talvez seja uma boa ideia enviar um e-mail à Apple sobre esse tópico e / ou registrar uma solicitação de bug / recurso sobre isso, pois talvez eles nem estejam cientes das consequências completas para os desenvolvedores.
fonte
UIDevice identifierForVendor
introduzido no iOS 6 funcionaria para seus propósitos.identifierForVendor
é uma sequência alfanumérica que identifica exclusivamente um dispositivo ao fornecedor do aplicativo. (somente leitura)O valor dessa propriedade é o mesmo para aplicativos provenientes do mesmo fornecedor em execução no mesmo dispositivo. Um valor diferente é retornado para aplicativos no mesmo dispositivo provenientes de diferentes fornecedores e para aplicativos em dispositivos diferentes, em relação ao fornecedor.
Disponível no iOS 6.0 e posterior e declarado em
UIDevice.h
Para iOS 5, consulte este link UIDevice-with-UniqueIdentifier-for-iOS-5
fonte
Usando o SSKeychain e o código mencionado acima. Aqui está o código para copiar / colar (adicione o módulo SSKeychain):
}
fonte
O código a seguir ajuda a obter o UDID:
fonte
Este é o código que estou usando para obter o ID para iOS 5 e iOS 6, 7:
fonte
PerformSelector may cause a leak because its selector is unknown
?A partir do iOS 6, temos uma
NSUUID
classe que cumpre a RFC4122Link da Apple: apple_ref para NSUUID
fonte
O iOS 11 introduziu a estrutura DeviceCheck. Possui uma solução completa para identificar exclusivamente o dispositivo.
fonte
Uma maneira de obter UDID:
Um exemplo usando RoutingHTTPServer :
Aqui estão os conteúdos de
udid.mobileconfig
:A instalação do perfil falhará (não me importei em implementar uma resposta esperada, consulte a documentação ), mas o aplicativo obterá um UDID correto. E você também deve assinar o mobileconfig .
fonte
Para o Swift 3.0, use o código abaixo.
fonte
Você pode usar
O que é único para o dispositivo em todos os aplicativos.
fonte
A Apple adicionou uma nova estrutura no iOS 11 chamada DeviceCheck, que ajudará você a obter o identificador exclusivo com muita facilidade. Leia este formulário para mais informações. https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d
fonte
Se alguém se deparar com essa pergunta, ao procurar uma alternativa. Eu segui essa abordagem na
IDManager
aula. Esta é uma coleção de diferentes soluções. KeyChainUtil é um invólucro para ler do chaveiro. Você também pode usar ohashed MAC address
como um tipo de ID exclusivo.fonte
fonte
Podemos usar identifierForVendor para ios7,
--Nota importante ---
UDID e identifierForVendor são diferentes: ---
fonte
A Apple ocultou o UDID de todas as APIs públicas, começando no iOS 7. Qualquer UDID que comece com FFFF é um ID falso. Os aplicativos "Enviar UDID" que funcionavam anteriormente não podem mais ser usados para reunir o UDID para dispositivos de teste. (suspiro!)
O UDID é mostrado quando um dispositivo está conectado ao XCode (no organizador) e quando o dispositivo está conectado ao iTunes (embora você precise clicar em 'Número de Série' para exibir o Identificador).
Se você precisar obter o UDID de um dispositivo para adicionar a um perfil de provisionamento e não conseguir fazer isso sozinho no XCode, será necessário orientá-lo nas etapas para copiar / colar o iTunes.
Existe uma maneira desde (versão do iOS 7) de obter o UDID sem usar o iTunes em um PC / Mac?
fonte
Eu também tinha um problema e a solução é simples:
fonte
Uma alternativa não perfeita, mas uma das melhores e mais próximas alternativas ao UDID (no Swift usando o iOS 8.1 e o Xcode 6.1):
Gerando um UUID aleatório
E use a biblioteca KeychainWrapper :
Adicione um valor de sequência ao chaveiro:
Recupere um valor de string do chaveiro:
Remova um valor de string do chaveiro:
Esta solução usa o chaveiro, portanto, o registro armazenado no chaveiro será mantido, mesmo após o aplicativo ser desinstalado e reinstalado. A única maneira de excluir este registro é redefinir todo o conteúdo e configurações do dispositivo. É por isso que mencionei que esta solução de substituição não é perfeita, mas continua sendo uma das melhores soluções de substituição para UDID no iOS 8.1 usando o Swift.
fonte
NSLog (@ "% @", [[UIDevice currentDevice] identifierForVendor]);
fonte