根据 APNS 的文档,APNS 会在设备最后一次连接 APNS 成功后的 30 天后将设备标记为不活跃(inactive)。因此,如果设备在 30 天内与 APNS 成功连接,APNS 就会认为该设备仍然是活跃的(active)。如果设备在 30 天内没有与 APNS 成功连接,则 APNS 会尝试再次连接该设备,如果连接仍然失败,则 APNS 会将该设备标记为不活跃。
以下是一个示例代码,用于检查设备是否被 APNS 标记为不活跃:
let deviceToken = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
guard let apnsExpireDate = apnsExpirationDate(for: deviceToken) else {
// Device is inactive, handle accordingly
return
}
let now = Date()
if now > apnsExpireDate {
// Device is inactive, handle accordingly
} else {
// Device is still active
}
private func apnsExpirationDate(for deviceToken: String) -> Date? {
let apnsExpireTimeInterval: TimeInterval = 30 * 24 * 60 * 60 // 30 days in seconds
let apnsExpireTimeStamp = UInt32(Date().timeIntervalSince1970 - apnsExpireTimeInterval)
let apnsExpireByteValue = withUnsafeBytes(of: apnsExpireTimeStamp) { Data($0) }.suffix(4)
let deviceTokenData = Data(hexEncoded: deviceToken)
var apnsDeviceToken = Data(repeating: 0, count: 32)
apnsDeviceToken.append(deviceTokenData)
apnsDeviceToken.append(apnsExpireByteValue)
return Date(timeIntervalSince1970: TimeInterval(bigEndian: apnsExpireTimeStamp))
}
extension Data {
init?(hexEncoded string: S) {
guard let regex = try? NSRegularExpression(pattern: "^[0-9a-f]{2}$", options: .caseInsensitive) else {
return nil
}
guard regex.matches(in: String(string), options: [], range: NSRange(location: 0, length: string.utf16.count)).count == string.utf16.count / 2 else {
return nil
}
self.init(capacity: string.utf16.count / 2)
var iterator = string.utf16.makeIterator()
while let high = iterator.next(), let low = iterator.next() {