好的,所以我在我的应用程序中实现了一些推送通知。我写了一些应该与 MySQL 数据库交互的 PHP。
我想将设备令牌作为 char(64) 存储在 SQL 中,因为我开始相信这很好(我的意思是,它应该在以后以二进制形式发送)。
在 iOS 端,我这样做:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString *tokenString = [deviceToken base64EncodedString];
NSDictionary *jsonDic = [NSDictionary dictionaryWithObjectsAndKeys:tokenString, @"Token", [NSNumber numberWithBool:YES], @"IsiDevice", [NSNumber numberWithBool:YES], @"Active", nil];
//... http request stuff
// what might be important is that the POST body is encoded as UTF8 (content-type set appropriately)
}
base64 的东西来自 Matt Gallagher 的 NSData+Base64。现在,在 PHP 端,会发生这种情况:
// $tokenEncoded is exactly the same string as I sent from the app (type is string)
$tokenEncoded = $jsonData['Token'];
// $token becomes null! (type is string)
$token = base64_decode($tokenEncoded);
来自 php.net/manual 关于 base64_decode 的返回值:
返回原始数据或失败时返回 FALSE。返回的数据可能是二进制的。
现在,与过去两天自学的 PHP 相比,我对 PHP 的了解并不多;但是如果文档说它应该返回 FALSE 或原始数据,我发现返回的值是一个空字符串非常令人困惑(因为我很确定原始数据不是空的!)。
随着 base64_decoded 字符串变为空,当我附加它时,我的整个查询字符串显然也是如此。这并不是一个非常有说服力的查询。
所以我的问题是,我猜:为什么 base64_decode 会返回它不应该返回的东西?一旦我真正从 base64_decode 中获取数据,我应该如何将它包含在查询中,以便它按照我想要的方式存储在数据库中(只是追加?)?
附加信息:我正在使用 Slim 框架。我在一条路线上做这一切。$jsonData 从正文中获取,如下所示:
$jsonBody = Slim::getInstance()->request()->getBody();
$jsonData = json_decode($jsonBody, true);
从应用程序中进行了一些额外的测试,以确保我的应用程序对 base 64 的实现不会造成任何影响:
DLOG(@"Device token as NSData: %@", deviceToken);
NSString *base64token = [deviceToken base64EncodedString];
DLOG(@"Device token as base64: %@", base64token);
DLOG(@"Device token back from base64: %@", [NSData dataFromBase64String:base64token]);
输出:
Device token as NSData: <65625f1c c33b9480 5a46f346 8b2877d0 95e92823 33e88e91 fd3a2abf febad972>
Device token as base64: ZWJfHMM7lIBaRvNGiyh30JXpKCMz6I6R/Toqv/662XI=
Device token back from base64: <65625f1c c33b9480 5a46f346 8b2877d0 95e92823 33e88e91 fd3a2abf febad972>