如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?

Posted

技术标签:

【中文标题】如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?【英文标题】:How to pass NSData parameter to objective c method called in swift 3? 【发布时间】:2016-11-05 11:55:57 【问题描述】:

我有 Objective-C 方法

- (void)updateRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;

我在 swift 2.3 中调用成功

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) 

 Moxtra.sharedClient().updateRemoteNotificationsWithDeviceTokens(deviceToken)

 

但在 swift 3 方法更改(从 NSdata 到数据)

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 

   Moxtra.sharedClient().updateRemoteNotifications(withDeviceToken: deviceToken)

但是 数据类型 的 swift 3 设备令牌返回 -> 32 字节 NSdata 类型的 swift 2.3 设备令牌返回 - 令牌字符串 - fffeaa1e 5aaaba7d a0e75e33 c139839f 6c906ae5 2b20f834 5a290c3d 20dc447c

所以在 swift 3 中我无法将 deviceToken 传递给服务器

有什么方法可以在 swift 3 中传递参数类型为“Data”的预期设备令牌?

swift 2.3 和 swift 3 方法的区别是什么

斯威夫特 2.3 -

Moxtra.sharedClient().updateRemoteNotificationsWithDeviceTokens(fffeaa1e 5aaaba7d a0e75e33 c139839f 6c906ae5 2b20f834 5a290c3d 20dc447c)

斯威夫特 3

Moxtra.sharedClient().updateRemoteNotifications(withDeviceToken: 32)

【问题讨论】:

您的 swift 2.3 代码看起来不对;您正在传递一个字符串,而不是 NSData。您的 swift 3 代码看起来正确; Swift 3 Data 自动桥接到NSData @Paulw11 对!这是我的打字错误,但在代码中我传递了 NSData..我更新了我的问题 我还是不明白你的问题。 Swift 3.0 版本有什么错误或其他问题?数据与 NSData 相同 @Paulw11我没有收到推送通知......在转换之前一切正常......我已经在 Xcode 8 中完成了所有必需的设置......在 ios 9 上进行测试 您的困惑只是关于 Swift 如何打印数据的方式。 Swift 3 打印 xx bytes,Swift 2 打印 ,但结果是一样的。代码中只有一个显着差异:...WithDeviceTokens...WithDeviceToken(见结尾的 s) 【参考方案1】:

您的 swift 3 代码完全正确,我所做的与您所做的完全相同,并且工作正常。我认为您还有其他问题。

如果您仍然怀疑它正在更改 NSData 值,那么您可以尝试其他类似的实验:

在你的 Objective-C 代码中添加以下方法:

-(void)stringWithData:(NSData *)data

    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"str = %@",str);

现在从您的 swift 3 代码中调用此方法,如下所示:

let str = "Hello ***!";
let data:Data! = str.data(using: String.Encoding.utf8);
Moxtra.sharedClient().string(with: data);

现在,在这里您可以看到 Objective-c 具有 NSData 参数,而 swift 具有 Data 作为参数。

现在运行代码,查看日志,你在 Objective-c 中的 Log 得到相同的字符串吗?是的?您对NSDataData 的疑问得到解决了吗?

这没有任何问题,问题一定是你的Objective-C代码,也可能是后端代码。从后端检查他们是否获得了正确的 deviceToken。检查您是否使用了正确的开发/分发 APNS 证书。调试每个点。 DataNSData没有任何问题

【讨论】:

推送通知与具有相同 APNS、证书和配置的 swift 2.3 完美配合……但在 Swift 3 中却没有,在 Xcode 8 中我更改了“功能”中的“推送通知”设置我需要在 swift 3/Xocde 8 中进行的任何其他更改 两个底部选项是否都被选中,如下图所示:tiikoni.com/tis/view/?id=dc5bd9c 从服务器端检查开发配置文件是否用于当前开发目的 是的。两者都被检查。我正在使用的 AppID 和配置文件显示启用了推送通知......也具有相同的 AppID、证书、配置文件......工作正常是 Swift 2.3 对不起..但我不明白我应该在服务器端检查什么..而且我正在使用开发证书和配置文件正在谈论相同的内容?【参考方案2】:

在 Swift 3 中,您可以简单地使用:

Moxtra.sharedClient().updateRemoteNotifications(withDeviceToken: deviceToken as Data)

【讨论】:

【参考方案3】:

DataNSData 没有区别。

let data:Data = ....
var ndata:NSData = data as! NSData

所以把它当作

Moxtra.sharedClient().updateRemoteNotifications(withDeviceToken: deviceToken as! Data)

【讨论】:

【参考方案4】:

您需要将类型转换为 NSData,然后根据需要使用 Encoding 方法。

【讨论】:

以上是关于如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?的主要内容,如果未能解决你的问题,请参考以下文章

多部分数据未将所有参数传递给服务器-Swift 3

如何将额外的参数传递给自定义UIView类以便在swift中进行初始化

将参数传递给 NSTimer 在 Swift 中调用的方法

如何在swift中将参数传递给post API

使用 UITapGestureRecognizer、UIImageView 和 UITableViewCell 将参数传递给 Swift 中的选择器

如何将参数传递给快速完成的函数