我目前正在开发一个 iOS 应用程序(使用 Swift),当两个用户中的任何一个向另一个用户发送消息时(以及当其他事件发生时),该应用程序会在两个用户之间发送推送通知。为此,我使用 Firebase Cloud Messaging,这是实际发送通知的 swift 函数:
let accessToken = "xxxx"
let urlString = "https://fcm.googleapis.com/v1/projects/\( K.FCMessaging.projectId)/messages:send"
let url = NSURL(string: urlString)!
let paramString: [String : Any] = ["message": [
"apns" : ["payload" : ["aps": ["alert": ["title": title, "body": body], "sound": "default"] as [String : Any], OrderModel.CodingKeys.orderId.rawValue: order.orderId!, OrderModel.CodingKeys.senderId.rawValue: order.senderId] as [String : Any]],
"token" : receiverToken] as [String : Any]
]
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "POST"
request.httpBody = try? JSONSerialization.data(withJSONObject:paramString)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request as URLRequest)
task.resume()
访问令牌是通过在 Mac 本地运行此 python 代码来获取的:
import argparse
import json
import requests
import google.auth.transport.requests
from google.oauth2 import service_account
PROJECT_ID = 'xxxx'
BASE_URL = 'https://fcm.googleapis.com'
FCM_ENDPOINT = 'v1/projects/' + PROJECT_ID + '/messages:send'
FCM_URL = BASE_URL + '/' + FCM_ENDPOINT
SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']
def access_token():
credentials = service_account.Credentials.from_service_account_file('/Users/...-firebase-xxxx.json', scopes=SCOPES)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
return credentials.token
现在,当我将访问令牌复制到 swift 函数中时,一切正常(即发送和接收通知),但它在一小时后过期,我必须再次运行代码并再次复制访问令牌。 由于我没有自动运行 python 函数的服务器,所以我似乎遗漏了一些东西。 您能否告诉我如何获取应用程序的永久访问令牌或在 iOS 中的两个设备之间发送推送通知的正确方法?
自从 Google 过渡到 FCM v1 以来,他们现在强制使用 OAuth2,这与 FCM(旧版)不同。 OAuth2 通过生成临时令牌来发挥作用,临时令牌可作为针对各种攻击(例如中间人攻击)的预防措施。因此,不幸的是,不可能使用永久代码。
正如评论中提到的,我认为最直接的方法是利用 Google Cloud Functions。这种方法可以最大程度地减少本地应用程序的工作负载。然而,不幸的是,您在自己的国家/地区无法访问。