زر لفتح جهات الاتصال

عبدالرحمن الخالدي • منذ 5 سنوات

السلام عليكم ورحمة الله وبركاته 

اخواني انا بغيت زر يفتح لي جهات الاتصال ( الأسماء )  و اذا اخترت اسم اي شخص من الاسماء ياخذ رقم الجوال و يتصل عليه .

طبعاً اللغة سويفت .

ويعطيكم العافية.

كلمات دليلية: c++ swift

الإجابة الصحيحة

Ahmed • منذ 5 سنوات
import UIKit
import ContactsUI


class ViewController: UIViewController, CNContactPickerDelegate {

    let contactPicker = CNContactPickerViewController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        contactPicker.delegate = self
    }
    
    @IBAction func contatcButtonClicked(_ sender: UIButton) {
        present(contactPicker, animated: true)
    }
    
    // Delegate's Methods
    
    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        contact.phoneNumbers.forEach { (contactValue) in
            let str = removeSpacesInNumbers(string: contactValue.value.stringValue)
            makeCall(str)
        }
    }
    
    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
        contactPicker.dismiss(animated: true, completion: nil)
    }

    func makeCall(_ string: String) {
        print(string)
        if string.isValid(regex: .phone) {
            if let url = URL(string: "tel://\(string)"), UIApplication.shared.canOpenURL(url) {
                if #available(iOS 10, *) {
                    UIApplication.shared.open(url)
                } else {
                    UIApplication.shared.openURL(url)
                }
            }
        } else {
            print(string)
        }
    }
    
    func removeSpacesInNumbers(string: String) -> String {
        var str = ""
        // Remove any spaces or any special characters.
        for char in string {
            if char == "+" || (char >= "0" && char <= "9") {
                str.append(char)
            }
        }
        return str
    }
}

extension String {
    // Regular Expressions works for this format:
    // 05xxxxxxxx(8)
    // +9665xxxxxxxx(8)
    enum RegularExpressions: String {
            case phone = "^\\+9665\\d{8}|05\\d{8}$"
    }
    
    func isValid(regex: RegularExpressions) -> Bool {
        return isValid(regex: regex.rawValue)
    }
    
    func isValid(regex: String) -> Bool {
        let matches = range(of: regex, options: .regularExpression)
        return matches != nil
    }
}

 

هذا كامل الكود 

الإجابات (6)

Alhoqbani • منذ 5 سنوات

إذا فقط تبغى تفتح جهات الاتصال تقدر تستخدم ContactsUI Framework

الفريم وورك هذا يوفر لك ViewController تقدر تعرضه من أي مكان ويعرض لك قائمة الأسماء. وذا بغيت تتحكم اكثر في اختيار المستخدم تقدر تستخدم الـdelegate للكنترولر.

 

// في أعلى الملف
import ContactsUI

// وذا ضغطت الزر تعرض القائمة
@IBAction func openContactsTapped(_ sender: Any) {

    let contactsPicker = CNContactPickerViewController()
    
    self.present(contactsPicker, animated: true, completion: nil)
        
}

 

عبدالرحمن الخالدي • منذ 5 سنوات

اخوي انا كتبت الكود كامل لكن فيه بعض الارقام يضبط معي و يتصل و بعضها يطلع لي هاذا الخطا خطأ

Alhoqbani: اذا انت تبغاه فقط يتصل على الرقم فما داعي تستخدم الـDelegate النظام مباشرة يسمح له يتصل على الرقم بمجرد ما يضغط عليه. جربها من جهاز آيفون مو من الـSimulator

عبدالرحمن الخالدي: لا انا ابغاه ياخذ رقم الجوال و يضيف عليه ارقام من عندي بعدها يتصل عليه ف اذا ازلت الـDelegate راح يتصل عليه مباشرة وانا دائماً اجربه على الايفون مو على الـSimulator

Alhoqbani: على العموم الخطأ اللي يطلع معك لأن بعض الأرقام ما ينفع تتحول مباشرة لـURL لازم تتأكد أن الرقم موجود وصحيح. بعض الأرقام فيها مسافات مثل اللي في الصورة حقتك 056 218 8746 حاول تشوف الأرقام اللي ترفض عشان تعرف السبب

عبدالرحمن الخالدي: رجعت على الرقم نفسه و عدلت عليه خليته بدون مسافات رقم عادي لكن نفس الخطا

Alhoqbani • منذ 5 سنوات

جرب هذا الكود بدل اللي انت مستخدمه 

    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        
        contact.phoneNumbers.forEach {
            
            var number = $0.value.stringValue.replacingOccurrences(of: " ", with: "")
            
            number = "before number" + number + "after number"
            
            if let url = URL(string: "tel://\(number)") {
                
                print("Number \($0.value.stringValue) is OK")
            
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            
            } else {
                
                print("Could not make url from number: \($0.value.stringValue)")
            
            }
            
        }
    }
    

 

عبدالرحمن الخالدي: ممتاز لكن كيف اذا بغيت اضيف قبل الرقم وبعده وبعدين يتصل

