प्रोग्रामेटिक रूप से iOS में अपना फोन नंबर प्राप्त करें


330

क्या iPhone SDK से मानक API द्वारा अपना फ़ोन नंबर प्राप्त करने का कोई तरीका है?


ऐसे अन्य लोगों के लिए उपयोगी हो सकता है जो एक ऐसे समाधान की तलाश कर रहे हैं जिसमें निजी एपि-के-कैसे-स्क्वेर्स-कार्डकेस-ऐप-डू-दिस का उपयोग नहीं किया जाता है - उपयोगकर्ताओं के नाम को कैप्चर करने के लिए डिवाइस नाम का उपयोग करें केवल उपयुक्त फोन नंबर या अन्य विवरणों को कैप्चर करने के लिए संशोधन करें
निक बर्न्स

davidgyoung ने एक कार्यशील समाधान प्रदान किया है। यह दफन है (कुछ upvotes की जरूरत है)।
पी आई

अब यह Xcode में संभव है जैसे इस stackoverflow.com/a/54004224/536214
aqavi_paracha

जवाबों:


318

नकारात्मक अंक प्राप्त करने के जोखिम पर, मैं सुझाव देना चाहता हूं कि उच्चतम रैंकिंग समाधान (वर्तमान में पहली प्रतिक्रिया) 5 नवंबर, 2009 के अनुसार नवीनतम एसडीके समझौते का उल्लंघन करता है। हमारे आवेदन का उपयोग करने के लिए सिर्फ खारिज कर दिया गया था। यहाँ Apple से प्रतिक्रिया है:

"सुरक्षा कारणों से, iPhone OS एक एप्लिकेशन (इसकी प्राथमिकताओं और डेटा सहित) को फ़ाइल सिस्टम में एक अद्वितीय स्थान पर प्रतिबंधित करता है। यह प्रतिबंध एप्लिकेशन के" सैंडबॉक्स "के रूप में जाना जाने वाले सुरक्षा सुविधा का हिस्सा है। सैंडबॉक्स ठीक-ठाक सेट है। दानेदार नियंत्रण एक एप्लिकेशन की फाइलों, वरीयताओं, नेटवर्क संसाधनों, हार्डवेयर और इतने पर पहुंच को सीमित करता है। "

आपके एप्लिकेशन के कंटेनर में डिवाइस का फ़ोन नंबर उपलब्ध नहीं है। आपको केवल अपने निर्देशिका कंटेनर में पढ़ने के लिए अपने एप्लिकेशन को संशोधित करना होगा और ऐप स्टोर के लिए पुनर्विचार करने के लिए अपने बाइनरी को iTunes Connect से पुनः कनेक्ट करना होगा।

यह एक वास्तविक निराशा थी क्योंकि हम उपयोगकर्ता को अपना फोन नंबर दर्ज करने से रोकना चाहते थे।


83
स्नैपचैट कैसे करता है?
rgbrgb

1
@ डायलन: जब आपका ऐप अस्वीकार कर दिया गया था। दिशानिर्देशों को संशोधित किया गया है? कृपया प्रलेखन के लिए उपयोगी लिंक प्रदान करें। हालाँकि, मैं आपके उत्तर की सराहना करता हूँ।
अभिषेक बेदी

1
क्या मुझे Apple.developer प्रलेखन लिंक मिल सकता है जहाँ यह उल्लेख किया गया है?
गणेश एबी - एंड्रॉइड

3
मुझे इस पर कभी कोई दस्तावेज नहीं मिला, लेकिन मैं इसे देखना पसंद करूंगा। यह उन क्षेत्रों में से एक है जहां Apple मेरे लिए अपारदर्शी रहा है। मैंने इसके बाद से आवेदन जमा करने की कोशिश नहीं की।
डायलन

1
@rgbrgb मैं स्नैपचैट का उपयोग नहीं करता, क्या आप कृपया उनके अनुभव की व्याख्या कर सकते हैं जो इतना रहस्यमय है?
विलियम एंट्रीकेन

138

नहीं, ऐसा करने का कोई कानूनी और विश्वसनीय तरीका नहीं है।

यदि आपको कोई रास्ता मिल जाता है, तो यह भविष्य में अक्षम हो जाएगा, जैसा कि पहले हर विधि के साथ हुआ है।


