修改 我正在开发一个使用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上传递)
答案 0 :(得分:0)
首先确保您没有收到以下错误&#34; 失败:无法加载资源,因为App Transport Security政策要求使用安全连接& #34;如果你这样做,把它添加到你的plist:
以下代码适用于我。我刚刚更改了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;
}