Alhoqbani: عدلت لك الكود. بس غير before number و after number للي تبغاه

عبدالرحمن الخالدي: نفس المشكلة فيه بعض الارقام يضبط ويطلع لي OK و فيه يطلع لي "Could not make url from number"

Ahmed: اذا المشكلة في الفورمات عندك بما ان بعض الارقام تشتغل والبعض لا. ياليت تسوي debug وتعرض لنا الارقام اللي يقبل والارقام اللي ما يقبل. ضيف print واطبع الارقام في الحالتين علشان توضح ونقدر نساعدك. وياليت تشرح كيف تبي تضيف ع الارقام من عندك بعد ما تحددها

عبدالرحمن الخالدي: تم اضافه الصوره.

عبدالرحمن الخالدي • منذ 5 سنوات

خطا٢ه

Ahmed: المشكلة في الفورمات ، اختبرت الكود لكن تحتاج تسوي regular experssions. لكن علشان افهم ، انت فقط تبي تتصل ع الرقم اللي تحدده صحيح ؟

عبدالرحمن الخالدي: اي فقط اتصل على الرقم لكن بعد ما أضيف قبله ارقام و بعده ارقام بعدين اتصل

Ahmed • منذ 5 سنوات
// Inside viewController

    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        contact.phoneNumbers.forEach { (contactValue) in
            let str = removeSpacesAndSpecialCharacters(string: contactValue.value.stringValue)
            makeCall(str)
        }
    }
    
    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
        contactPicker.dismiss(animated: true, completion: nil)
    }

    func makeCall(_ string: String) {
        print(string)
        if string.isValid(regex: .phone) {
            if let url = URL(string: "tel://\(string)"), UIApplication.shared.canOpenURL(url) {
                if #available(iOS 10, *) {
                    UIApplication.shared.open(url)
                } else {
                    UIApplication.shared.openURL(url)
                }
            }
        } else {
            print(string)
        }
    }
    
    func removeSpacesAndSpecialCharacters(string: String) -> String {
        var str = ""
        // Remove any spaces or any special characters.
        for char in string {
            if char == "+" || (char >= "0" && char <= "9") {
                str.append(char)
            }
        }
        return str
    }

// Extension

extension String {
    // Regular Expressions works for these formats ONLY:
    // 05xxxxxxxx(8x)
    // +9665xxxxxxxx(8x)
    enum RegularExpressions: String {
            case phone = "^\\+9665\\d{8}|05\\d{8}$"
    }
    
    func isValid(regex: RegularExpressions) -> Bool {
        return isValid(regex: regex.rawValue)
    }
    
    func isValid(regex: String) -> Bool {
        let matches = range(of: regex, options: .regularExpression)
        return matches != nil
    }
}

 

تم تعديل ٣ نقاط :

١ - الفورمات لتشغيل ارقام الجوال في السعودية.

٢ - إضاقة دالة removeSpacesAndSpecialCharacters.

٣ - حذف دالة onlyDigits.

 

Alhoqbani: كتابة الكود بتكون صعبة خاصة الـRegex لو تقدر تضيف الكود بالضغط على زر الشيفرة &lt;&gt; ثالث زر من اليسار في المحرر يكون أفضل.

Ahmed: عدلته لآكواد

عبدالرحمن الخالدي: ممتاز لكن اخوي وين اضيف الBefor number And After number

Ahmed: ممكن تشرح لي على اي اساس تبي تعدل ؟ وكيفة التعديل ؟ لأني بصراحة ماني فاهم .. بس اذا الكود اللي فوق من Alhoqbani يشتغل معك ، ضيفه بالمكان والوقت اللي حاب تعدل فيه الرقم.

عبدالرحمن الخالدي: لا ما اشتغل معي مضبوط اكواد الاستاذ Alhoqbani ف انا بغيتك لاهنت تقولي وين اضيف هاذي الاكواد لاني انا مبتدا في البرمجة و اذا على التعديل انا اقصد ابي البرنامج يضيف قبل اي رقم المستخدم يختارة من جهات الاتصال مثلاً +٩٦٦ و بعده # هاذا مثال فقط اتمنى الشرح واضح و شكراً

Ahmed: الغرض الإساسي من مكتبة Contacts و ContactUI هي الوصل لبيانات جهات الإتصال عندك. اذا حاب تضيف ميزة التعديل على القائمة لازم تستخدم مكتبة AdressBook.

Ahmed: بعد تحديدك للرقم او الإيميل من جهة قائمة الإتصال ، انت الآن تتعامل مع قيمة ما تتعامل مع مرجع! فإذا حاب تضيف ع القيمة نفسها تقدر لكن ما يحفظ هذا التعديل

عبدالرحمن الخالدي • منذ 5 سنوات

طبعت نفس الكود لكن الى الان في بعض الارقام تضبط و بعضها يطلع الخطا الموضح في الصوره تحت .خطا٣

Ahmed: ممكن تنزل الكود كامل ، او اذا عندك GitHub نزل الرابط خليني اشوف ..

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !