开发者社区> 问答> 正文

应用研发平台EMAS iOS端获取deviceToken的问题,该如何解决?

应用研发平台EMAS iOS端获取deviceToken的问题,该如何解决?

展开
收起
2401。 2023-09-02 10:00:37 76 0
5 条回答
写回答
取消 提交回答
  • iOS端获取deviceToken的问题:https://help.aliyun.com/document_detail/130561.htm
    此回答整理自“应用研发平台EMAS开发者交流群”。

    2023-09-04 21:48:09
    赞同 展开评论 打赏
  • deviceToken数据格式发生了变化,以至于老版本的SDK不能正确的解析deviceToken,并上传到CloudPush服务器。

    解决方案:
    需要您将SDK版本升级到1.9.9~2.0版本,移动研发平台EMAS控制台上已发布该版本,并且cocoaPods也更新到该版本。您的代码中不需做任何改动,SDK中更新的代码如下所示。

    # include <arpa/inet.h>// 将APNS返回的deviceTokenData转换为标准的deviceToken String。+ (NSString *)translateDeviceToken:(NSData *)deviceTokenData {    if (deviceTokenData == nil || ![deviceTokenData isKindOfClass:[NSData class]]) {        return nil;    }    const unsigned *tokenBytes = [deviceTokenData bytes];    NSString *deviceTokenStr = [NSStringstringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",                          ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),                          ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),                          ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];    return deviceTokenStr;}
    
    2023-09-03 07:45:51
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    要在iOS端获取设备的deviceToken,您可以按照以下步骤进行操作:

    1. 集成APNs:首先,确保您的应用已正确集成苹果推送通知服务(APNs)。您需要在Apple Developer账号中创建一个包含推送功能的App ID,并生成相应的推送证书。

    2. 注册APNs通知:在您的应用的AppDelegate文件中,添加以下代码来注册APNs通知:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 注册远程通知
        UNUserNotificationCenter.current().delegate = self
    
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { _, _ in }
    
        application.registerForRemoteNotifications()
    
        return true
    }
    
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // 获取到设备的deviceToken
        let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        print(token)
    }
    
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        // 注册推送失败时的处理
        print("Failed to register for remote notifications: \(error.localizedDescription)")
    }
    

    上述代码会请求用户授权推送通知,并在成功注册时获取到设备的deviceToken。

    1. 处理deviceTokendidRegisterForRemoteNotificationsWithDeviceToken方法被调用时,将得到一个Data类型的deviceToken。您可以在此方法中将deviceToken转换为字符串,并进行后续处理,如上传到服务器或其他操作。

    请注意,以上代码是使用Swift语言编写的示例,如果您使用Objective-C语言,请参考苹果官方文档以及相关开发资源来获取deviceToken。

    另外,请确保您的应用在设备上已经允许接收推送通知,并且应用的bundle identifier与APNs所使用的证书和配置文件相匹配。

    2023-09-02 17:56:56
    赞同 展开评论 打赏
  • Xcode 11 beta和iOS 13 beta中iOS端使用SDK V1.9.8及更低的版本,出现无法将返回的deviceToken上传到CloudPush服务器的问题,以至于最终推送通知失败。相关代码如下。

    /* iOS系统方法APNS注册成功回调,在该方法中, 将返回的deviceToken上传到CloudPush服务器。 备注:在开发环境测试时,iOS 13+系统个别设备上初次安装有概率不会调用该方法,以至于没有获取到token,则上报失败。 这是苹果系统的原因(期待他们的修复),一般线上不会出现该问题,如果测试中出现该问题: 1.检查设备网络是否正常。 2.删除App重新安装测试下。 3.拔掉数据连接线,重新连接, 删除App,重新安装测试下。 4.删除App,更改下bundleid编译运行下,之后在切换原先的bundleid编译运行测试下。 5.打开手机设备通用页面,在底端关机,然后重启。 6.是否在其他地方重写了该方法;是否集成过信鸽。 备注:在iOS 9以后每次删除App,然后重新安装App,deviceToken都会发生改变。 如果调用了该方法,但是SDK依旧获取不到deviceToken,需要您检查一下SDK的版本是否大于1.9.8的版本。 /- (void)application:(UIApplication )application didRegisterForRemoteNotificationsWithDeviceToken:(NSData )deviceToken { NSLog(@"Upload deviceToken to CloudPush server."); [CloudPushSDK registerDevice:deviceToken withCallback:^(CloudPushCallbackResult res) { if (res.success) { NSLog(@"Register deviceToken success, deviceToken: %@", [CloudPushSDK getApnsDeviceToken]); } else { NSLog(@"Register deviceToken failed, error: %@", res.error); } }];}

    问题原因
    deviceToken数据格式发生了变化,以至于老版本的SDK不能正确的解析deviceToken,并上传到CloudPush服务器。

    解决方案

    需要您将SDK版本升级到1.9.9~2.0版本,移动研发平台EMAS控制台上已发布该版本,并且cocoaPods也更新到该版本。您的代码中不需做任何改动,SDK中更新的代码如下所示。

    # include <arpa/inet.h>// 将APNS返回的deviceTokenData转换为标准的deviceToken String。+ (NSString *)translateDeviceToken:(NSData *)deviceTokenData { if (deviceTokenData == nil || ![deviceTokenData isKindOfClass:[NSData class]]) { return nil; } const unsigned *tokenBytes = [deviceTokenData bytes]; NSString *deviceTokenStr = [NSStringstringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x", ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]), ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]), ntohl(tokenBytes[6]), ntohl(tokenBytes[7])]; return deviceTokenStr;}

    image.png
    image.png

    2023-09-02 11:42:26
    赞同 展开评论 打赏
  • 全栈JAVA领域创作者

    如果您在EMAS平台上遇到了iOS端获取deviceToken的问题,您可以尝试以下几种解决方法:

    检查您的应用中是否正确实现了推送功能的代码,包括在应用启动时初始化推送功能、在收到推送通知时处理通知的代码等。
    如果您的应用中已经正确实现了推送功能的代码,但是仍然无法获取到deviceToken,您可以尝试在应用中添加一个自定义的通知设置,让用户可以选择是否开启系统通知栏或自定义通知栏,以避免出现两个通知栏的情况。
    如果以上两种方法都无法解决问题,您可以考虑在EMAS平台上联系iOS的技术支持,寻求他们的帮助和支持。
    希望这些建议能够帮助您解决问题。

    2023-09-02 10:10:37
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
基于阿里巴巴以及合作伙伴的最佳实践,围绕大前端、云原生领域的相关技术热点(小程序、Serverless、应用中间件、低代码、DevOps)展开行业探讨,与开发者一起探寻云原生时代应用研发的新范式。
相关文档: 移动研发平台
问答排行榜
最热
最新

相关电子书

更多
手淘iOS性能优化探索 立即下载
From Java/Android to Swift iOS 立即下载
深入剖析iOS性能优化 立即下载