バグ #1698
・プッシュ送信時のJSON
フォローした側→cWT2XRmvYp
フォローされた側→5JmRyhYtIH
・原因
・Android
{"action":"jp.ihearts.coslab.followed","aps":{"alert":"赤坂優太さんにフォローされました"},"target":"cWT2XRmvYp"}
・iOS
{"target":"5JmRyhYtIH","aps":{"alert":"赤坂優太さんがフォローしました"},"action":"jp.ihearts.coslab.followed"}
Android・iOSは「target」に設定されているユーザーのプロフィールを開くように実装している。
Androidから打たれるプッシュ通知の「target」にはフォローした側のObjectIdが入っているが、
iOSから打たれるプッシュ通知の「target」にはフォローされた側のObjectIdが入っている
iOSからcloudcodeを呼ぶ際のパラメータに「target」が存在しているため
パラメータ同士が競合してフォローした側のObjectIDが入っていない
・Android
<pre>
public static void sendFollowRequestParsePush(Activity activity, final CustomUser targetUser){
if(ParseUser.getCurrentUser()==null){
return;
}
CustomUser user=(CustomUser)ParseUser.getCurrentUser();
JSONObject data = null;
String msg = user.getHandleName() + activity.getString(R.string.text_push_accept_follow);
try {
data = new JSONObject("{\"action\": \"jp.ihearts.coslab.followed\", \"aps\" : {\"alert\" : \"" + msg + "\"}, \"target\": \"" + user.getObjectId() + "\" }");←「target」にフォローした側のObjectIdが入っている
} catch (JSONException e) {
e.printStackTrace();
}
if(data!=null) {
ParseAccessor.sendClientPush(targetUser.getObjectId(), msg, data.toString(), new FunctionCallback<List<ParseObject>>() {
@Override
public void done(List<ParseObject> object, ParseException e) {
if (e != null) {
e.printStackTrace();
}
}
});
}
public static void sendClientPush(String target, String message, String data, FunctionCallback<List<ParseObject>> callback) {
HashMap<String, Object> params = new HashMap<>();
params.put("target", target);←フォローされた側のObjectIdが入っている
params.put("message", message);
params.put("data", data);
Log.d("send", "sendClientPush");
ParseCloud.callFunctionInBackground("sendClientPush", params, callback);
}
</pre>
・iOS
<pre>
func sendPushFollow(receiverObjId: String) {
var param = [String: String]()
param["action"] = "jp.ihearts.coslab.followed"
param["target"] = receiverObjId←フォローされた側のObjectIdが入っている
let pushMsg = String(format: NSLocalizedString("USERFOLLOW_FOLLOWED", comment: ""), IHUser.currentUserName())
let aDriver = IHParseDriver.instance()
aDriver.sendPushNotification(param, text: pushMsg)
}
private func sendPushNotification(_ param: [String: String], text: String, callFuncName: String = "sendClientPush") {
var param = param
var dic = [String : AnyObject]()
var dic2 = [String : String]()
dic2["alert"] = text
dic["aps"] = dic2 as AnyObject
for (key,val) in param {
dic[key ] = val as AnyObject
}
do {
// Dict -> JSON
let jsonData = try JSONSerialization.data(withJSONObject: dic, options: []) //(*)options??
param["data"] = NSString(data: jsonData, encoding: String.Encoding.utf8.rawValue)! as String
} catch {
print("Error!: \(error)")
}
PFCloud.callFunction(inBackground: callFuncName, withParameters: param as [AnyHashable: Any]) {
result, error in
if error != nil {
} else {
}
}
}
</pre>
・cloudCode
<pre>
Parse.Cloud.define("sendClientPush", function(request, response){
var target = request.params.target;←Android・iOSから渡されるJSONの「target」を参照している request.params.target;
var message = request.params.message;
var data = request.params.data;
var obj = (new Function("return " + data))();
Util.console_error("target:"+JSON.stringify(target));
Util.console_error("message:"+JSON.stringify(message));
Util.console_error("obj:"+JSON.stringify(obj));
var pushQuery = new Parse.Query(Parse.Installation);
var User = Parse.Object.extend("_User");
var user = new User();
user.id = target;
pushQuery.equalTo("user", user);
Parse.Push.send({
where:pushQuery,
data:obj
}, { useMasterKey: true })
.then(function() {
// Push sent!
//console.log("Push Success");
response.success();
}, function(error) {
// There was a problem :(
//console.log("Push Error");
response.error("NG");
});
});
</pre>
フォローした側→cWT2XRmvYp
フォローされた側→5JmRyhYtIH
・原因
・Android
{"action":"jp.ihearts.coslab.followed","aps":{"alert":"赤坂優太さんにフォローされました"},"target":"cWT2XRmvYp"}
・iOS
{"target":"5JmRyhYtIH","aps":{"alert":"赤坂優太さんがフォローしました"},"action":"jp.ihearts.coslab.followed"}
Android・iOSは「target」に設定されているユーザーのプロフィールを開くように実装している。
Androidから打たれるプッシュ通知の「target」にはフォローした側のObjectIdが入っているが、
iOSから打たれるプッシュ通知の「target」にはフォローされた側のObjectIdが入っている
iOSからcloudcodeを呼ぶ際のパラメータに「target」が存在しているため
パラメータ同士が競合してフォローした側のObjectIDが入っていない
・Android
<pre>
public static void sendFollowRequestParsePush(Activity activity, final CustomUser targetUser){
if(ParseUser.getCurrentUser()==null){
return;
}
CustomUser user=(CustomUser)ParseUser.getCurrentUser();
JSONObject data = null;
String msg = user.getHandleName() + activity.getString(R.string.text_push_accept_follow);
try {
data = new JSONObject("{\"action\": \"jp.ihearts.coslab.followed\", \"aps\" : {\"alert\" : \"" + msg + "\"}, \"target\": \"" + user.getObjectId() + "\" }");←「target」にフォローした側のObjectIdが入っている
} catch (JSONException e) {
e.printStackTrace();
}
if(data!=null) {
ParseAccessor.sendClientPush(targetUser.getObjectId(), msg, data.toString(), new FunctionCallback<List<ParseObject>>() {
@Override
public void done(List<ParseObject> object, ParseException e) {
if (e != null) {
e.printStackTrace();
}
}
});
}
public static void sendClientPush(String target, String message, String data, FunctionCallback<List<ParseObject>> callback) {
HashMap<String, Object> params = new HashMap<>();
params.put("target", target);←フォローされた側のObjectIdが入っている
params.put("message", message);
params.put("data", data);
Log.d("send", "sendClientPush");
ParseCloud.callFunctionInBackground("sendClientPush", params, callback);
}
</pre>
・iOS
<pre>
func sendPushFollow(receiverObjId: String) {
var param = [String: String]()
param["action"] = "jp.ihearts.coslab.followed"
param["target"] = receiverObjId←フォローされた側のObjectIdが入っている
let pushMsg = String(format: NSLocalizedString("USERFOLLOW_FOLLOWED", comment: ""), IHUser.currentUserName())
let aDriver = IHParseDriver.instance()
aDriver.sendPushNotification(param, text: pushMsg)
}
private func sendPushNotification(_ param: [String: String], text: String, callFuncName: String = "sendClientPush") {
var param = param
var dic = [String : AnyObject]()
var dic2 = [String : String]()
dic2["alert"] = text
dic["aps"] = dic2 as AnyObject
for (key,val) in param {
dic[key ] = val as AnyObject
}
do {
// Dict -> JSON
let jsonData = try JSONSerialization.data(withJSONObject: dic, options: []) //(*)options??
param["data"] = NSString(data: jsonData, encoding: String.Encoding.utf8.rawValue)! as String
} catch {
print("Error!: \(error)")
}
PFCloud.callFunction(inBackground: callFuncName, withParameters: param as [AnyHashable: Any]) {
result, error in
if error != nil {
} else {
}
}
}
</pre>
・cloudCode
<pre>
Parse.Cloud.define("sendClientPush", function(request, response){
var target = request.params.target;←Android・iOSから渡されるJSONの「target」を参照している request.params.target;
var message = request.params.message;
var data = request.params.data;
var obj = (new Function("return " + data))();
Util.console_error("target:"+JSON.stringify(target));
Util.console_error("message:"+JSON.stringify(message));
Util.console_error("obj:"+JSON.stringify(obj));
var pushQuery = new Parse.Query(Parse.Installation);
var User = Parse.Object.extend("_User");
var user = new User();
user.id = target;
pushQuery.equalTo("user", user);
Parse.Push.send({
where:pushQuery,
data:obj
}, { useMasterKey: true })
.then(function() {
// Push sent!
//console.log("Push Success");
response.success();
}, function(error) {
// There was a problem :(
//console.log("Push Error");
response.error("NG");
});
});
</pre>