How to block dynamic array of phone number using Callkit swift

I am working on an App where user can block the phone number. Initialy I have tried with static phone number array its working but when I try to block the number that I add to array from TextField it not bloacking in this case.

The Code I am using CallDirectory extension

class CallDirectoryHandler: CXCallDirectoryProvider, CXCallDirectoryExtensionContextDelegate {
    func requestFailed(for extensionContext: CXCallDirectoryExtensionContext, withError error: Error) {
        print("Errorrrrrrrrr",error)
    }
    override func beginRequest(with context: CXCallDirectoryExtensionContext) {
        context.delegate = self
//        let numList = NumberList()
        var numList = NumberList()
        for num in numList.array{
            let pNum :  CXCallDirectoryPhoneNumber = CXCallDirectoryPhoneNumber(Int64(num)!)
            context.addBlockingEntry(withNextSequentialPhoneNumber: pNum)

        }
        context.completeRequest()
    }
}

And the phone number array

class NumberList : ObservableObject{
    @Published var array:[String] = []
    
    //more code will goes there
}

View In this code I used two buttons one for adding number from TextFeild to array and other to block

struct AddNumber: View {
    @StateObject var numberList = NumberList()
    @State var number = ""
    var body: some View {
        VStack{
            HStack{
                TextField("Enter Number", text: $number)
                    .padding()
            }
            .frame(width: Constants.width*0.7, height: Constants.height*0.07)
            .background(Color("Button"))
            .cornerRadius(30)
            Button {
                numberList.array.append(number)
            } label: {
                Text("Save")
                    .foregroundColor(.white)
            }
            Button{
                CXCallDirectoryManager.sharedInstance.reloadExtension(withIdentifier: "XYZ.com.BlockContacts.CallBlocker") { (error) in
                    print("reloaded extension: \(String(describing: error))")
                }
            } label: {
                Text("Block")
                    .font(.custom("Montserrat-Regular", size: 24))
                    .frame(width: Constants.width*0.6, height: Constants.height*0.06)
                    .background(Color.red)
                    .foregroundColor(.white)
                    .cornerRadius(30)
            }
        }
    }
}


Update Save button

Button {
                        if var data = UserDefaults.standard.array(forKey: "phoneNumber") as? [String]{
                            data.append(number)
                            UserDefaults.standard.set(data,forKey: "phoneNumber")
                        }else{
                            let ar = [number]
                            UserDefaults.standard.set(ar,forKey: "phoneNumber")
                        }
                    } label: {
                        Text("Save")
                            .foregroundColor(.white)
                    }

And CallDirectoryHandler.swift file

class CallDirectoryHandler: CXCallDirectoryProvider, CXCallDirectoryExtensionContextDelegate {
    func requestFailed(for extensionContext: CXCallDirectoryExtensionContext, withError error: Error) {
        print("Errorrrrrrrrr",error)
    }
    override func beginRequest(with context: CXCallDirectoryExtensionContext) {
        context.delegate = self
        let data = UserDefaults.standard.array(forKey: "phoneNumber") as? [String]
        print(data)
        for num in data ?? []{
            let pNum :  CXCallDirectoryPhoneNumber = CXCallDirectoryPhoneNumber(Int64(num)!)
            context.addBlockingEntry(withNextSequentialPhoneNumber: pNum)

        }
        context.completeRequest()
    }
}

Upvotes: 0

Views: 139

Answers (1)

OneCommentMan
OneCommentMan

Reputation: 169

I recreated your code and UserDefaults works. Your issue will be in your CallDirectoryHandler. Add breakpoints and prints, step through each line.

This works:

class NumberList : ObservableObject{
    @Published var array:[String] = [] {
        didSet {
            print(array)
        }
    }
}


struct ContentView: View {
    @StateObject var numberList = NumberList()
    @State var number = ""
    var body: some View {
        VStack{
            HStack{
                TextField("Enter Number", text: $number)
                    .padding()
            }
            .frame(width: 200, height: 200)
            .background(Color("Button"))
            .cornerRadius(30)
            Button {
                if var data = UserDefaults.standard.array(forKey: "phoneNumber") as? [String]{
                                            data.append(number)
                                            UserDefaults.standard.set(data,forKey: "phoneNumber")
                                        }else{
                                            let ar = [number]
                                            UserDefaults.standard.set(ar,forKey: "phoneNumber")
                                        }
            } label: {
                Text("Save")
                    .foregroundColor(.white)
            }
            .background(Color.red)
            Button{
               beginRequestTest()
            } label: {
                Text("Block")
                    .font(.custom("Montserrat-Regular", size: 24))
                    .frame(width: 200, height: 200)
                    .background(Color.red)
                    .foregroundColor(.white)
                    .cornerRadius(30)
            }
        }
    }

    private func beginRequestTest() {
        let savedNumbers = UserDefaults.standard.array(forKey: "phoneNumber") as? [String]
        print(savedNumbers)
    }
}

Upvotes: 0

Related Questions