现在,我通过didRegisterForRemoteNotificationsWithDeviceToken获取设备令牌。 但是,我需要在用户登录后稍后在应用程序中使用设备令牌。

以后如何在应用程序中的其他位置访问deviceToken,如果无法访问,如何/在何处将其存储在didRegisterForRemoteNotificationsWithDeviceToken以便以后可以检索它?

#1楼 票数:3

最好将keychain用于此类数据。

将此类函子添加到您的项目中

import UIKit
import Security
class Keychain {

  class func save(key: String, data: NSData) -> Bool {
    let query = [
        kSecClass as String       : kSecClassGenericPassword as String,
        kSecAttrAccount as String : key,
        kSecValueData as String   : data ]

    SecItemDelete(query as CFDictionaryRef)

    let status: OSStatus = SecItemAdd(query as CFDictionaryRef, nil)

    return status == noErr
  }

  class func load(key: String) -> NSData? {
    let query = [
        kSecClass as String       : kSecClassGenericPassword,
        kSecAttrAccount as String : key,
        kSecReturnData as String  : kCFBooleanTrue,
        kSecMatchLimit as String  : kSecMatchLimitOne ]

    var dataTypeRef :Unmanaged<AnyObject>?

    let status: OSStatus = SecItemCopyMatching(query, &dataTypeRef)

    if status == noErr {
        return (dataTypeRef!.takeRetainedValue() as NSData)
    } else {
        return nil
    }
  }

  class func delete(key: String) -> Bool {
    let query = [
        kSecClass as String       : kSecClassGenericPassword,
        kSecAttrAccount as String : key ]

    let status: OSStatus = SecItemDelete(query as CFDictionaryRef)
    return status == noErr
  }

  class func clear() -> Bool {
    let query = [ kSecClass as String : kSecClassGenericPassword ]
    let status: OSStatus = SecItemDelete(query as CFDictionaryRef)   
    return status == noErr
  }
}

你这样使用它

要存储(pass是您的情况下的字符串,令牌)

if let data = pass.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion: false)  {
  let saveSuccess = Keychain.save("Password", data: data)
}

装载

data = Keychain.load("Password") 
var pass =NSString(data: data, encoding: UInt())

#2楼 票数:2 已采纳

最简单的方法是使用NSUserDefaults

保存:

NSUserDefaults * ud = [NSUserDefaults standardUserDefaults];
[ud setObject:myPushToken forKey:@"currentPushToken"];
[ud synchronize];

恢复:

NSString * currentPushToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"currentPushToken"];

  ask by chris P translate from so

未解决问题?本站智能推荐:

1回复

从APNS收到的设备令牌的寿命

当我们向APNS注册设备以进行推送通知时,我们会收到设备令牌。 APNS上的此令牌有任何有效期吗? 有没有时间表,之后APNS会丢弃该令牌?
2回复

这是保持APNS设备令牌更新的标准方法吗?

我想确保我的服务器始终具有最新的APNS设备令牌,该令牌可以在特定情况下更改。 我应该将它保存到钥匙串,并在启动时检查它是否不同,然后如果是这样更新服务器? 这是最好的方式吗?
1回复

iOS通知

我希望我的应用程序为每个用户保存用户名和密码并使用它登录,除非它被更改为其他用户。 我问自己如何将推送通知发送到相关设备? 每次更改用户名/密码或重新输入用户名/密码时,我需要将哪些数据与用户名和密码一起发送?
1回复

在iOS中指定默认通知样式

可可应用程序是Mountain Lion的NSUserNotificationAlertStyle ,它支持Info.plist中的NSUserNotificationAlertStyle键,该键允许开发人员为其通知指定默认样式。 显然,用户可以更改此设置,但是允许开发人员提供合理的默认值是
1回复

如何在iOS上关闭特定的通知类型

在我的应用程序的第一个版本中,我在以下位置进行了注册: 这是我的方法: 现在,在我的应用的第二个版本中,我决定通过再次注册通知来放弃徽章通知: 我原本希望从现在起将徽章通知关闭。 当我进入设置菜单并检查我的应用程序的通知设置时。 徽章的拨动开关不见了,但是徽章编号仍在更新。
1回复

推送以唤醒后台的iOS8应用程序未获取任何数据

iOS 8中有一个新功能:使用推送通知唤醒应用程序,这还使应用程序可以在后台刷新数据。 如何使用此功能? 推送通知的键“ content-available”的值为1。 但是,如果应用程序尚未在后台运行,则不会接收到任何数据。 为什么不?
2回复

如何将推送通知发送到用户的设备,而不仅仅是我自己的设备

我想问一下发出“推送通知”需要做些什么,我做了很多事情,然后成功地将Mac上的推送发送到了组织者中存在的设备(使用PushMeBaby源代码)。 但我也对将其用于其他设备(所有人都拥有我的应用程序)以及如何获得其令牌设备编号感到困惑。 大标题告诉我我需要什么。 谢谢
1回复

在iOS8中注册推送通知时如何访问deviceToken?

我应该以说我已经检查过这个和这个作为开头,但是这两个被接受的答案都没有解决我的问题。 我正在使用第三方推送通知服务,并且他们的registerDevice方法需要一个deviceToken ,例如由application:didRegisterForRemoteNotificationsWi