Swift 2 - 使用PHP

时间:2015-12-23 09:15:05

标签: php ios swift

修改 我正在开发一个使用webview的iOS应用程序,它有推送通知,我试图将设备令牌传递给php文件(sampleIndex.php)进行数据库注册。

我尝试发布设备令牌是不行的。这是代码:

编辑(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 的值? (令牌设备)。我错过了什么吗?对不起,我刚接触到这个。

编辑(3) 这是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);
}

?>

(标记设置为值&#34; 0&#34;这证明设备标记无法在sampleIndex.php上传递)

1 个答案:

答案 0 :(得分:0)

首先确保您没有收到以下错误&#34; 失败:无法加载资源,因为App Transport Security政策要求使用安全连接& #34;如果你这样做,把它添加到你的plist: enter image description here

以下代码适用于我。我刚刚更改了postBody和URL来回答你的问题,但这样做我能够将令牌保存到我的数据库。

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()
}

要在数据库中插入令牌,我强烈建议您使用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;
}