VoIP Push от Amazon SNS - PullRequest
       14

VoIP Push от Amazon SNS

2 голосов
/ 15 октября 2019

Я пытаюсь отправить VoIP push-запрос от Amazon SNS, есть функция firebase, которая создает ARN при получении VoIP_token, и она заставляет SNS push-запрос VoIP. теперь есть одна проблема, с которой я сталкиваюсь.

=> push идет внутри полезной нагрузки didReceiveIncomingPushWith, но внутри этого метода делегата я пытаюсь обновить значение firebase, как вы можете видеть в коде, это также работает, androidотправляет push через 5 минут из SNS, который был сконфигурирован в функции firebase, но проблема в том, что push иногда приходит, а иногда нет, в разрабатываемой версии он работает нормально, но когда я выполняю тестовый полет, он часто работает с расширением

AppDelegate: PKPushRegistryDelegate {

@available(iOS 8.0, *)
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
    if #available(iOS 10.0, *) {
        Timer.scheduledTimer(withTimeInterval: 30, repeats: true) {_ in
            self.myMethod()
        }
    }
    else {
        Timer.scheduledTimer(timeInterval: 30, target: self, selector: #selector(self.myMethod), userInfo: nil, repeats: true)
    }

    let token = credentials.token.map { String(format: "%02x", $0) }.joined()

    voipTokenLogin = token
    voip_Token = token
    UserDefaults.standard.set(voipTokenLogin, forKey: "voip_Push_From_Amazon_SNS")
    var objRef : DatabaseReference!
    _ = String()

    if MyCurrentUSERID != "" && isUserLoggedIn {
        objRef = Database.database().reference().child("user").child(MyCurrentUSERID)
        let battery = UIDevice.current.batteryLevel * 100
        let Intbattery = Int(battery)
        let dict = [
            "isOnline" : true,
            "isGps" : true,
            "voip_token": voip_Token,
            "Battery" : Intbattery,
            "lastSeen" : Int(Date().millisecondsSince1970),
            "timeStamp" : Date().millisecondsSince1970
            ] as [String : Any]
        objRef.updateChildValues(dict)
    }
    else{
    }
}

@available(iOS 8.0, *)

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void){
    var arrTemp = [AnyHashable: Any]()
    arrTemp = payload.dictionaryPayload
    let _ : Dictionary <String, AnyObject> = arrTemp["aps"] as! Dictionary<String, AnyObject>
    if isUserHasLoggedInWithApp // Check this flag then only proceed
    {
        if UIApplication.shared.applicationState == UIApplicationState.background || UIApplication.shared.applicationState == UIApplicationState.inactive
        {
            if checkForIncomingCall
            {
                Locator.currentPosition(accuracy: .city, onSuccess: { (loc) -> (Void) in
                    isUpdatedUsingSilentPush = true

                    if self.isUserLoggedIn{
                        if !isUploadingRecentLocation {
                            if !self.sendOneUpdate{
                    self.sendLocationToFirebase(manager: Locator, Location: loc)
                            }
                        }
                    }

                }) { (err, loct) -> (Void) in
                    print(err)
                    print(loct as Any)
                }
                //
                var objRef : DatabaseReference!
                if MyCurrentUSERID != "" {
                    objRef = Database.database().reference().child("user").child(MyCurrentUSERID)
                    let dict = [
                        "timeStamp" : Date().millisecondsSince1970,
                        "isOnline" : true,
                        "isGps" : true,
                        "lastSeen" : Int(Date().millisecondsSince1970)
                        ] as [String : Any]

                    objRef.updateChildValues(dict)

                      var strTitle : String = dict["alertTitle"] as? String ?? "\(MyCurrentUSERID)"
                    let strBody : String = dict["alertBody"] as? String ?? "push arrived successfully"
                    strTitle = strTitle + "\n" + strBody
                    self.myMethod()
                    let notificationIncomingCall = UILocalNotification()
                    notificationIncomingCall.fireDate = Date(timeIntervalSinceNow: 1)
                   notificationIncomingCall.alertBody =  strTitle
                    notificationIncomingCall.alertAction = "Open"
                    notificationIncomingCall.soundName = "SoundFile.mp3"
                    notificationIncomingCall.category = dict["category"] as? String ?? ""
                    //"As per payload you receive"
                    notificationIncomingCall.userInfo = ["key1": "Value1"  ,"key2": "Value2" ]
                UIApplication.shared.scheduleLocalNotification(notificationIncomingCall)
                }

            }
            else
            {
                //  something else
            }

        }
    }
    completion()
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Я просмотрел ваш код и думаю, что вам нужно уточнить VOIP.

Пока вы получаете VOIP Push, ваше приложение стало активным в течение максимум 30 секунд.

Я заметил, что вы выполнили какую-то тяжелую операцию, когда получили Push в устройство iOS,Я думаю, что это основная проблема в вашем коде.

Для решения этой проблемы

Уменьшите уровень точности GPS.

Удалите или оптимизируйте свой код (Просто сохраняйте или обновляйте толькотребуемые данные для базы данных избегают неиспользуемой операции)

Еще одна вещь, которую я хочу уточнить для Push иногда приходит, а иногда нет

  • Если вы пытались отправить несколькоНажмите на то же устройство, а затем некоторые нажатия будут пропущены.

Спасибо, что приняли мой ответ

0 голосов
/ 16 октября 2019

Используете ли вы Xcode 11 и iOS13? Apple внесла значительные изменения в push-уведомления VoIP. При использовании VoIP вы должны сообщать о «входящем звонке» в CallKit.

В iOS 13.0 и более поздних версиях, если вам не удастся сообщить о звонке в CallKit, система завершит работу вашего приложения. Неудачный отчет о вызовах может привести к тому, что система прекратит доставку push-уведомлений VoIP в ваше приложение. Если вы хотите инициировать вызов VoIP без использования CallKit, зарегистрируйтесь для push-уведомлений, используя платформу UserNotifications вместо PushKit.

https://developer.apple.com/documentation/pushkit/pkpushregistrydelegate/2875784-pushregistry

...