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.