iOS에서 프로그래밍 방식으로 전화 번호 받기


330

iPhone SDK에서 표준 API로 전화 번호를 얻는 방법이 있습니까?


개인 API의 how-does-squares-cardcase-app-do-this를 사용하지 않는 솔루션을 검색하는 다른 사용자에게 유용 할 수 있습니다. 사용자 이름을 캡처하기 위해 장치 이름을 사용 하여 전화 번호 또는 기타 세부 정보를 캡처하도록 수정하십시오
— Nik Burns

davidgyoung은 작업 솔루션을 제공했습니다. 묻혀 있습니다 (일부 공짜 필요).
— P i

이제 다음과 같이 Xcode에서 가능합니다. stackoverflow.com/a/54004224/536214
— aqavi_paracha

답변:


318

부정적인 점수를받을 위험이 있으므로 2009 년 11 월 5 일 현재 최고 순위 솔루션 (현재 첫 번째 응답)이 최신 SDK 계약을 위반한다고 제안하고 싶습니다.이 애플리케이션의 사용이 거부되었습니다. Apple의 답변은 다음과 같습니다.

"보안상의 이유로 iPhone OS는 응용 프로그램 (환경 설정 및 데이터 포함)을 파일 시스템의 고유 한 위치로 제한합니다.이 제한은 응용 프로그램의"샌드 박스 "라고하는 보안 기능의 일부입니다. 파일, 기본 설정, 네트워크 리소스, 하드웨어 등에 대한 응용 프로그램의 액세스를 제한하는 세분화 된 컨트롤 "

응용 프로그램 컨테이너 내에서 장치의 전화 번호를 사용할 수 없습니다. App Store에서 응용 프로그램을 다시 고려하려면 디렉토리 컨테이너 내에서만 읽기 위해 응용 프로그램을 수정하고 바이너리를 iTunes Connect에 다시 제출해야합니다.

사용자가 자신의 전화 번호를 입력하지 않아도되기 때문에 실망했습니다.


83
Snapchat은 어떻게합니까?
— rgbrgb

1
@Dylan : 앱이 언제 거부 되었습니까? 설명서에 대한 유용한 링크를 제공하십시오. 그러나 귀하의 답변에 감사드립니다.
— Abhishek Bedi

1
이것이 언급 된 apple.developer 문서 링크를 얻을 수 있습니까?
— Ganesh AB-안드로이드

3
나는 이것에 대한 문서를 찾지 못했지만 그것을보고 싶습니다. 애플이 불투명 한 영역 중 하나입니다. 이 이후로 신청서를 제출하지 않았습니다.
— Dylan

1
@rgbrgb Snapchat을 사용하지 않습니다. 너무 신비로운 그들의 경험을 설명해 주시겠습니까?
— William Entriken

138

아니요, 합법적이고 신뢰할 수있는 방법은 없습니다.

방법을 찾으면 이전에 모든 방법에서 발생 했으므로 앞으로 비활성화 될 것입니다.


2
Nik Burn의 답변 : stackoverflow.com/a/8415162/292166을 참조하십시오 -이것을 수행하는 방법이 있습니다!
— JosephH

4
Apple이 사용자의 전화 번호에 대한 권한 기반 액세스를 허용하지 않는 가장 좋은 이유는 무엇입니까? Apple은 이미 연락처, 사진, 위치 및 사용자의 카메라 및 마이크에 대한 권한 기반 액세스를 허용합니다. 전화 번호가 왜 안됩니까? 정당한 이유가 있어야하지만 즉시 명확하지는 않습니다. 액세스를 금지하면 개발자가 사용자의 전화 번호를 확인하는 다른 방법에 많은 시간과 돈을 소비하기 때문에 불행합니다.
— Crashalot

86

업데이트 : iOS 4 이상에서 Apple이 기능을 제거한 것으로 보입니다 .


이전 답변을 확장하려면 다음과 같이하십시오.

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

참고 : 이것은 iPhone의 iTunes 활성화 중에 입력 된 "전화 번호"를 검색하며 null이거나 올바르지 않은 값일 수 있습니다. 그것은 것 하지 SIM 카드에서 읽어 보시기 바랍니다.

적어도 2.1에서는 그렇지 않습니다. NSUserDefaults에는 지속되지 않을 수있는 흥미로운 키가 몇 가지 있습니다. (이것은 UIWebView를 사용하는 내 응용 프로그램에 있습니다)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

등등.

다른 사람들이 무엇을하는지 잘 모르겠습니다.


1
이 기능을 뒤에 보안 문제에 대한 몇 가지 최근의 언론은가있었습니다 : theregister.co.uk/2009/09/30/iphone_security
— JeffH

