2

好的,所以我在我的应用程序中实现了一些推送通知。我写了一些应该与 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>
4

2 回答 2

1

请将您的查询字符串写入 php 中的文件,这是最好的方法是测试您的编码令牌值是否正确。例如

<?php
$querystring=$_REQUEST['YOUR_QUERY_STRING'];
file_put_contents("query_string.txt",$querystring);
?>

这会将整个查询字符串写入“query_string.txt”文件。然后打开文件。并检查您的 base64 编码值的值。然后复制该值并使用类似的简单程序进行检查。

<?php
   echo base64_decode("YOUR_COPIED_VALUE");
// if this works fine there is no problem. you have to go through your php code.
?> 
于 2012-08-27T09:18:31.300 回答
1

在我的情况下,如果我解码的字符串格式不正确,它将返回 null

echo base64_decode("i'm not encode, or wrong format");//null
echo base64_decode('bWVvdyBtZW93');//meow meow

所以再次 检查你的字符串格式

但在某些情况下:有人缺少 base64_decode 和 base64_encode,当他们想要对字符串进行编码但他们使用 base64_decode 所以它显示为 null

于 2016-10-28T04:48:43.137 回答