2
निक बर्न का जवाब देखें: stackoverflow.com/a/8415162/292166 - ऐसा करने का एक तरीका है!
जोसेफ

4
ऐप्पल ने उपयोगकर्ता के फ़ोन नंबर के लिए अनुमति-आधारित पहुंच को अस्वीकार करने के लिए सबसे अच्छा कारण क्या देखा है? Apple पहले से ही संपर्कों, फ़ोटो, स्थान और उपयोगकर्ता के कैमरा और माइक्रोफ़ोन पर अनुमति-आधारित पहुँच की अनुमति देता है। फोन नंबर क्यों नहीं? एक अच्छा कारण होना चाहिए, लेकिन यह तुरंत स्पष्ट नहीं है। यह दुर्भाग्यपूर्ण है क्योंकि उपयोगकर्ता के फोन नंबर को सत्यापित करने के लिए अन्य तरीकों पर बहुत अधिक समय और पैसा खर्च करने के लिए देवों को प्रतिबंधित करने का कारण बनता है।
Crashalot

86

अद्यतन: क्षमता iOS 4 पर या उसके आसपास Apple द्वारा हटा दी गई प्रतीत होती है


बस पहले वाले उत्तर पर विस्तार करने के लिए, ऐसा कुछ मेरे लिए है:

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

नोट : यह "फ़ोन नंबर" को पुनर्प्राप्त करता है जो iPhone के iTunes सक्रियण के दौरान दर्ज किया गया था और यह गलत या गलत हो सकता है। यह सिम कार्ड से पढ़ा नहीं है

कम से कम 2.1 में करता है। NSUserDefaults में कुछ अन्य दिलचस्प कुंजियाँ हैं जो शायद अंतिम न हों। (यह मेरे ऐप में है जो UIWebView का उपयोग करता है)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

और इसी तरह।

निश्चित नहीं है कि अगर कुछ भी हो, तो बाकी लोग करें।


1
इस क्षमता के पीछे सुरक्षा चिंताओं के बारे में कुछ हालिया प्रेस हैं: theregister.co.uk/2009/09/30/iphone_security
JeffH

10
यह मत करो। कीपैड या कॉन्टैक्ट चॉसर के जरिए नंबर के लिए यूजर से पूछें। आपको उपयोगकर्ता को यथासंभव किसी भी जानकारी को एकत्रित करना चाहिए। यह सबसे सुविधाजनक नहीं हो सकता है, लेकिन संख्या को बचाना बहुत आसान है, इसलिए आपको केवल एक बार इसके लिए पूछना होगा।
डेविड कानारेक

3
एक समाधान जो एप्लिकेशन को अस्वीकार कर दिया जाता है वह समाधान नहीं है।
averydev

27

निजी एपीआई का उपयोग करके आप निम्नलिखित तरीके से उपयोगकर्ता फोन नंबर प्राप्त कर सकते हैं:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

अपने प्रोजेक्ट में CoreTelephony.framework भी शामिल करें।


इस फोरम में अन्य उत्तर पढ़ने के बाद, मैं सोच रहा था कि यह संभव नहीं है, लेकिन आपने सही काम किया है
मेहुल ठक्कर

1
IOS 7 पर यह हक़दार stackoverflow.com/questions/19504478/…
creker

जब मैं यह कोशिश करता हूं तो फोन शून्य होता है
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
यूनीक आईडेंटिफायर को भी iOS5 में चित्रित किया गया है। इसके बजाय मैक पते का उपयोग करें।
रैप्टर

15
मैक पते को आईओएस 7. में इस्तेमाल [UIDevice identifierForVendor]किया गया है।
जैब

17

आप फोन नंबर (यहां तक ​​कि निजी एपीआई के साथ एक निजी ऐप में) पर कब्जा करने के लिए अकेले आईओएस एपीआई का उपयोग नहीं कर सकते हैं, क्योंकि ऐसा करने के सभी ज्ञात तरीकों को आईओएस 11 के रूप में पैच किया गया है और अवरुद्ध किया गया है। स्पष्ट है कि वे ऐसा करने के लिए निजी एपीआई का उपयोग करने के लिए ऐप स्टोर से किसी भी ऐप को अस्वीकार कर देंगे। विवरण के लिए @ डायलन का उत्तर देखें।

