关于如何将APN的设备令牌链接到注册用户的建议(通过phonegap或UIWebView)

2024-04-08

类似的问题在这里:jQueryMobile、Phonegap 和设备令牌 - iOS https://stackoverflow.com/questions/9022983/jquerymobile-phonegap-and-device-token-ios

场景是,我有这个基于 PhoneGap Web 的应用程序,本机 iOS 帮助我在 APN 上注册设备,并且我在服务器数据库中收到了设备令牌。

问题一:如何使用 PhoneGap 将注册用户(通过 UIWebView)关联到此设备令牌?

  • 我现在想到的是编写一个自定义插件并在用户注册期间传递设备令牌。还有更好的选择吗?

问题2:由于 device_token 可能会不时更改,我应该如何将此用户重新链接到此 device_token?

  • 也许每当用户登录时,我都会执行一个 window.plugins 。插件名称.getDeviceToken 并同步吗?
  • {user_id:123, old_device_token: 'xxxx..', new_device_token: 'xxx...'}?

仅供参考,此应用程序是为一个活动而构建的,客户已请求在此移动应用程序上进行人与人之间的消息传递。你如何推动新消息通知当他收到朋友的消息时向“John Doe”发送消息? - 问题是如何将“John Doe”链接到特定的 device_token?

这不能太具体于 iOS,因为该应用程序也必须部署在 Android 上 (C2DM)。

欢迎任何帮助!

编辑:可能的解决方案?

不懈的研究提出了这种可能的解决方案:

  1. [Native] 应用程序已启动 - APN 注册已启动并收到 device_token
  2. [Native] 将此设备令牌存储到本地存储(CoreData/SqlLite 或属性列表?)并将其发送到服务器以进行设备令牌注册
  3. [WebView] 每当用户登录或注册时,都会通过 PhoneGap 查询此 device_token,进行哈希处理并发送到服务器进行登录、比较和链接。

任何不可预见的情况都会出现问题吗?

编辑:回答

我在答案中发布了完整的工作解决方案。在这里查看:https://stackoverflow.com/a/9628592/534862 https://stackoverflow.com/a/9628592/534862


为了完整起见,这是我使用@TDeBailleul 解决方案后的解决方案。移植到科尔多瓦。 (仅在 iOS 上测试。在完成 Android 版本后,我将为此发布一个插件:

环境

  • Cordova 1.5.0(以前称为 PhoneGap)
  • Xcode 4.3.1
  • iOS 5.1
  • Mac OS X 10.7.3
  • 不要使用自动引用计数 (ARC) 以避免编译错误
  • 经过这个超长的教程 http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12准备好您的推送通知证书

工作流程

  1. [Native] 应用程序已启动 - APN 注册已启动并且在服务器端接收到 device_token
  2. [Native] 应用程序将令牌存储在AppDelegate,要获取令牌,请使用PushToken在下面的代码中
  3. [WebView] 每当用户登录或注册时,令牌将通过 Cordova(以前称为 PhoneGap)插件调用、散列并发送到服务器以进行登录、将用户匹配并链接到特定设备。

下面是我完整的工作代码,用于本地拉取令牌。服务器部分只不过是将帐户链接到设备。您应该知道如何通过您最喜欢的服务器端应用程序来完成此操作。

AppDelegate.h

@interface AppDelegate : NSObject < UIApplicationDelegate, UIWebViewDelegate, CDVCommandDelegate > {
    ...
    NSString* token;
    ...
}
...
...
...
@property (retain, nonatomic) NSString* token;

AppDelegate.m

注意:我是 Obj-C 新手,我也尝试将令牌发布到我的服务器。如果不需要发布机制,请保留前 5 行(直到'self.token = dt) 在里面didRegisterForRemoteNotificationsWithDeviceToken

...

@synthesize token;

...

- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{    
...
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
    (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"Did finish launching with device token %@", deviceToken);
    NSString *dt = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    dt = [dt stringByReplacingOccurrencesOfString:@" " withString:@""];

    self.token = dt;

    NSString *dv = [[UIDevice currentDevice] systemVersion];
    NSString *dn = [[UIDevice currentDevice] systemName];
    NSString *nick = [[UIDevice currentDevice] name];
    NSString *model = [[UIDevice currentDevice] model];
    NSString *uniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

    NSMutableString *postData = [NSMutableString stringWithString: @"&deviceToken="];

    [postData appendString:dt];
    [postData appendFormat:@"&uniqueIdentifier=%@&application_uuid=5ade8400-e29c-41d4-a716-3641972a2ec6", uniqueIdentifier];
    [postData appendFormat:@"&source=ios&name=%@&model=%@&systemName=%@&systemVersion=%@", nick, model, dn, dv];

    NSString* escapedURLString = [postData stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    @try {
        NSData *postData = [escapedURLString dataUsingEncoding:NSUTF8StringEncoding];
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                        initWithURL: [NSURL URLWithString:@"{YOUR URL TO POST TOKEN TO SERVER}"]
                                        cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: 180];
        NSString *postLength = [[NSString alloc] initWithFormat: @"%d", [postData length]];
        [request setHTTPMethod:@"POST"];
        [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        [request setHTTPBody:postData];


        NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        if (conn) {
            //??
        }else{
            //??
        }
    }
    @catch (NSException *exception) {
        NSLog(@"Exception %@", exception);
    }
}
...

PushToken.h

#import <Foundation/Foundation.h>
#import <CORDOVA/CDVPlugin.h>

@interface PushToken : CDVPlugin {
    NSString* callbackID;
}

@property (nonatomic, copy) NSString* callbackID;

- (void) getToken:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;

@end

PushToken.m

#import "PushToken.h"
#import "AppDelegate.h"

@implementation PushToken

@synthesize callbackID;

- (void)getToken:(NSMutableArray *)arguments withDict:(NSMutableDictionary *)options {

    NSLog(@"Did called getToken");
    self.callbackID = [arguments pop];

    NSString *token = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).token;
    CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[token stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    if (token.length != 0) {
        [self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]];
    }else{
        [self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]];
    }
}

@end

PushToken.js

var PushToken = {
    /**
    * Get token from the device
    * @param {array} types - By default is ['getToken']
    * @param {function} success Success callback, with token
    * @param {function} fail Failure callback, with null
    */
    getToken: function(types, success, fail) {
        return Cordova.exec(success, fail, "PushToken", "getToken", types);
    },

    /**
    * For the sake of iOS, we need an install function
    */
    install: function() {
        window.plugins = window.plugins || {};
        window.plugins.PushToken = PushToken;
    }
};

/**
* For the rest of the devices
*/
window.plugins = window.plugins || {};
window.plugins.PushToken = PushToken;

Usage

document.addEventListener('deviceready', function() {
    if (typeof PushToken == 'object') {
        PushToken.install();
    }

    PushToken.getToken(['getToken'], function(token) {
        callback(token);
    }, function() {
        callback(null);
    });
});

并且您应该能够从 Javascript 端获取令牌;)

