iPhone SDK에서 표준 API로 전화 번호를 얻는 방법이 있습니까?
iPhone SDK에서 표준 API로 전화 번호를 얻는 방법이 있습니까?
답변:
부정적인 점수를받을 위험이 있으므로 2009 년 11 월 5 일 현재 최고 순위 솔루션 (현재 첫 번째 응답)이 최신 SDK 계약을 위반한다고 제안하고 싶습니다.이 애플리케이션의 사용이 거부되었습니다. Apple의 답변은 다음과 같습니다.
"보안상의 이유로 iPhone OS는 응용 프로그램 (환경 설정 및 데이터 포함)을 파일 시스템의 고유 한 위치로 제한합니다.이 제한은 응용 프로그램의"샌드 박스 "라고하는 보안 기능의 일부입니다. 파일, 기본 설정, 네트워크 리소스, 하드웨어 등에 대한 응용 프로그램의 액세스를 제한하는 세분화 된 컨트롤 "
응용 프로그램 컨테이너 내에서 장치의 전화 번호를 사용할 수 없습니다. App Store에서 응용 프로그램을 다시 고려하려면 디렉토리 컨테이너 내에서만 읽기 위해 응용 프로그램을 수정하고 바이너리를 iTunes Connect에 다시 제출해야합니다.
사용자가 자신의 전화 번호를 입력하지 않아도되기 때문에 실망했습니다.
아니요, 합법적이고 신뢰할 수있는 방법은 없습니다.
방법을 찾으면 이전에 모든 방법에서 발생 했으므로 앞으로 비활성화 될 것입니다.
업데이트 : iOS 4 이상에서 Apple이 기능을 제거한 것으로 보입니다 .
이전 답변을 확장하려면 다음과 같이하십시오.
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
참고 : 이것은 iPhone의 iTunes 활성화 중에 입력 된 "전화 번호"를 검색하며 null이거나 올바르지 않은 값일 수 있습니다. 그것은 것 하지 SIM 카드에서 읽어 보시기 바랍니다.
적어도 2.1에서는 그렇지 않습니다. NSUserDefaults에는 지속되지 않을 수있는 흥미로운 키가 몇 가지 있습니다. (이것은 UIWebView를 사용하는 내 응용 프로그램에 있습니다)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
등등.
다른 사람들이 무엇을하는지 잘 모르겠습니다.
개인 API를 사용하면 다음과 같은 방법으로 사용자 전화 번호를 얻을 수 있습니다.
extern NSString* CTSettingCopyMyPhoneNumber();
+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();
return phone;
}
프로젝트에 CoreTelephony.framework도 포함하십시오.
다음 코드 줄을 사용하면 모든 준비가 끝났으므로 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.
도움이 되었기를 바랍니다!
[UIDevice identifierForVendor]
. 대신 사용하십시오 .
알려진 모든 방법이 iOS 11에서 패치되고 차단 되었기 때문에 iOS API 만 사용하여 전화 번호를 캡처 할 수는 없습니다 (개인 API를 사용하는 개인 앱에서도). 개인 API를 사용하여이를 수행하기 위해 앱 스토어에서 앱을 거부한다는 점을 분명히하십시오. 자세한 내용은 @Dylan의 답변을 참조하십시오.
그러나 사용자 데이터 입력없이 전화 번호를 캡처하는 합법적 인 방법이 있습니다. 이것은 Snapchat과 유사하지만 사용자가 자신의 전화 번호를 입력 할 필요가 없기 때문에 더 쉽습니다.
아이디어는 앱이 앱의 고유 한 설치 코드를 사용하여 프로그래밍 방식으로 SMS 메시지를 서버에 보내도록하는 것입니다. 그런 다음 앱은 동일한 서버를 쿼리하여 최근에이 고유 한 앱 설치 코드가있는 기기에서 SMS 메시지를 받았는지 확인할 수 있습니다. 있는 경우 보낸 전화 번호를 읽을 수 있습니다. 다음은 그 과정을 보여주는 데모 비디오 입니다. 보시다시피, 그것은 매력처럼 작동합니다!
이것은 설정하기 쉽지 않지만, 여기 자습서에 제공된 샘플 코드를 사용하여 무료 AWS 계층에서 무료로 몇 시간 내에 구성 할 수 있습니다 .
전화 번호를 얻으려면 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에서 작동합니다.
공식 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를 통해 고유 번호를 얻는 방법?
응용 프로그램 컨테이너 외부에 도달하면 AppStore에서 거부합니다.
앱은 번들로 자체 포함되어야하며 지정된 컨테이너 영역 외부에서 데이터를 읽거나 쓸 수 없습니다.
섹션 2.5.2 : https://developer.apple.com/app-store/review/guidelines/#software-requirements