हालांकि, किसी भी उपयोगकर्ता डेटा प्रविष्टि के बिना फोन नंबर पर कब्जा करने का एक कानूनी तरीका है । यह स्नैपचैट के समान है, लेकिन आसान है, क्योंकि इसके लिए उपयोगकर्ता को अपने फोन नंबर को टाइप करने की आवश्यकता नहीं है।

यह विचार है कि एप्लिकेशन को प्रोग्राम के लिए ऐप के अद्वितीय इंस्टॉलेशन कोड के साथ सर्वर पर एक एसएमएस संदेश भेजा जाए। ऐप उसी सर्वर को क्वेरी कर सकता है यह देखने के लिए कि क्या उसने हाल ही में इस अद्वितीय ऐप इंस्टॉलेशन कोड के साथ डिवाइस से एसएमएस संदेश प्राप्त किया है। यदि यह है, तो यह उस फोन नंबर को पढ़ सकता है जिसने इसे भेजा था। यहां एक डेमो वीडियो प्रक्रिया को दिखाया गया है। जैसा कि आप देख सकते हैं, यह एक आकर्षण की तरह काम करता है!

यह सेट अप करने के लिए सुपर आसान नहीं है, लेकिन इसे कुछ घंटों में मुफ्त एडब्ल्यूएस टियर पर किसी भी शुल्क पर कॉन्फ़िगर किया गया है, यहां ट्यूटोरियल में दिए गए नमूना कोड के साथ ।


माफ़ करना। वीडियो गलती से निजी था। यह अब सार्वजनिक है।
दाविदयोंग

यह एक शानदार तरीका है, लेकिन क्या आप कम से कम बुनियादी कार्यान्वयन विवरण को कवर करने के लिए अपने उत्तर को समृद्ध कर सकते हैं? अपने फ़ोन नंबर को जाने बिना आप iOS डिवाइस से एसएमएस कैसे भेज सकते हैं? आप एक एसएमएस प्राप्त करने वाले सर्वर को कैसे सेट करते हैं जिसकी पहुंच प्रेषक के फोन-नंबर तक है? कौन से उपकरण शामिल हैं? संगतता?
मोति श्नोर

@MottiShneor, क्या आपने उत्तर में ट्यूटोरियल लिंक देखा? यह इस समाधान को स्थापित करने के साथ-साथ गिथब रेपो में काम कर रहे नमूना ऐप कोड पर एक पूर्ण ट्यूटोरियल है।
davidgyoung 13

2

आपको फ़ोन नंबर प्राप्त करने के लिए आप एक प्लिस्ट फ़ाइल पढ़ सकते हैं। यह गैर-जेलब्रेक iDevices पर काम नहीं करेगा:

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 इसकी अनुमति देता है लेकिन यह iPhones पर काम करता है।


Apple जेलब्रेक फोन पर वारंटी को टाल देता है और सभी उपयोगकर्ताओं के लिए एक ऐप की सर्वव्यापी क्षमता होनी चाहिए।
कॉसमर

2

कोई आधिकारिक एपीआई ऐसा करने के लिए नहीं। निजी एपीआई का उपयोग करके आप निम्नलिखित विधि का उपयोग कर सकते हैं:

-(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 पर काम करता है।

जैसा कि जेबी के साथ iOS 7 पर क्रेकर का उल्लेख है, आपको इसे काम करने के लिए एंटाइटेलमेंट का उपयोग करने की आवश्यकता है।

यह आप एंटाइटेलमेंट के साथ कैसे कर सकते हैं: आईओएस 7: निजी एपीआई के माध्यम से अपना नंबर कैसे प्राप्त करें?


0

AppStore इसे अस्वीकार कर देगा, क्योंकि यह एप्लिकेशन कंटेनर के बाहर पहुंच रहा है।

ऐप्स को अपने बंडलों में आत्म-निहित होना चाहिए, और निर्दिष्ट कंटेनर क्षेत्र के बाहर डेटा को पढ़ना या लिखना नहीं हो सकता है

धारा 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requitions

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.