玩得开心!

Cheers

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于如何将APN的设备令牌链接到注册用户的建议(通过phonegap或UIWebView) 的相关文章

  • CoreBluetooth广告检测时间

    这个问题早在10月份就已经讨论过here https stackoverflow com questions 12866551 corebluetooth connection setup time varies quite a bit 1
  • iOS7 XIB 问题。顶部和底部的空白

    我有一个正在设置 ImageView 的视图 自动布局已选中 预览中看起来不错 但当应用程序实际在模拟器上运行时 仅在 iPhone 视网膜 4 英寸模拟器中 顶部和底部显示空白 3 5寸的看起来还不错 使用 iOS7 和 XCODE 5
  • NSData 不接受有效的 base64 编码字符串

    我正在 iOS 7 客户端实现 JSON Web Token 身份验证 效果很好 我的应用程序接收令牌 并可以使用它们对我的服务器进行经过身份验证的调用 现在 我希望我的客户端代码检查令牌的过期日期 以便它知道何时重新进行身份验证 检查 J
  • 使用 PhoneGap + iPhone 上传文件

    据我所知 PhoneGap 应用程序大部分 如果不是全部 都是 HTML5 CSS JavaScript iPhone 本身不提供上传文件的控件 PhoneGap是否提供任何允许用户上传文件的机制 图片 视频 以 iPhone 为例 我知道
  • 如何检查 iOS 分发配置文件是否启用了推送通知?

    我有一个应用程序应该启用推送通知 但由于某种原因没有启用它们 我见过其他人下载并安装了该应用程序 但它甚至没有提示他们授予发送推送通知的权限 正如预期的那样 此应用程序不会出现在其 设置 gt 通知 中 但是 在我的 iPad 上 我能够从
  • 错误 ITMS-90207 Apple Store 提交

    当我在模拟器或设备上运行我的应用程序时 用于调试和发布构建配置 它可以完美运行 但是当我尝试将我的应用程序提交到 Apple Store 时 出现以下错误 错误 ITMS 90207 捆绑包无效 APPNAME app 处的捆绑包确实 不包
  • 图表的集合视图呈现:图表 cocoapods 的“没有可用的图表数据”

    我正在编码GraphViewController包含图形数组的类 类型为LineChartView 但是 当我尝试以集合视图的单元格格式显示这些图形时 使用调用的类GraphCell the LineChartView对象似乎没有加载任何数
  • 在横向模式下向 UIScrollView 添加子视图

    我有一个以横向模式启动的视图控制器 其中有一个 UIScrollView 我尝试创建子视图并将它们添加到 UIScrollView 但视图的框架大小都是纵向大小 这是我的代码 void viewDidLoad super viewDidLo
  • 如何获取核心数据中现有实体(表)的列表

    如何获取核心数据中特定模式 托管对象模型 的现有实体 表 列表 我刚刚开始实施核心数据概念并坚持这些要点 就像是 SELECT COUNT FROM information schema tables WHERE table schema
  • Xcode 6 仪器冻结

    在 Xcode 6 Instruments 中分析我的 iOS 8 应用程序将运行该应用程序约 5 秒 然后冻结 此后探查器仍将运行 但应用程序已冻结且无法使用 发生在设备和模拟器上 无论我使用哪个分析器 计时器 泄漏等 从调试器或临时构建
  • 如何在不使用 viewWillDisappear 的情况下使 NSTimer 无效/取消初始化?

    var faderTimer NSTimer override func viewDidLoad super viewDidLoad self faderTimer NSTimer scheduledTimerWithTimeInterva
  • 什么是已弃用的推送转场? (iOS 8)[重复]

    这个问题在这里已经有答案了 我不知道在这种情况下已弃用意味着什么 我是编程新手 正在 Xcode 6 中制作我的前几个应用程序 今天我正在制作一个待办事项列表应用程序 当连接到用户可以输入新待办事项以添加到主表的场景时 我被邀请使用推送转场
  • 使用 AVMutableVideoCompositionLayerInstruction 旋转视频

    我正在 iPhone 4 上使用前置摄像头拍摄视频 并将视频与其他一些媒体资源结合起来 我希望该视频为纵向 所有视频的默认方向都是横向 在某些情况下 您必须手动管理 我正在使用 AVFoundation 特别是 AVAssetExportS
  • 在 iOS 上的 OpenGL ES 2.0 中创建 16 位亮度纹理

    我的文件中有 16 位数据 我正在尝试将其加载到 iOS 上的 OpenGL 亮度纹理中 如果我手动将 16 位值重新调整为 8 位 我可以按如下方式加载和显示数据 glTexImage2D GL TEXTURE 2D 0 GL LUMIN
  • 将 C 转换为 Swift:向 UITextField 添加放大镜图标

    如何在左侧添加一个放大镜图标UITextField 我找到了类似问题的答案here https stackoverflow com questions 11811705 where can i get the magnifying glas
  • 为什么在尝试编译此代码时会收到错误“错误:未知类型名称'虚拟'”?

    Code struct IRenderingEngine virtual void Initialize int width int height 0 virtual void Render const 0 virtual void Upd
  • 如何检测 UISwipeGestureRecognizer 的结束?

    来自苹果文档 滑动是一种离散手势 因此每个手势仅发送一次关联的操作消息 void touchesEnded NSSet touches withEvent UIEvent event 当我使用 UISwipeGestureRecognize
  • Swift 3:如何访问48字节CFData中matrix_float3x3的值?

    我正在尝试访问内在矩阵answer https stackoverflow com a 48159895 9296667 通过运行下面的命令 我能够得到一个 48 字节的任意对象 https developer apple com docu
  • 如何正确创建迦太基 cartfile?

    我正在研究购物车文件 迫不及待地想 简单地创建一个购物车文件 就像所有说明所说的那样 只是 如何 简单地 创建一个 Cartfile 我创建了一个纯文本文档 将其命名为 cartfile 并在其中复制了一些依赖项 Ran carthage
  • 使用 NSString 进行 UTF8 解码

    我是 Objective C 新手 尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http developer apple com library mac documentation Coc

