好吧,所以我在我的应用中实现了一些推送通知。我写过一些应该与MySQL DB交互的PHP。
我想将SQL中的设备令牌存储为char(64),因为我已经相信这很好(我的意思是,它应该在以后以二进制形式发送)。
在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 on base64_decode的返回值:
返回原始数据或失败时返回FALSE。返回的数据可以是二进制的。
现在,我不知道更多的PHP然后我在过去的两天里自学了;但如果文档说它应该返回FALSE或原始数据,我发现返回的值是空字符串非常混乱(因为我非常确定原始数据不是空的!)。
当base64_decoded字符串变为null时,我附加它时显然是我的整个查询字符串。这不是一个非常有说服力的查询。
所以我的问题是,我猜:为什么base64_decode会返回不应该的东西?一旦我真正从base64_decode中获取数据,我应该如何将它包含在查询中,以便将其存储在我想要的数据库中(只需追加?)?
其他信息: 我正在使用Slim Framework。我正在这条路上做这一切。 $ 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>
答案 0 :(得分: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.
?>
答案 1 :(得分:0)
在我的情况下,如果我解码字符串格式不正确,它将返回null
echo base64_decode("i'm not encode, or wrong format");//null
echo base64_decode('bWVvdyBtZW93');//meow meow
这样再次检查字符串格式
但在某些情况下:有人缺少base64_decode和base64_encode,当他们想要编码一个字符串但他们使用base64_decode所以它显示为空