サイレント プッシュ通知を 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
};