php - Swift 2 - 使用 PHP 在数据库中插入设备 token

标签 php ios swift

编辑: 我正在开发一个使用 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: enter image description here

以下代码适用于我。我刚刚更改了 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/

相关文章:

ios - XCode 8.0 应用构建超慢

ios - SpriteKit : calculate angle of joystick and change sprite based on that

ios - AVAudioEngine 和 AVAudioSession 之间有什么关系吗?

php - 无法使用 PhpMyAdmin 正确连接到外部服务器

ios - 通过 MFMailcomposeController 发送时在 sqlite 中发现空数据

php - Unicode字符显示问题

ios - swift 3 : not working with completion handler in iOS

swift - 如何为按钮中的文本添加边框?

php - 多对多关系上的多个连接条件

php - 我应该(以及如何)使用模式 Bootstrap 运行 php 脚本吗?