Kaa*_*rak 7 azure node.js ios azure-mobile-services azure-notificationhub
本月我开始使用Azure App Service,在App Service I使用Azure移动服务之前,带有标签的注册设备令牌非常简单但在应用服务中我意识到由于安全问题而将其删除所以我必须使用自定义API.
我使用自定义身份验证(不是天蓝色身份验证服务(由于我的客户端不希望它))与我的数据库,所以我需要将用户ID设置为标签,以向特定用户发送通知.但是我面临的问题甚至如果设备令牌注册正常(我可以向没有标签的每个人发送推送)标签不起作用,我正在关注这些博客文章
我的自定义API(updateNotification.js)
var api = {
get: (request,response,next) => {
var push = request.azureMobile.push;
var installationId = request.query.id;
push.getInstallation(installationId, function(error, installation, res){
if (error){
console.log('An error occurred when retrieving installation : ' + error);
response.status(error.statusCode).send(error.detail);
}
else{
// Return an array of current tags.
response.json(installation.tags);
}
});
},
post: (request, response, next) => {
var push = request.azureMobile.push;
var installationId = request.query.id;
var tags = request.query.userID;
var updateOperation = [{
"op": "add",
"path": "/tags",
"value": tags.toString()
}];
push.patchInstallation(installationId, updateOperation, function(error, res){
if(error){
console.log(error)
response.status(error.statusCode).send(error.detail);
}
else{
console.log("Success");
console.log("Tags : " + tags);
response.status(200).send(tags);
}
});
}
};
module.exports = api;
Run Code Online (Sandbox Code Playgroud)
在我的AppDelegate.swift类中,我正在这样做
func application(application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let keychain = KeychainSwift()
let id : NSString = keychain.get("userID")! as String
let client = MSClient(applicationURLString: "https://XXXX.XXXX.XXX")
var deviceTokenString = "\(deviceToken)"
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString("<", withString: "")
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(">", withString: "")
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(" ", withString: "-")
client.push?.registerDeviceToken(deviceToken, completion: { (error) in
if let err = error {
print("ERROR ", err)
}else{
client.invokeAPI("updateNotification", body: nil, HTTPMethod: "Post", parameters: ["id" : deviceTokenString , "userID" : id], headers: nil) { (result, response, error) in
if response?.statusCode != 200 {
NSLog("ERROR %@", error!)
} else {
print("Tags Successfully Implemented")
}
}
}
})
}
Run Code Online (Sandbox Code Playgroud)
现在一切似乎都很好,在我的控制台中,我可以看到我的用户ID,我的设备令牌和用户ID在这里就像这样(我在它的中间是puttin X:对不起)
deviceToken = 22afedf6-a08f1ce9-XXXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXX-db431577-2dfbbee1用户ID = 88d06c97-XXXX-XXXX-XXXX-042215c46575
但是,当我尝试使用此GET方法查看设备ID的标签时,
client.invokeAPI("updateNotification", body: nil, HTTPMethod: "GET", parameters: ["id" : deviceTokenString], headers: nil) { (result, response, error) in
if response?.statusCode != 200 {
NSLog("ERROR %@", error!)
} else {
print(result)
}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error Domain = com.Microsoft.MicrosoftAzureMobile.ErrorDomain Code = -1302"Installation not found.TrackingId:57239dd3-XXXX-XXXX-XXXX-0bd9579c660e_G1,TimeStamp:7/18/2016 8:22:05 PM"
如何解决此错误消息?
好的,长时间工作后,这就是解决方案
1.步骤
如果您可以调试通知中心(我建议从 Visual studio 2015 Express 等进行调试),您可以看到 PNS 标识符(这是我们的设备令牌)全部大写,没有破折号,因此首先我们需要更改设备AppDelegate.swift 中的令牌代码如下所示
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString("<", withString: "")
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(">", withString: "")
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(" ",withString: "-")
deviceTokenString = deviceTokenString.uppercaseString
//In case of any spaces just guarantee with trim
let trimmedDeviceToken = deviceTokenString.stringByTrimmingCharactersInSet(
NSCharacterSet.whitespaceAndNewLineCharacterSet()
)
Run Code Online (Sandbox Code Playgroud)
2.步骤
InstallationId和设备令牌是完全不同的东西。您将标签推送到installationId而不是设备令牌,因此您需要在客户端代码中获取installationId。
问题是在适用于 IOS 的 Azure Mobile SDK 中,您无法调用安装 ID client.installationId(至少我找不到从 MSClient 对象获取的方式)
我所做的是,进入框架并找到 MSClient.m 。我意识到安装 id 实际上存储在 NSUserDefaults 中,密钥为“WindowsAzureMobileServicesInstallationId”。所以我可以通过此从 NSUser Defaults 访问它
let defaults = NSUserDefaults.standartUserDefaults()
let installationID = defaults.stringForKey("WindowsAzureMobileServicesInstallationId")
Run Code Online (Sandbox Code Playgroud)
完成这些步骤后,您实际上可以将标签注册到安装 ID。这是应用程序 didRegisterForRemoteNotificationsWithDeviceToken 方法的结果和完整代码
func application(application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let keychain = KeychainSwift()
let id : NSString = keychain.get("userID")! as String
let client = MSClient(applicationURLString: "https://XXXX.XXXX.XXX")
var deviceTokenString = "\(deviceToken)"
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString("<", withString: "")
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(">", withString: "")
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(" ", withString: "")
deviceTokenString = deviceTokenString.uppercaseString
//In case of any spaces just guarantee with trim
let trimmedDeviceToken = deviceTokenString.stringByTrimmingCharactersInSet(
NSCharacterSet.whitespaceAndNewLineCharacterSet()
)
let defaults = NSUserDefaults.standartUserDefaults()
let installationID = defaults.stringForKey("WindowsAzureMobileServicesInstallationId")
client.push?.registerDeviceToken(deviceToken, completion: { (error) in
if let err = error {
print("ERROR ", err)
}else{
client.invokeAPI("updateNotification", body: nil, HTTPMethod: "Post", parameters: ["id" : installationID! , "userID" : id], headers: nil) { (result, response, error) in
if response?.statusCode != 200 {
NSLog("ERROR %@", error!)
} else {
print("Tags Successfully Implemented")
}
}
}
})
}
Run Code Online (Sandbox Code Playgroud)
之后,您还可以通过调用 updateNotification 的 GET 方法并发送我们从 NSUserDefaults 获取的 InstallationId 来检查标签
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |