Obtenha programaticamente o seu próprio número de telefone no iOS

330

Existe alguma maneira de obter seu próprio número de telefone pelas APIs padrão do iPhone SDK?

Vadim
fonte
pode ser útil para outras pessoas que buscam uma solução que não use a API privada como-faz-quadrados-cartão-app-faça-isso - use o nome do dispositivo para capturar o nome do usuário, basta alterar para capturar o número de telefone ou outros detalhes, conforme apropriado
Nik Burns
davidgyoung forneceu uma solução funcional. Está enterrado (precisa de alguns votos positivos).
1
Agora é possível no Xcode como este stackoverflow.com/a/54004224/536214
aqavi_paracha

Respostas:

318

Correndo o risco de obter notas negativas, quero sugerir que a solução de classificação mais alta (atualmente a primeira resposta) viola o mais recente contrato do SDK em 5 de novembro de 2009. Nosso aplicativo foi rejeitado por usá-lo. Aqui está a resposta da Apple:

"Por motivos de segurança, o iPhone OS restringe um aplicativo (incluindo suas preferências e dados) a um local exclusivo no sistema de arquivos. Essa restrição faz parte do recurso de segurança conhecido como" sandbox "do aplicativo. O sandbox é um conjunto de controles detalhados que limitam o acesso de um aplicativo a arquivos, preferências, recursos de rede, hardware e assim por diante ".

O número de telefone do dispositivo não está disponível no contêiner do seu aplicativo. Você precisará revisar seu aplicativo para ler apenas dentro do contêiner de diretório e reenviar seu binário para o iTunes Connect para que seu aplicativo seja reconsiderado na App Store.

Foi uma decepção real, pois queríamos poupar o usuário de inserir seu próprio número de telefone.

Dylan
fonte
83
Como o Snapchat faz isso?
Rgbrgb
1
@Dylan: quando seu aplicativo foi rejeitado. Talvez as diretrizes sejam revisadas? Forneça links úteis para a documentação. No entanto, agradeço sua resposta.
Abhishek Bedi
1
Posso obter o link da documentação apple.developer onde isso foi mencionado?
Ganesh AB - Android
3
Eu nunca encontrei nenhuma documentação sobre isso, mas adoraria vê-la. É uma daquelas áreas em que a Apple permaneceu opaca para mim. Não tentei enviar uma inscrição desde esse momento.
Dylan
1
@rgbrgb Eu não uso o Snapchat, você pode explicar a experiência deles que é tão misteriosa?
William Entriken
138

Não, não há uma maneira legal e confiável de fazer isso.

Se você encontrar uma maneira, ela será desativada no futuro, como aconteceu com todos os métodos anteriores.

Andrew Grant
fonte
2
Veja a resposta de Nik Burn: stackoverflow.com/a/8415162/292166 - existe (mais ou menos) uma maneira de fazer isso!
Josephh
4
Qual é o melhor motivo que você viu para a Apple proibir o acesso baseado em permissão ao número de telefone do usuário? A Apple já permite acesso baseado em permissão a contatos, fotos, localização e câmera e microfone do usuário. Por que não o número de telefone? Deve haver uma boa razão, mas não está claro imediatamente. É lamentável, porque a proibição de acesso faz com que os desenvolvedores gastem muito tempo e dinheiro em outras maneiras de verificar o número de telefone de um usuário.
Crashalot 22/03
86

Atualização: o recurso parece ter sido removido pela Apple no iOS 4 ou próximo dele


Apenas para expandir uma resposta anterior, algo assim faz isso por mim:

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

Nota : Isso recupera o "Número de telefone" digitado durante a ativação do iTunes no iPhone e pode ser nulo ou um valor incorreto. NÃO é lido no cartão SIM.

Pelo menos isso acontece em 2.1. Existem algumas outras chaves interessantes no NSUserDefaults que também podem não durar. (Isso está no meu aplicativo que usa um UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

e assim por diante.

Não tenho certeza do que os outros fazem.

Robert Sanders
fonte
1
Houve algumas notícias
JeffH
10
Não faça isso. Peça ao usuário o número via teclado ou seletor de contatos. Você deve tornar qualquer coleta de informações o mais explícita possível para o usuário. Pode não ser o mais conveniente, mas é muito fácil salvar o número, então você só precisa solicitá-lo uma vez.
David Kanarek
3
Uma solução que recebe aplicativos rejeitados não é uma solução.
averydev
27

Usando a API privada, você pode obter o número de telefone do usuário da seguinte maneira:

extern NSString* CTSettingCopyMyPhoneNumber();


+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();

return phone;
}

Inclua também CoreTelephony.framework no seu projeto.

Igor
fonte
Depois de ler outras respostas neste fórum, eu estava pensando que não é possível, mas você tem feito trabalho perfeito
Mehul Thakkar
1
No iOS 7, ele é protegido pelo direito stackoverflow.com/questions/19504478/…
creker
telefone é nulo quando eu tento isso
C0D3
22