10
하지마 키패드 또는 연락처 선택기를 통해 사용자에게 번호를 묻습니다. 정보 수집은 가능한 한 사용자에게 명백하게해야합니다. 가장 편리하지는 않지만 번호를 저장하는 것은 매우 쉽기 때문에 한 번만 요청하면됩니다.
— David Kanarek

3
앱이 거부되는 솔루션은 솔루션이 아닙니다.
— averydev

27

개인 API를 사용하면 다음과 같은 방법으로 사용자 전화 번호를 얻을 수 있습니다.

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

프로젝트에 CoreTelephony.framework도 포함하십시오.


이 포럼에서 다른 답변을 읽은 후에는 가능하지 않다고 생각했지만 완벽하게 해냈습니다
— Mehul Thakkar


전화 내가이 때 전무하다
— C0D3

22

다음 코드 줄을 사용하면 모든 준비가 끝났으므로 Apple은 앱을 거부합니다.

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

여기 참조입니다

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

대신 다음 정보를 사용할 수 있습니다

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

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

등등

@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.

도움이 되었기를 바랍니다!


9
uniqueIdentifier는 iOS5에서도 더 이상 사용되지 않습니다. 대신 MAC 주소를 사용하십시오.
— 랩터

15
MAC 주소는 iOS 7에서 더 이상 사용되지 않습니다 [UIDevice identifierForVendor]. 대신 사용하십시오 .
— jab

17

알려진 모든 방법이 iOS 11에서 패치되고 차단 되었기 때문에 iOS API 만 사용하여 전화 번호를 캡처 할 수는 없습니다 (개인 API를 사용하는 개인 앱에서도). 개인 API를 사용하여이를 수행하기 위해 앱 스토어에서 앱을 거부한다는 점을 분명히하십시오. 자세한 내용은 @Dylan의 답변을 참조하십시오.

그러나 사용자 데이터 입력없이 전화 번호를 캡처하는 합법적 인 방법이 있습니다. 이것은 Snapchat과 유사하지만 사용자가 자신의 전화 번호를 입력 할 필요가 없기 때문에 더 쉽습니다.

아이디어는 앱이 앱의 고유 한 설치 코드를 사용하여 프로그래밍 방식으로 SMS 메시지를 서버에 보내도록하는 것입니다. 그런 다음 앱은 동일한 서버를 쿼리하여 최근에이 고유 한 앱 설치 코드가있는 기기에서 SMS 메시지를 받았는지 확인할 수 있습니다. 있는 경우 보낸 전화 번호를 읽을 수 있습니다. 다음은 그 과정을 보여주는 데모 비디오 입니다. 보시다시피, 그것은 매력처럼 작동합니다!

이것은 설정하기 쉽지 않지만, 여기 자습서에 제공된 샘플 코드를 사용하여 무료 AWS 계층에서 무료로 몇 시간 내에 구성 할 수 있습니다 .


죄송합니다. 비디오가 실수로 비공개였습니다. 지금은 공개입니다.
— davidgyoung

이것은 좋은 방법이지만 최소한 기본 구현 세부 사항을 다루기 위해 답변을 풍부하게 할 수 있습니까? 전화 번호를 모르고 iOS 기기에서 SMS를 보내려면 어떻게합니까? 발신자의 전화 번호에 액세스 할 수있는 SMS 수신 서버를 어떻게 설정합니까? 어떤 도구가 관련되어 있습니까? 적합성?
— Motti Shneor

@MottiShneor, 답변에 튜토리얼 링크가 보입니까? 여기에는이 솔루션을 설정하는 방법에 대한 전체 자습서와 Github 리포지토리에서 작동하는 샘플 앱 코드가 있습니다.
— davidgyoung

2

전화 번호를 얻으려면 plist 파일을 읽을 수 있습니다. 손상되지 않은 iDevice에서는 작동하지 않습니다.

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]);

Apple이 이것을 허용하는지 모르겠지만 iPhone에서 작동합니다.


Apple은 탈옥 전화기에 대한 보증을 무효화하며 앱은 모든 사용자에게 유비쿼터스 기능이 필요합니다.
— Cosmtar

2

공식 API가 없습니다. 개인 API를 사용하면 다음 방법을 사용할 수 있습니다.

-(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;
}

JB 및 특수 서명없이 iOS 6에서 작동합니다.

JB 를 사용 하는 iOS 7의 제작자 에서 언급했듯이 자격을 사용해야 작동합니다.

권한 부여를 사용하여 수행하는 방법 : iOS 7 : 개인 API를 통해 고유 번호를 얻는 방법?


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.