バグ #1698

【Android・iOS】フォロー通知の飛び先がフォローされた側のユーザーになる不具合

久保 健太6年以上前に追加. 6年以上前に更新.

ステータス:新規開始日:2018/07/09
優先度:通常期日:
担当者:-進捗 %:

0%

カテゴリ:-作業時間の記録:-
対象バージョン:-

説明

・プッシュ送信時の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

    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);

    }

・iOS

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 {

        }
    }
}

・cloudCode

Parse.Cloud.define("sendClientPush", function(request, response){

    var target = request.params.target;←Android・iOSから渡されるJSONの「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");
     });
});

履歴

#1 久保 健太6年以上前に更新

  • 説明 を更新 (diff)

#2 久保 健太6年以上前に更新

  • 説明 を更新 (diff)

#3 久保 健太6年以上前に更新

  • 説明 を更新 (diff)

#4 久保 健太6年以上前に更新

  • 説明 を更新 (diff)

他の形式にエクスポート: Atom PDF