Como você provavelmente já sabe se usa a seguinte linha de código, seu aplicativo será rejeitado pela Apple

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

aqui está uma referência

http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html

você pode usar as seguintes informações

NSString *phoneName = [[UIDevice currentDevice] name];

NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

e assim por diante

@property(nonatomic,readonly,retain) NSString    *name;              // e.g. "My iPhone"
@property(nonatomic,readonly,retain) NSString    *model;             // e.g. @"iPhone", @"iPod Touch"
@property(nonatomic,readonly,retain) NSString    *localizedModel;    // localized version of model
@property(nonatomic,readonly,retain) NSString    *systemName;        // e.g. @"iPhone OS"
@property(nonatomic,readonly,retain) NSString    *systemVersion;     // e.g. @"2.0"
@property(nonatomic,readonly) UIDeviceOrientation orientation;       // return current device orientation
@property(nonatomic,readonly,retain) NSString    *uniqueIdentifier;  // a string unique to each device based on various hardware info.

Espero que isto ajude!

Andres Garcia
fonte
9
O uniqueIdentifier também está obsoleto no iOS5. Use o endereço MAC.
Raptor
15
O endereço MAC está obsoleto no iOS 7. Use em [UIDevice identifierForVendor]vez disso.
jab
17

Você não pode usar APIs do iOS sozinho para capturar o número de telefone (mesmo em um aplicativo privado com APIs privadas), pois todos os métodos conhecidos para fazer isso foram corrigidos e bloqueados no iOS 11. Mesmo que uma nova exploração seja encontrada, a Apple fez claro que eles rejeitarão qualquer aplicativo da loja de aplicativos por usar APIs privadas para fazer isso. Veja a resposta de @ Dylan para obter detalhes.

No entanto, existe uma maneira legal de capturar o número de telefone sem nenhuma entrada de dados do usuário . Isso é semelhante ao que o Snapchat faz, mas é mais fácil, pois não exige que o usuário digite seu próprio número de telefone.

A idéia é fazer com que o aplicativo envie programaticamente uma mensagem SMS para um servidor com o código de instalação exclusivo do aplicativo. O aplicativo pode consultar o mesmo servidor para ver se recebeu recentemente uma mensagem SMS de um dispositivo com este código de instalação de aplicativo exclusivo. Se tiver, pode ler o número de telefone que o enviou. Aqui está um vídeo de demonstração mostrando o processo. Como você pode ver, funciona como um encanto!

Isso não é muito fácil de configurar, mas deve ser configurado em poucas horas, sem nenhum custo, em uma camada gratuita da AWS com o código de exemplo fornecido no tutorial aqui .

davidgyoung
fonte
Desculpe. O vídeo foi acidentalmente privado. Agora é público.
Davidgyoung 29/11
É uma ótima maneira, mas você poderia enriquecer sua resposta para, pelo menos, cobrir os detalhes básicos da implementação? Como você envia um SMS de um dispositivo iOS sem saber o seu número de telefone? como você configura um servidor de recebimento de SMS que tem acesso ao número de telefone do remetente? Quais ferramentas estão envolvidas? compatibilidade?
Motti Shneor 6/02/19
@MottiShneor, você viu o link do tutorial na resposta? Este possui um tutorial completo sobre como configurar esta solução, bem como um código de aplicativo de exemplo funcional em um repositório do Github.
Davidgyoung
2

Para obter seu número de telefone, você pode ler um arquivo plist. Não funcionará em iDevices sem jailbreak:

NSString *commcenter = @"/private/var/wireless/Library/Preferences/com.apple.commcenter.plist";
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:commcenter];
    NSString *PhoneNumber = [dict valueForKey:@"PhoneNumber"];
    NSLog([NSString stringWithFormat:@"Phone number: %@",PhoneNumber]);

Não sei se a Apple permite isso, mas funciona em iPhones.

David Gölzhäuser
fonte
A Apple anula a garantia em telefones com jailbreak e um aplicativo precisa ter capacidade onipresente para todos os usuários.
Cosmtar 15/01
2

Nenhuma API oficial para fazer isso. Usando a API privada, você pode usar o seguinte método:

-(NSString*) getMyNumber {
    NSLog(@"Open CoreTelephony");
    void *lib = dlopen("/Symbols/System/Library/Framework/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);
    NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");
    NSString* (*pCTSettingCopyMyPhoneNumber)() = dlsym(lib, "CTSettingCopyMyPhoneNumber");
    NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");

    if (pCTSettingCopyMyPhoneNumber == nil) {
        NSLog(@"pCTSettingCopyMyPhoneNumber is nil");
        return nil;
    }
    NSString* ownPhoneNumber = pCTSettingCopyMyPhoneNumber();
    dlclose(lib);
    return ownPhoneNumber;
}

Funciona no iOS 6 sem JB e assinatura especial.

Como mencionado creker no iOS 7 com JB, você precisa usar direitos para fazê-lo funcionar.

Como fazer isso com os direitos que você pode encontrar aqui: iOS 7: Como obter seu próprio número via API privada?

0x8BADF00D
fonte