Silent pu sh не запускает выполнение кода - PullRequest
0 голосов
/ 28 марта 2020

Я отправляю молчаливое уведомление pu sh каждые 30 минут, я хочу выполнить код, когда на устройство приходит молчаливое уведомление. Но после многих попыток я не могу получить результат. Когда я тестирую его на своем устройстве (с версией из Xcode), все работает, после загрузки его в TestFlight и загрузки версии из TestFlight я не могу вывести приложение из фона или вывести его из завершенного состояния. Просто этот код выполняется после запуска приложения или приложение выходит на передний план.

Согласно документации Apple Я должен быть в состоянии разбудить приложение и выполнить 30 секунд кода. Я подтвердил, что автоматическое уведомление успешно доставлено. Я что-то упустил?

AppDelegate.swift

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if let messageID = userInfo[gcmMessageIDKey] {
        print("Message ID: \(messageID)")
    }

    guard (userInfo["aps"] as? [String?: Any]) != nil else {
        Analytics.logEvent("fetch_failed", parameters: nil)
        completionHandler(.failed)
        return
    }

    let login = UserDefaults.standard.value(forKey: "username") as? String
    let password = UserDefaults.standard.value(forKey: "password") as? String

    if login != nil && password != nil {
        let session = URLSession.shared
        let url = URL(string: "https://example.com")!
        let body_values = Data(("credentials...").utf8)
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.setValue("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36", forHTTPHeaderField: "User-Agent")
        request.httpBody = body_values

        let loadDataTask = session.dataTask(with: request) { data, response, error in
            if let httpResponse = response as? HTTPURLResponse {
                print(httpResponse.statusCode)
                if httpResponse.statusCode == 200 {
                    if let data = data, let dataString = String(data: data, encoding: .utf8) {
                        let htmlparser: HTMLParser = HTMLParser()
                        let numberOfEmails = htmlparser.getXPathvalue(xPath: "/html/body/div[1]/div[3]/div[3]/a[1]", fromHtml: dataString)
                        self.setNotification(title: "New emails!", body: "Count of new emails: \(numberOfEmails)")
                        completionHandler(.newData)
                    }
                    else {
                        completionHandler(.failed)
                    }
                }
                else {
                    completionHandler(.failed)
                }
            }
            else {
                completionHandler(.failed)
            }
        }
        loadDataTask.resume()
    }
    else {
        completionHandler(.failed)
    }
}

PushNotification. js

var message = {
  notification: {
  },
  apns: {
     headers: {
        'apns-priority' : '5',
        'apns-push-type' : 'background'
     },
     payload: {
         aps: {
            'content-available' : 1
         }
     }
   },
   topic: topic
};

1 Ответ

0 голосов
/ 28 марта 2020

Есть две основные вещи, на которые вы должны обратить внимание, которые обсуждаются в этом обсуждении на яблочном форуме !. Во-первых, приложение не может быть прервано, иначе оно не запустится, оно должно быть передним или задним планом. И еще одно, что вам нужно включить фоновый режим в Info.plist, чтобы он работал. Кроме того, существуют ситуации, когда система просто не обновит sh ваше приложение, и самая большая гарантия, которую вы получите, - это только если пользователь щелкнет уведомление, полученное вашим приложением, в противном случае из-за некоторых проблем с безопасностью оно может не работать.

...