Existe alguma maneira de obter seu próprio número de telefone pelas APIs padrão do iPhone SDK?
Existe alguma maneira de obter seu próprio número de telefone pelas APIs padrão do iPhone SDK?
Respostas:
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.
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.
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.
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.
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!
[UIDevice identifierForVendor]
vez disso.
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 .
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.
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?
O AppStore o rejeitará, pois está chegando fora do contêiner do aplicativo.
Os aplicativos devem ser independentes em seus pacotes configuráveis e não podem ler ou gravar dados fora da área de contêiner designada
Seção 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requirements