Device token的获得和改变详解

本文深入探讨iOS设备token的生命周期管理,包括token在系统重装、数据恢复后的变动,以及如何在应用启动时获取最新token进行比较。重点介绍了token存储方式、更新策略、与推送服务交互的方法,以及在不同场景下处理token变更的两种方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Device token for an iPhone device生成之后就永远不变吗?

不是,if a device is wiped (应该是重装系统), it will get a new device token. 

官方网站是这样写的: If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes


正是因为device有可能改变,所以建议在app start时(即在didFinishLaunchingWithOptions  里)调用registerForRemoteNotificationTypes来获取device token以检查device token是否改变,如果改变了就应该把新token传给push provider。(官方描述:An application should register every time it launches and give its provider the current token)

device token应该存储在NSUserDefaults来达到新旧比较的目的

那么旧device token在push provider对应的record怎么办?

方案1:把旧device token send to provider and request delete record

方案2:使用apns feedback service。

方案2可能更好些,因为总是需要使用apns feedback service来处理用户在device里删除app的情况。


调用registerForRemoteNotificationTypes方法后,成功注册后,APNS就会返回一个device token,然后回调delegate methoddidRegisterForRemoteNotificationsWithDeviceToken, 如果注册失败,则回调delegate method didFailToRegisterForRemoteNotificationsWithError。

注意:

* 在第一次调用registerForRemoteNotificationTypes方法没有联网,则既不会调用didRegisterForRemoteNotificationsWithDeviceToken,也不会调用didFailToRegisterForRemoteNotificationsWithError

*第一次调用registerForRemoteNotificationTypes注册成功后,之后即使没有联网,再调用registerForRemoteNotificationTypes时都会以最上一次的device token作为参数回调didRegisterForRemoteNotificationsWithDeviceToken方法。

(官方描述) If your application has previously registered, calling registerForRemoteNotificationTypes: results in the operating system passing the device token to the delegate immediately without incurring additional overhead.


上述东东参考官方网站关于Registering for Remote Notifications的讲解

### BERT模型的预训练方法 BERT(Bidirectional Encoder Representations from Transformers)采用了一种独特的无监督学习方式来获取语言表示。在预训练阶段,主要依赖两个任务:掩码语言建模(Masked Language Modeling, MLM)下一句预测(Next Sentence Prediction, NSP)。通过这两个任务的学习,使得模型能够理解单词之间的关系以及句子间的逻辑联系[^2]。 #### 掩码语言建模 (MLM) 为了实现双向编码器结构的有效训练,在输入序列中随机选取一部分token并将其替换为特殊标记`[MASK]`,随后让网络去预测这些被掩盖掉的真实词汇是什么。这种做法打破了传统单向RNN/LSTM只能从前向后或从后向前处理文本信息的方式局限性,从而提高了上下文感知能力[^1]。 ```python import torch from transformers import BertTokenizer, BertForMaskedLM tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForMaskedLM.from_pretrained('bert-base-uncased') text = "Here is some text to encode [MASK]." inputs = tokenizer(text, return_tensors="pt") with torch.no_grad(): outputs = model(**inputs) logits = outputs.logits predicted_token_id = logits.argmax(dim=-1).item() print(tokenizer.decode(predicted_token_id)) ``` #### 下一句预测 (NSP) 除了关注单句内部的信息外,为了让BERT更好地捕捉文档级别的语义关联,还引入了一个二分类子任务——判断给定的一对连续句子B是否确实紧接在前一句A之后出现。这有助于增强跨句子间长期依赖性的表达力。 --- ### BERT模型的微调技巧 当完成大规模通用领域上的预训练后,可以针对具体应用场景下的目标任务进一步调整参数权重,即所谓的“微调”。此过程中会保留大部分原有架构不变,仅需添加少量新组件用于解决特定类型的NLP问题,比如情感分析、问答系统等。整个流程涉及以下几个方面: - **数据准备**:收集整理好标注过的样本集作为后续优化的基础素材; - **模型定制化扩展**:依据业务需求设计附加模块连接至原生Transformer之上形成完整的解决方案框架; - **超参调节**:合理设置批量大小(batch size)、初始学习率(learning rate)等因素影响最终效果的关键配置项; 值得注意的是,在执行上述操作之前应当先加载官方发布的预训练版本文件,并确保环境搭建完毕以便顺利开展实验工作[^3]。 ```python from transformers import BertForSequenceClassification, Trainer, TrainingArguments training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=8, per_device_eval_batch_size=8, warmup_steps=500, weight_decay=0.01, logging_dir='./logs', ) model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=test_dataset ) trainer.train() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值