如何将 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 3Data
自动桥接到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 得到相同的字符串吗?是的?您对NSData
和Data
的疑问得到解决了吗?
这没有任何问题,问题一定是你的Objective-C代码,也可能是后端代码。从后端检查他们是否获得了正确的 deviceToken。检查您是否使用了正确的开发/分发 APNS 证书。调试每个点。 Data
或NSData
没有任何问题
【讨论】:
推送通知与具有相同 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】:Data
和 NSData
没有区别。
let data:Data = ....
var ndata:NSData = data as! NSData
所以把它当作
Moxtra.sharedClient().updateRemoteNotifications(withDeviceToken: deviceToken as! Data)
【讨论】:
【参考方案4】:您需要将类型转换为 NSData,然后根据需要使用 Encoding 方法。
【讨论】:
以上是关于如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何将额外的参数传递给自定义UIView类以便在swift中进行初始化
使用 UITapGestureRecognizer、UIImageView 和 UITableViewCell 将参数传递给 Swift 中的选择器