随机推荐

  • Mendeley API - 如何使用 JavaScript SDK - 隐式流身份验证

    我希望您不会介意我提出问题 因为我不是程序员 需要 傻瓜式 解释 虽然我可以使用基本的 JavaScript 但我从未使用过 API 这就是我想做的 我在硬盘上制作了一个 HTML 页面 我最终希望将其与 PhoneGap 之类的东西打包到
  • 在 iCarouselTypeRotary 视图中隐藏背面图像

    我已将图像设置为轮播 https github com nicklockwood iCarousel 当我滚动轮播时 它会显示正面和背面的图像 我不想在后面显示图像 请帮忙 谢谢 您应该实现委托 CGFloat carousel iCaro
  • HTML 输入值更改

    我有一个 PHP 更新页面 其中显示一个包含数据库中的值的文本字段 就是这样 并且正在工作
  • 按最新回复时间排列论坛帖子

    在你喊之前ORDER BY id 情况就大不相同了 我被要求建立的论坛是一个留言板论坛 未注册的用户可以在其中回复和发帖 对帖子的回复缩进在被回复的帖子下方 当然 这都是无序列表中的 一个简短的例子 主帖 回复帖子 对回复的回复 另一个回复
  • jupyter 笔记本显示 matplotlib 错误键“text.kerning_factor”的错误消息

    import pandas as pd import numpy as np import matplotlib pyplot as plt 第 4 行的错误键 text kerning factor home samyak anacond
  • iOS UICollectionView 原型单元格大小属性被忽略

    我正在使用带有两个原型单元的 UICollectionView 原型单元具有不同的宽度并包含不同的控件 图像视图和网页视图 我肯定会为给定索引返回正确的原型单元格 所有单元格都显示正确的内容 但原型单元格大小将被忽略 而会使用集合视图的项目
  • Android App ID前缀问题

    我正在构建一个适用于 Android 的 Adob e Air 应用程序 但遇到了一个大问题 我使用旧的 Flash Air 扩展向 Android 市场发布了一个应用程序 该扩展保存了带有前缀 app 的应用程序 ID 现在我已经升级了扩
  • 可以忽略 ReactiveObject 的初始值吗?

    使用 ReactiveUI 是否可以忽略给定 ReactiveObject 的初始值 例如 我初始化了一个 ViewModel 然后我WhenAnyValue在视图模型上 我立即收到通知 该值是null为我选择的财产 是的我可以 Where
  • JVM 内存类型

    我正在做一个监控项目 我们有监控软件正在运行并从服务器重新收集指标 一切工作正常 但我们需要一些有关 JVM 内存使用情况详细信息 我们有一些具有不同内存类型的列 我们需要知道这些是什么 Heap Non Heap Usage Peak C
  • Kafka 快速入门:我需要哪些依赖项?

    我正在研究卡夫卡快速入门 http kafka apache org 07 quickstart html http kafka apache org 07 quickstart html 以及基本的消费者组示例 https cwiki a
  • NumPy 数据类型比较

    我正在比较两个不同数组的数据类型 以选择适合组合两者的一个 我很高兴发现我可以执行比较操作 但在这个过程中发现了以下奇怪的行为 In 1 numpy int16 gt numpy float32 Out 1 True In 2 numpy
  • 通话状态

    我们如何以编程方式知道我正在拨打的电话已在另一方收到 我知道电话有一些状态 如空闲 摘机和振铃 我希望收到通知 我正在拨打的电话已收到 对方已断开连接或对方无人接听 请建议 尽管 Android 电话管理器中只有三种可用状态 但很容易识别电
  • Jupyter 实验室没有打印 sklearn 模型的所有参数

    我已经使用 jupyter lab 几个月了 每次运行 sklearn 模型时 输出都是这样的 from sklearn tree import DecisionTreeClassifier clf DecisionTreeClassifi
  • HTML 选择在 Android 中不起作用

    我有一个超级基本的 HTML 选择表单字段
  • Android Studio 在 i7 处理器上使用 100% CPU 进行项目重建

    我的 Windows 7 机器配备四核 i7 处理器 当我重建项目时 平均需要 25 秒 当我启动应用程序时 平均需要 36 秒 在应用程序上传到设备之前 我的项目的 src 文件夹中有 588 个文件 其中包括我的所有 java 和 xm
  • PSModulePath 环境属性如何组成?

    这个问题与我的另一篇文章有 关 同时使用桌面 Powershell 5 1 和 Powershell Core 6 1 https stackoverflow com questions 56875328 using both deskto
  • 如何解析来自 .net webservice 的 diffgram 任何类型响应

    我从任何类型格式的 net Web 服务收到以下响应 我需要解析此格式并读取格式中提供的数据值 例如 RemMessage 和 INVM ID 我无法解析此格式并获取适当的值 java代码是 public class WebService
  • 运行 AWS Golang Lambda 时出现 exec 格式错误

    我有一个 go 应用程序 结构如下 cmd reports main go main go 导入internal reports包并有一个函数 main 它将调用委托给aws lambda go lambda Start 功能 代码是运行命
  • NoClassDefFoundError: javax/validation/Validation 即使在 POM 中的validation-api 1.1.0.Final 也会发生

    看起来很奇怪 我有异常跟踪 org apache cxf interceptor Fault at org mule module cxf MuleInvoker invoke MuleInvoker java 117 at org mul
  • 关于如何将APN的设备令牌链接到注册用户的建议(通过phonegap或UIWebView)

    类似的问题在这里 jQueryMobile Phonegap 和设备令牌 iOS https stackoverflow com questions 9022983 jquerymobile phonegap and device toke