编辑: 我正在开发一个使用 webview 的 iOS 应用程序,它有推送通知,我正在尝试将设备 token 传递给 php 文件 (sampleIndex.php) 以进行数据库注册。
我尝试发布设备 token 无效。这是代码:
编辑 (2):我当前的代码基于@mat 的回答(相同的概念,但更清晰)
extension NSData {
func hexString() -> String {
// "Array" of all bytes:
let bytes = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count:self.length)
// Array of hex strings, one for each byte:
let hexBytes = bytes.map { String(format: "%02hhx", $0) }
// Concatenate all hex strings:
return (hexBytes).joinWithSeparator("")
}
}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let session = NSURLSession.sharedSession()
let tk = deviceToken.hexString()
let postBody = NSString(format: "token=%@", tk)
let endBody = NSURL(string: "http://samplesite.com/subfolder/subfolder2/sampleIndex.php")
let request = NSMutableURLRequest(URL: endBody!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 30.0)
request.HTTPMethod = "POST";
request.HTTPBody = postBody.dataUsingEncoding(NSUTF8StringEncoding)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
if data != nil {
print("data: \(response)")
} else {
print("failed: \(error!.localizedDescription)")
}
}//closure
dataTask.resume()
}
为什么我获取不到tk的值? ( token 设备)。我错过了什么吗?抱歉,我是新手。
编辑 (3) 这是请求 token 的 php 代码 (sampleIndex.php):
<?php
include_once("includes/myConnect.php");
$token = $_REQUEST['token'];
if (empty($token)) {
$sql = "UPDATE sampleDB . sampleTB SET token= '0' WHERE id='8982'";
$result = mysqli_query($conn, $sql);
}else{
$sql = "UPDATE sampleDB . sampleTB SET token= '1' WHERE id='8982'";
$result = mysqli_query($conn, $sql);
}
?>
(token设置为值“0”证明设备token在sampleIndex.php上传递失败)
最佳答案
首先确保您没有收到以下错误“失败:无法加载资源,因为应用程序传输安全策略要求使用安全连接”如果收到,请添加这个到你的plist:
以下代码适用于我。我刚刚更改了 postBody 和 URL 来回答你的问题,但这样做我能够将 token 保存到我的数据库中。
extension NSData {
func hexString() -> String {
// "Array" of all bytes:
let bytes = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count:self.length)
// Array of hex strings, one for each byte:
let hexBytes = bytes.map { String(format: "%02hhx", $0) }
// Concatenate all hex strings:
return (hexBytes).joinWithSeparator("")
}
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
//request notification
let type: UIUserNotificationType = [UIUserNotificationType.Badge, UIUserNotificationType.Alert, UIUserNotificationType.Sound];
let setting = UIUserNotificationSettings(forTypes: type, categories: nil);
UIApplication.sharedApplication().registerUserNotificationSettings(setting);
//register for remote notification - push notification
UIApplication.sharedApplication().registerForRemoteNotifications();
return true
}
fun application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let session = NSURLSession.sharedSession()
let userId = "12345" // not sure you have a userId at this point but you can remove that line and also remove it from postBody
let tk = deviceToken.hexString()
let postBody = NSString(format: "user=%@&token=%@", userId, tk)
let endBody = NSURL(string: "http://www.sampleurl.com/sampleIndex.php")
let request = NSMutableURLRequest(URL: endBody!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 30.0)
request.HTTPMethod = "POST";
request.HTTPBody = postBody.dataUsingEncoding(NSUTF8StringEncoding)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
if data != nil {
print("data: \(response)")
} else {
print("failed: \(error!.localizedDescription)")
}
}//closure
dataTask.resume()
}
要在数据库中插入 token ,我强烈建议您使用 prepare 语句。我使用 OOP Php,所以我有一个处理所有连接的类数据库,但我简化了代码:
sampleIndex.php
<?php
$userid = $_REQUEST['user'];
$token = $_REQUEST['token'];
if (empty($userid) || empty($token)) {
return;
}else{
saveTokenToDatabase($userid, $token);
}
function saveTokenToDatabase($user, $token){
$username = 'youDatabaseUsername';
$password = 'yourPassword';
$dbh = new PDO('mysql:host=localhost;dbname=database_name', $username, $password);
// first verify if the token is already in the database
$sth = $dbh->prepare("SELECT token
FROM user_tokens
WHERE user_id = ?
AND token = ? LIMIT 1");
$sth->bindParam(1, $user, PDO::PARAM_INT);
$sth->bindParam(2, $token, PDO::PARAM_STR);
$sth->execute();
$tokenExists = ($sth->fetchColumn() > 0) ? true : false;
//if token is not already there
if(!$tokenExists){
$now = date("Y-m-d H:i:s");
$query = $dbh->prepare("INSERT INTO user_tokens (user_id, token, datecreated) VALUES(?,?,'".$now."')");
$query->bindParam(1, $user, PDO::PARAM_INT);
$query->bindParam(2, $token, PDO::PARAM_STR);
$query->execute();
// determine if token already exists
}
//close the connection
$dbh = null;
}
关于php - Swift 2 - 使用 PHP 在数据库中插入设备 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34432162/