push 订阅
普提查·克瑟辛(Push),1986年7月3日出生于泰国叻丕府,泰国男演员、主持人,毕业于宣都实皇家大学。2008年以泰国GMM Channel频道《O:IC》节目主持人、ChillFM89电台DJ身份进入演艺圈。2012年出演电视剧《世界的交汇点第二季》、《雀之灵》、《旧爱》。2013年主演电视剧《爱的气球》。2014年主演魔幻剧《魔幻天使》、爱情喜剧《幻梦》。2015年主演《猎爱百计》和《丑小鸭之天生绝配》《我要成为超级巨星》 [1]  ,并获得2015年Siam Dara Star Awards魅力男星奖 [2]  。2016年,主演爱情剧《王子学院之帅气牛仔》。2017年,主演爱情励志剧《逆袭之星途璀璨》 [3]  。 展开全文
普提查·克瑟辛(Push),1986年7月3日出生于泰国叻丕府,泰国男演员、主持人,毕业于宣都实皇家大学。2008年以泰国GMM Channel频道《O:IC》节目主持人、ChillFM89电台DJ身份进入演艺圈。2012年出演电视剧《世界的交汇点第二季》、《雀之灵》、《旧爱》。2013年主演电视剧《爱的气球》。2014年主演魔幻剧《魔幻天使》、爱情喜剧《幻梦》。2015年主演《猎爱百计》和《丑小鸭之天生绝配》《我要成为超级巨星》 [1]  ,并获得2015年Siam Dara Star Awards魅力男星奖 [2]  。2016年,主演爱情剧《王子学院之帅气牛仔》。2017年,主演爱情励志剧《逆袭之星途璀璨》 [3]  。
信息
代表作品
丑小鸭之天生绝配、我要成为超级巨星、猎爱百计、魔幻天使
经纪公司
Gmm Grammy [4]
体    重
74kg
出生日期
1986年7月3日
职    业
演员、主持人、DJ
毕业院校
宣都实皇家大学
别    名
Push(พุฒ)
中文名
普提查·克瑟辛
身    高
185cm
外文名
Puttichai Kasetsin、พุฒิชัย เกษตรสิน
星    座
巨蟹座
主要成就
2015年第八届Siamdara Stars Awards魅力男星奖
国    籍
泰国
出生地
泰国叻丕府
POSIX线程简介
收起全文
精华内容
下载资源
问答
  • adb push不支持中文乱码的解决方案

    热门讨论 2013-08-05 17:41:56
    1.android adb push不支持中文乱码的解决方案. 2.在windows底下文件(夹)命名所采用的是GBK编码,而在Android中采用的UTF-8编码,所有使用adb 的push和pull命令时就会导致由于编码方式的不同而产生的错误,解决这一...
  • pushMessage推聊

    热门讨论 2013-11-08 16:41:02
    pushMessage推聊
  • 简单集成华为PUSH

    千次阅读 2019-01-28 12:25:10
    最近需要使用到华为push,就研究了一下。但是上网搜索了,都说,华为push是一个大坑。我暂且不说遇到的坑,只是说,最基础的集成。我是用的IDE是Android Studio,这里只讲解有关于Android Studio的集成方式,Eclipse...

    最近需要使用到华为push,就研究了一下。但是上网搜索了,都说,华为push是一个大坑。我暂且不说遇到的坑,只是说,最基础的集成。我是用的IDE是Android Studio,这里只讲解有关于Android Studio的集成方式,Eclipse大神请绕步。

    首先要注册一个账号,进入华为开发者联盟官网, 点击管理中心。

    然后进入管理中心页面,我们在选择push服务

    我们进入到了push页面,我们就可以做一些操作了。首先创建一个应用。

    点击申请push服务,我们可以看到,创建应用时需要写一些信息。

    按照自己的项目进行选择创建。需要注意的一点是,我们发现他需要的SHA256证书指纹可以有多个,是因为。你的项目有可能会有多个指纹证书,都可以写在上面。这个SHA256证书指纹不能填写DeBug模式下的指纹。需要的是release模式下的指纹证书。所以,我们需要先进行apk打包。这里我就不多讲述了。

    获取SHA256指纹证书我说一下吧。

    首先打开cmd命令窗口。找到我们的keystore文件。也就是jks文件,输入命令keytool -list -v -keystore 你的jks文件名.jks 

    如果输入成功按下回车,会让你输入密码,但是输入密码时是无状态的,就输入生成jks文件的密码就行。然后你就能得到你的SHA256证书指纹了。

    完成以上才是完成了第一步,在平台创建应用。

    下面再看华为文档。不得不说,如果一步一步按文档集成还是很靠谱的,就是有时候,你不知道它想表达些什么,可能我理解能力有限,嘿嘿。我们先下载文档提供的SDK。SDK入口随处可见,在你的PUSH页面,创建好的应用上方有几个选项,我们选择SDK下载。会发现,进入了消息推送服务文档中心。我们就根据文中心,一步一步的集成华为push。

    先下载SDK,这里是新版SDK,由于旧版的不在维护,我们就不做集成讲解。

    下载过后,你会得到一个HMSAgent_2.6.3.301文件夹,打开它

    你会看到这么几个文件。点击运行GetHMSAgent_cn.bat程序,根据提示一步一步集成

    首先输入包名,包名在你的AndroidManifest.xml文件中就能得到。appid是你在华为push服务平台上创建的应用的appid

    cpid,我们可以不用填,那是在集成游戏和支付时,才会使用到的。

    我们只需要集成push服务,其它的都选择0就可以,按任意键结束后,打开copysrc文件夹。一直往里点,我们会得到如下文件。

    这就是我们所需要的PUSH服务SDK了。将其copy到我们的工程中去,由于位置不同,我们需要再我们的项目中,将这些文件中的导包路径修改一下,是个体力活。

    修改完成,确认无报错的情况下,我们再看文档。

    我们还需要在我们的IDE里面添加仓库路径,我使用的是Android Studio。Eclipse我暂时还没有使用。

    在项目的gradle里面写上如上路径

    在app.gradle里填写依赖

     dependencies {
        compile 'com.huawei.android.hms:push:{version}'         
      }        

    说明:{version} 替换为实际的版本号,如:compile 'com.huawei.android.hms:push:2.6.3.301'  

    更多在往下看有接入准备开发准备开发指南。都有详细的集成开发说明。

    我们是做Android的,所以进入客户端开发指南,服务端请移步服务端开发指南

    首先会进行一个功能说明,我们往下看,会看到一个新旧版本的SDK对比。我说过,它的旧版的SDK已不在维护,我就不多做讲解了。还能看到华为PUSH支持的国家和地区。因为它是华为提供的push服务,在其它品牌的手机上无法使用。它只支持emui4.1以上的版本。其它的它不支持。再往下看就是正文了。

    注:以下均为华为push推送服务客户端开发指南文档资料。

    第一步,初始化Agent。

    1.1 调用init接口

    在application的onCreate方法中初始化HMSAgent。如果没有自己的application类,请创建并在manifest文件中配置application节点的name属性。

    示例代码如下:

    public class MyApplication extends Application {
        @Override
        public void onCreate() {        
            super.onCreate();
            HMSAgent.init(this);
        }
    }   

    1.2 调用connect接口

    建议在应用启动时调用Connect。
    示例代码如下:

    HMSAgent.connect(this, new ConnectHandler() {
        @Override
        public void onConnect(int rst) {
            showLog("HMS connect end:" + rst);
        }
    });    

    第二步 申请Push token

    2.1 场景介绍

           通过调用getToken接口向服务端请求应用的唯一标识——Device Token,Push服务端根据这个token发送推送消息。每个设备的上每个应用的Token都是唯一存在。您可以在自定义广播中的onToken方法接收返回的token字符串,并且将token上报到自己的应用服务器维护这些已申请的token列表,然后调用Push服务器的推送消息接口,根据token批量推送消息。

    2.2受限说明

    getToken接口只有在服务端开通了Push服务申请token才会返回成功。目前仅中国区和部分海外地区支持开通push服务

    目前华为推送支持的地区有(支持的地区后期可能有所增加):
           中国大陆,泰国, 越南 ,中国香港 ,中国台湾 ,柬埔寨 斯里兰卡,印度,中国澳门,新加坡,马来西亚,澳大利亚,新西兰,菲律宾,印度尼西亚,孟加拉国。
            约旦,埃及,阿尔及利亚,马里,也门,乍得,塞内加尔,突尼斯,阿拉伯联合酋长国,阿曼,巴基斯坦,巴林,卡塔尔,科威特,沙特阿拉伯,伊拉克。
            墨西哥,委内瑞拉,哥伦比亚,厄瓜多尔,危地马拉,尼加拉瓜,萨尔瓦多,洪都拉斯,哥斯达黎加,巴拿马,多米尼加共和国,牙买加,波多黎各,阿根廷,玻利维亚,巴拉圭,秘鲁,乌拉圭,智利。
            南非,卢旺达,安哥拉,博茨瓦纳,布隆迪,津巴布韦,肯尼亚,马达加斯加,马拉维,毛里求斯,坦桑尼亚,乌干达,赞比亚,尼日利亚,加纳,喀麦隆,象牙海岸,刚果(金)。
            阿尔巴尼亚,奥地利,比利时,荷兰,葡萄牙,挪威,爱尔兰,意大利,法国,德国,西班牙,瑞典,英国,芬兰,希腊,冰岛,波兰,罗马尼亚,塞尔维亚,斯洛文尼亚,斯洛伐克,黑山,克罗地亚,保加利亚,列支敦士登,卢森堡,马耳他,科索沃,拉脱维亚,丹麦,爱沙尼亚,立陶宛,波斯尼亚和黑塞哥维那,匈牙利,马其顿,摩尔多瓦,捷克共和国,塞浦路斯。

    注意:getToken接口在非中国区发货设备或非华为手机上首次调用时,会显示华为Push用户协议条款界面(如下图)。建议在Activity页面里再调用getToken接口。    

           中国区发货的华为设备不会显示该协议条款界面。

    2.3 业务流程

    2.4 开发步骤

           申请token会触发启动Push服务,token申请成功后,结果会通过广播的方式返回token给应用。调用getToken方法发起请求,返回申请token的PendingResult对象,根据对象可以获取接口调用是否成功,但是不直接返回token 结果。

           接口详细定义请参见getToken,申请token的示例代码如下:

    /**
     * 获取token
     */
    private void getToken() {
        showLog("get token: begin");
        HMSAgent.Push.getToken(new GetTokenHandler() {
            @Override
            public void onResult(int rtnCode, TokenResult tokenResult) {
                showLog("get token: end" + rtnCode);
            }
        }); 
    }    

     调用getToken接口后通过广播接收token值
           下面的示例代码实现如何处理onToken接口来获取push token。CP需要将token妥善的保存起来。如果CP自己实现了调用华为PUSH服务器端接口发送推送消息,那么可以推送消息到指定的Token用户。如果有涉及到在客户端和服务器之前传输Token,请确保Token的安全。

    public class HUAWEIPushRevicer extends PushReceiver {
        
        @Override
        public void onToken(Context context, String token, Bundle extras) {
                   
        }
    }   

    3 注销 token

    3.1 场景介绍

           应用调用注销TOKEN接口成功之后,客户端就不会再接收到PUSH消息。

    3.2 受限说明

           建议APP集成时暂时不要依赖deleteToken接口;如果应用要实现注销TOKEN后不接收PUSH消息,需要自行上报失效TOKEN到应用自己的服务器,并且在推送消息时判断是失效TOKEN就不进行推送。

    注意:该接口只在华为手机并且EMUI版本号不低于5.1的版本上才起作用,即只在EMUI5.1以及更高版本的华为手机上调用该接口后才不会收到PUSH消息。
    在非华为手机上则必须满足HMS版本不低于2.5.0。    

    3.3 开发步骤

           调用注销token接口,实现注销token的示例代码如下:

    /**
     * 删除token | delete push token
     */
    private void deleteToken(){
        showLog("deleteToken:begin");
        HMSAgent.Push.deleteToken(token, new DeleteTokenHandler() {
            @Override
            public void onResult(int rst) {
                showLog("deleteToken:end code=" + rst);
            }
        });
    }

    4 获取push连接状态

    4.1 场景介绍

           查看Push通道是否已连接,结果会通过自定义广播里的onPushState方法返回。

    4.2 受限说明

           此接口在之后的版本中会逐渐废弃,请业务谨慎使用。

    4.3 开发步骤

    4.3.1 调用查询Push连接状态接口

          实现查询PUSH连接状态的示例代码如下:

     /**
      * 获取push状态 | Get Push State
      */
      private void getPushStatus() {
          showLog("getPushState:begin");
          HMSAgent.Push.getPushState(new GetPushStateHandler() {
              @Override
              public void onResult(int rst) {
                  showLog("getPushState:end code=" + rst);
              }
          });
       }  

    4.3.2 通过广播接收Push连接状态

          下面的代码示例代码实现如何处理onPushState接口。
           当push处于连接状态的时候,才能正常接收push消息。

    public class HuaweiPushRevicer extends PushReceiver {
        private static final String TAG = "HuaweiPushRevicer";
    
        public static final String ACTION_UPDATEUI = "action.updateUI";
        public static final String ACTION_TOKEN = "action.updateToken";
    
    
    
        private static List<IPushCallback> pushCallbacks = new ArrayList<IPushCallback>();
        private static final Object CALLBACK_LOCK = new Object();
    
        public interface IPushCallback {
            void onReceive(Intent intent);
        }
    
        public static void registerPushCallback(IPushCallback callback) {
            synchronized (CALLBACK_LOCK) {
                pushCallbacks.add(callback);
            }
        }
    
        public static void unRegisterPushCallback(IPushCallback callback) {
            synchronized (CALLBACK_LOCK) {
                pushCallbacks.remove(callback);
            }
        }
    
        @Override
        public void onToken(Context context, String tokenIn, Bundle extras) {
            String belongId = extras.getString("belongId");
    
            Intent intent = new Intent();
            intent.setAction(ACTION_TOKEN);
            intent.putExtra(ACTION_TOKEN, tokenIn);
            callBack(intent);
    
            intent = new Intent();
            intent.setAction(ACTION_UPDATEUI);
            intent.putExtra("log", "belongId is:" + belongId + " Token is:" + tokenIn);
            callBack(intent);
        }
    
        @Override
        public boolean onPushMsg(Context context, byte[] msg, Bundle bundle) {
            try {
                //CP可以自己解析消息内容,然后做相应的处理 | CP can parse message content on its own, and then do the appropriate processing
                String content = new String(msg, "UTF-8");
                Intent intent = new Intent();
                intent.setAction(ACTION_UPDATEUI);
                intent.putExtra("log", "Receive a push pass message with the message:" + content);
                callBack(intent);
            } catch (Exception e) {
                Intent intent = new Intent();
                intent.setAction(ACTION_UPDATEUI);
                intent.putExtra("log", "Receive push pass message, exception:" + e.getMessage());
                callBack(intent);
            }
            return false;
        }
    
        public void onEvent(Context context, Event event, Bundle extras) {
            Intent intent = new Intent();
            intent.setAction(ACTION_UPDATEUI);
    
            int notifyId = 0;
            if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) {
                notifyId = extras.getInt(BOUND_KEY.pushNotifyId, 0);
                if (0 != notifyId) {
                    NotificationManager manager = (NotificationManager) context
                            .getSystemService(Context.NOTIFICATION_SERVICE);
                    manager.cancel(notifyId);
                }
            }
    
            String message = extras.getString(BOUND_KEY.pushMsgKey);
            intent.putExtra("log", "Received event,notifyId:" + notifyId + " msg:" + message);
            callBack(intent);
            super.onEvent(context, event, extras);
        }
    
        @Override
        public void onPushState(Context context, boolean pushState) {
            Intent intent = new Intent();
            intent.setAction(ACTION_UPDATEUI);
            intent.putExtra("log", "The Push connection status is:" + pushState);
            callBack(intent);
        }
    
        private static void callBack(Intent intent) {
            synchronized (CALLBACK_LOCK) {
                for (IPushCallback callback : pushCallbacks) {
                    if (callback != null) {
                        callback.onReceive(intent);
                    }
                }
            }
        }
    
    
    }
    

    集成如上,基本上就ok了。注意,你需要安装release类型的apk才行,因为你的keystore证书指纹是release类型的。

    可以查看push连接状态,根据返回的结果码判断是否成功集成。查看错误通用码。返回0说明连接成功了,可以自己试着去平台发送一条信息试一下。token是你的广播的onToken方法返回的,需要稍等片刻才能看到,毕竟心急吃不了热豆腐嘛,嘿嘿。

    展开全文
  • 强制“ git push”覆盖远程文件

    千次阅读 2020-04-13 11:27:53
    I want to push my local files, and have them on a remote repo, without having to deal with merge co

    本文翻译自:Force “git push” to overwrite remote files

    I want to push my local files, and have them on a remote repo, without having to deal with merge conflicts. 我想推送我的本地文件,并将它们放在远程仓库中,而不必处理合并冲突。 I just want my local version to have priority over the remote one. 我只希望我的本地版本优先于远程版本。

    How can I do this with Git? 如何使用Git做到这一点?


    #1楼

    参考:https://stackoom.com/question/i6Fa/强制-git-push-覆盖远程文件


    #2楼

    You should be able to force your local revision to the remote repo by using 您应该可以使用以下命令将本地修订版本强制为远程仓库

    git push -f <remote> <branch>
    

    (eg git push -f origin master ). (例如git push -f origin master )。 Leaving off <remote> and <branch> will force push all local branches that have set --set-upstream . 离开<remote><branch>将强制推送所有设置了--set-upstream本地分支。

    Just be warned, if other people are sharing this repository their revision history will conflict with the new one. 请注意,如果其他人共享此存储库,他们的修订历史将与新的存储库发生冲突。 And if they have any local commits after the point of change they will become invalid. 并且如果它们在更改点之后有任何本地提交,则它们将变为无效。

    Update : Thought I would add a side-note. 更新 :我想加个旁注。 If you are creating changes that others will review, then it's not uncommon to create a branch with those changes and rebase periodically to keep them up-to-date with the main development branch. 如果您要创建其他人可以查看的更改,那么创建具有这些更改的分支并定期重新设置基础以使它们与主要开发分支保持最新状态并不少见。 Just let other developers know this will happen periodically so they'll know what to expect. 只是让其他开发人员知道这会定期发生,以便他们知道会发生什么。

    Update 2 : Because of the increasing number of viewers I'd like to add some additional information on what to do when your upstream does experience a force push. 更新2 :由于观众数量的增加,我想添加一些有关upstream遇到强制推动时该怎么做的附加信息。

    Say I've cloned your repo and have added a few commits like so: 假设我已经克隆了您的仓库,并添加了一些提交,如下所示:

    D----E  topic
               /
    A----B----C         development

    But later the development branch is hit with a rebase , which will cause me to receive an error like so when I run git pull : 但是后来development分支受到了rebase攻击,这将导致我在运行git pull时收到类似的错误:

    Unpacking objects: 100% (3/3), done.
    From <repo-location>
     * branch            development     -> FETCH_HEAD
    Auto-merging <files>
    CONFLICT (content): Merge conflict in <locations>
    Automatic merge failed; fix conflicts and then commit the result.

    Here I could fix the conflicts and commit , but that would leave me with a really ugly commit history: 在这里,我可以解决冲突并commit ,但这会使我留下非常丑陋的提交历史:

    C----D----E----F    topic
          /              /
    A----B--------------C'  development

    It might look enticing to use git pull --force but be careful because that'll leave you with stranded commits: 使用git pull --force可能看起来很诱人,但要小心,因为这会使您陷入搁浅的提交状态:

    D----E   topic
    
    A----B----C'         development

    So probably the best option is to do a git pull --rebase . 因此,最好的选择可能是执行git pull --rebase This will require me to resolve any conflicts like before, but for each step instead of committing I'll use git rebase --continue . 这将需要我像以前一样解决任何冲突,但是对于每一步,而不是提交,我将使用git rebase --continue In the end the commit history will look much better: 最后,提交历史看起来会更好:

    D'---E'  topic
               /
    A----B----C'         development

    Update 3: You can also use the --force-with-lease option as a "safer" force push, as mentioned by Cupcake in his answer : 更新3:您也可以使用--force-with-lease选项作为“更安全”的强制推送, 如Cupcake在他的回答中提到的

    Force pushing with a "lease" allows the force push to fail if there are new commits on the remote that you didn't expect (technically, if you haven't fetched them into your remote-tracking branch yet), which is useful if you don't want to accidentally overwrite someone else's commits that you didn't even know about yet, and you just want to overwrite your own: 如果使用“租用”强制推送,则如果遥控器上有您不期望的新提交(从技术上讲,如果尚未将其提取到远程跟踪分支中),则强制推送失败。您不想意外覆盖您甚至不知道的其他人的提交,而只想覆盖自己的提交:

     git push <remote> <branch> --force-with-lease 

    You can learn more details about how to use --force-with-lease by reading any of the following: 您可以通过阅读以下任何内容来了解​​有关如何使用--force-with-lease的更多详细信息:


    #3楼

    Another option (to avoid any forced push which can be problematic for other contributors) is to: 另一个选择(避免任何可能对其他贡献者造成问题的强行推送)是:

    • put your new commits in a dedicated branch 将您的新提交放入专门的分支
    • reset your master on origin/master 重置masterorigin/master
    • merge your dedicated branch to master , always keeping commits from the dedicated branch (meaning creating new revisions on top of master which will mirror your dedicated branch). 将您的专用分支合并到master ,始终保留专用分支的提交(这意味着在master上创建新的修订版本,以反映您的专用分支)。
      See " git command for making one branch like another " for strategies to simulate a git merge --strategy=theirs . 有关模拟git merge --strategy=theirs策略,请参见“ 使一个分支像另一个分支的git命令 ”。

    That way, you can push master to remote without having to force anything. 这样,您可以将master推送到远程,而无需强制执行任何操作。


    #4楼

    You want to force push 你想强行推

    What you basically want to do is to force push your local branch, in order to overwrite the remote one. 您基本上想要做的就是强制推送本地分支,以覆盖远程分支。

    If you want a more detailed explanation of each of the following commands, then see my details section below. 如果要对以下每个命令进行更详细的说明,请参阅下面的“我的详细信息”部分。 You basically have 4 different options for force pushing with Git: 基本上,您可以使用4种不同的方式来强制使用Git进行推送:

    git push <remote> <branch> -f
    git push origin master -f # Example
    
    git push <remote> -f
    git push origin -f # Example
    
    git push -f
    
    git push <remote> <branch> --force-with-lease
    

    If you want a more detailed explanation of each command, then see my long answers section below. 如果您想对每个命令进行更详细的说明,请参阅下面的“我的长答案”部分。

    Warning: force pushing will overwrite the remote branch with the state of the branch that you're pushing. 警告:强行推送将用您正在推送的分支的状态覆盖远程分支。 Make sure that this is what you really want to do before you use it, otherwise you may overwrite commits that you actually want to keep. 在使用它之前,请确保这是您真正想要做的,否则您可能会覆盖您实际想要保留的提交。

    Force pushing details 强制推送细节

    Specifying the remote and branch 指定遥控器和分支

    You can completely specify specific branches and a remote. 您可以完全指定特定的分支和远程。 The -f flag is the short version of --force -f标志是--force的简短版本

    git push <remote> <branch> --force
    git push <remote> <branch> -f
    

    Omitting the branch 省略分支

    When the branch to push branch is omitted, Git will figure it out based on your config settings. 如果省略了分支到push分支,Git将根据您的配置设置将其解决。 In Git versions after 2.0, a new repo will have default settings to push the currently checked-out branch: 在2.0之后的Git版本中,新的仓库将具有默认设置以推送当前已签出的分支:

    git push <remote> --force
    

    while prior to 2.0, new repos will have default settings to push multiple local branches. 在2.0之前的版本中,新存储库将具有默认设置以推送多个本地分支。 The settings in question are the remote.<remote>.push and push.default settings (see below). 有问题的设置是remote.<remote>.pushpush.default设置(请参见下文)。

    Omitting the remote and the branch 省略遥控器和分支

    When both the remote and the branch are omitted, the behavior of just git push --force is determined by your push.default Git config settings: 当省略remote和branch时,仅git push --force的行为由push.default Git配置设置确定:

    git push --force
    
    • As of Git 2.0, the default setting, simple , will basically just push your current branch to its upstream remote counter-part. 从Git 2.0开始,默认设置simple基本上只会将当前分支推送到其上游远程对等部分。 The remote is determined by the branch's branch.<remote>.remote setting, and defaults to the origin repo otherwise. 远程由分支的branch.<remote>.remote设置确定,否则默认为源branch.<remote>.remote

    • Before Git version 2.0, the default setting, matching , basically just pushes all of your local branches to branches with the same name on the remote (which defaults to origin). 在Git 2.0版之前,默认设置matching基本上只是将您的所有本地分支推送到远程上具有相同名称的分支(默认为起源)。

    You can read more push.default settings by reading git help config or an online version of the git-config(1) Manual Page . 您可以通过阅读git help configgit-config(1)手册页的在线版本来阅读更多push.default设置。

    Force pushing more safely with --force-with-lease 使用--force-with-lease强制更安全地推动

    Force pushing with a "lease" allows the force push to fail if there are new commits on the remote that you didn't expect (technically, if you haven't fetched them into your remote-tracking branch yet), which is useful if you don't want to accidentally overwrite someone else's commits that you didn't even know about yet, and you just want to overwrite your own: 如果使用“租用”强制推送,则如果遥控器上有您不期望的新提交(从技术上讲,如果尚未将其提取到远程跟踪分支中),则强制推送失败。您不想意外覆盖您甚至不知道的其他人的提交,而只想覆盖自己的提交:

    git push <remote> <branch> --force-with-lease
    

    You can learn more details about how to use --force-with-lease by reading any of the following: 您可以通过阅读以下任何内容来了解​​有关如何使用--force-with-lease的更多详细信息:


    #5楼

    git push -f is a bit destructive because it resets any remote changes that had been made by anyone else on the team. git push -f有点破坏性,因为它会重置团队中其他任何人所做的任何远程更改。 A safer option is {git push --force-with-lease}. 一个更安全的选择是{git push --force-with-lease}。

    What {--force-with-lease} does is refuse to update a branch unless it is the state that we expect; {--force-with-lease}所做的是拒绝更新分支,除非它是我们期望的状态。 ie nobody has updated the branch upstream. 即没有人更新上游分支。 In practice this works by checking that the upstream ref is what we expect, because refs are hashes, and implicitly encode the chain of parents into their value. 在实践中,这是通过检查上游ref是否符合我们的期望来实现的,因为ref是散列,并将父链隐式地编码为其值。 You can tell {--force-with-lease} exactly what to check for, but by default will check the current remote ref. 您可以确切告诉{--force-with-lease}要检查的内容,但是默认情况下会检查当前的远程引用。 What this means in practice is that when Alice updates her branch and pushes it up to the remote repository, the ref pointing head of the branch will be updated. 实际上,这意味着当Alice更新其分支并将其推送到远程存储库时,分支的ref指向头将被更新。 Now, unless Bob does a pull from the remote, his local reference to the remote will be out of date. 现在,除非Bob从遥控器上拉出,否则他对遥控器的本地引用将是过时的。 When he goes to push using {--force-with-lease}, git will check the local ref against the new remote and refuse to force the push. 当他使用{--force-with-lease}进行推送时,git将对照新的远程服务器检查本地引用,并拒绝强制进行推送。 {--force-with-lease} effectively only allows you to force-push if no-one else has pushed changes up to the remote in the interim. {--force-with-lease}仅在没有其他人在过渡期间将更改推到远程的情况下才有效地强制推入。 It's {--force} with the seatbelt on. 系上安全带可以{--force}。


    #6楼

    对我有用git push --set-upstream origin master -f

    展开全文
  • code-push常用命令

    千次阅读 2019-11-12 12:06:17
    1. code-push常用命令 deploymentNmae:Debug,Production 安装: npm install -g code-push-cli 注册账号: code-push register 登陆: code-push login 注销: code-push logout 添加项目: code-push app add ...

    1. code-push常用命令

      deploymentNmae:Debug,Production

    • 安装: npm install -g code-push-cli
    • 注册账号: code-push register
    • 登陆: code-push login
    • 注销: code-push logout
    • 添加项目: code-push app add [app名称]
    • 删除项目: code-push app remove [app名称]
    • 列出账号下的所有项目: code-push app list
    • 显示登陆的token: code-push access-key ls
    • 删除某个access-key: code-push access-key rm <accessKey>
    • 添加协作人员:code-push collaborator add <appName> next@126.com
    • 部署一个环境: code-push deployment add <appName> <deploymentName>
    • 删除部署: code-push deployment rm <appName>
    • 列出应用的部署: code-push deployment ls <appName>
    • 查询部署环境的key: code-push deployment ls <appName> -k
    • 查看部署的历史版本信息: code-push deployment history <appName> <deploymentNmae>
    • 重命名一个部署: code-push deployment rename <appName> <currentDeploymentName> <newDeploymentName>  

     

    2. 集成到项目

    1、在项目目录下, 安装CodePush插件

    npm install --save react-native-code-push

    2、引入到Xcode工程, 有两种方法, 第一种手动加入, 第二种使用rnpm自动引入, 第三种使用cocoaPods接入:

    第二种:

    安装rnpm: npm -g install rnpm xcode
    使用rnpm: rnpm link

    第三种:

    修改Podfile文件:(注意路径正确): 
    pod 'CodePush', :path => './node_modules/react-native-code-push'
    
    执行命令行更新pod:
    pod install 或者 pod install --verbose --no-repo-update

    3、在Xcode里AppDelegate.m里 修改

    //  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
    #ifdef DEBUG
      jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
    #else
      jsCodeLocation = [CodePush bundleURL];
    #endif

    4、修改info.plist 添加CodePushDeploymentKey键值对中的Staging的值,Deployment Key可以通过命令code-push deployment ls appName --displayKeys进行获取.也可以使用$(CODEPUSH_KEY)来自动适配Production或Staging环境, 如果填的是Production的key, 则打的包就是Production的包, 如果填的是Staging的key, 则打的包就是Staging的包.

    5、修改info.plist 中 Bundle versions string, short的值改成三位数字,如1.0.0, 不然会报错

    3. 发布更新

    • 自动打包发布

    自动打包你的js和资源文件成bundle并且上传发布到CodePush的服务器(注意: 默认是Staging环境):

    code-push release-react MyApp ios --plistFile ../MyApp/Info.plist -t "1.0.0" --des "测试完毕还原原状" -m true -d development
    • 手动打包发布

    自己打包有两种: 第一种只是更新js文件(可整个项目的js文件/当个js文件), 第二种js文件+images文件(release 整个文件夹)

    第一种单单js文件:

    1. 创建一个bundles文件夹
    打包命令: 
    // react-native bundle --platform 平台 --entry-file 启动文件 --bundle-output 打包js输出文件 --assets-dest 资源输出目录 --dev 是否调试 
    打包整个项目的js文件: 
    react-native bundle --platform ios --entry-file index.ios.js --bundle-output ./bundles/main.bundle --dev false
    
    2. 发布更新
    发布命令: 
    // code-push release <应用名称> <Bundles所在目录> <对应的应用版本> --deploymentName 更新环境 --description 更新描述 --mandatory 是否强制更新
    例如:
    code-push release HybridDemo ./bundles/main.bundle 1.0.0 --deploymentName Production --description "第四次更新" --mandatory true
    
    测试版的发布不能搞到正式版,promote命令 目前理解就是把测试环境copy到正式环境

    第二种js文件+图片资源:

    // 1. –assets-dest 后就是放图片的文件夹路径
    react-native bundle --platform ios --entry-file index.ios.js --bundle-output ./bundles/qqm.jsbundle --assets-dest ./bundles --dev false
    
    // 2. push bundles文件
    code-push <release/debug> <projectName(与注册的app同名)><bundle文件名> <版本号>
    例如: 
    code-push release appName ./bundles 1.0.0
    • 更新规则
    你APP内plist文件写的版本号可能是1.0.0,所以你的reactjs打包上传的版本也要是1.0.0(而不是1.0.1这样递增),你需要和APP保持一致,然后服务器会根据你最新上传的且和APP一样的版本作为最新版。
    
    范围表达式
    
    * 1.2.3 仅仅只有1.2.3的版本
    
    * *所有版本
    
    * 1.2.x 主要版本1,次要版本2的任何修补程序版本
    
    * 1.2.3 - 1.2.7 1.2.3版本到1.2.7版本
    
    * >=1.2.3 <1.2.7 大于等于1.2.3版本小于1.2.7的版本
    
    * ~1.2.3 大于等于1.2.3版本小于1.3.0的版本
    
    * ^1.2.3 大于等于1.2.3版本小于2.0.0的版本
    • 修改更新
    Usage: code-push patch <appName> <deploymentName> [--label <label>] [--description <description>] [--disabled] [--mandatory] [--rollout <rolloutPercentage>]
    
    选项:
      --label, -l           指定标签版本更新,默认最新版本 [string] [默认值: null]
      --description, --des  描述  [string] [默认值: null]
      --disabled, -x        是否禁用该更新  [boolean] [默认值: null]
      --mandatory, -m       是否强制更新  [boolean] [默认值: null]
      --rollout, -r         此更新推送用户的百分比,此值仅可以从先前的值增加。  [string] [默认值: null]
    
    示例:
      code-push patch MyApp Production --des "Updated description" -r 50         修改"MyApp"的"Production"部署中最新更新的描述 ,并且更新推送范围为50%
      code-push patch MyApp Production -l v3 --des "Updated description for v3"  修改"MyApp"的"Production"部署中标签为v3的更新的描述
    • 升级环境
    Usage: code-push promote <appName> <sourceDeploymentName> <destDeploymentName> [--description <description>] [--mandatory] [--rollout <rolloutPercentage>]
    
    选项:
      --description, --des  描述  [string] [默认值: null]
      --disabled, -x        是否禁用该更新  [boolean] [默认值: null]
      --mandatory, -m       是否强制更新  [boolean] [默认值: null]
      --rollout, -r         此促进更新推送用户的百分比  [string] [默认值: null]
    
    示例:
      code-push promote MyApp Staging Production                                   "MyApp"中"Staging"部署的最新更新发布到"Production"部署中
      code-push promote MyApp Staging Production --des "Production rollout" -r 25  "MyApp"中"Staging"部署的最新更新发布到"Production"部署中, 并且只推送25%的用户
    • 回滚更新
    Usage: code-push rollback <appName> <deploymentName> [--targetRelease <releaseLabel>]
    
    选项:
      --targetRelease, -r  指定回归到哪个标签,默认是回滚到上一个更新  [string] [默认值: null]
    
    示例:
      code-push rollback MyApp Production                     "MyApp"中"Production"部署执行回滚
      code-push rollback MyApp Production --targetRelease v4  "MyApp"中"Production"部署执行回滚,回滚到v4这个标签版本
    
    当部署的版本不同时,不能跨版本回滚。
    例如:CodePush历史版本中为2.10.1,此时发布2.10.2版本。
    当从2.10.2发起回滚操作回到2.10.1时,是不可行的。

    js内写法

    如果有发布热更新时 mandatory 则 Code Push 会根据 mandatory 是 true 或false 来控制应用是否强制更新。默认情况下 mandatory 为 false 即不强制更新。mandatory 为 false时以下三种设置方法才有效
    
    // 第一种:
    codePush.sync();
    
    // 第二种:
    codePush.sync({
        updateDialog: false,
        installMode: codePush.InstallMode.IMMEDIATE
    });
    
    // 第三种:
    CodePush.sync({
        deploymentKey: 'deployment-key-here',
        updateDialog: {
            optionalIgnoreButtonLabel: '稍后',
            optionalInstallButtonLabel: '后台更新',
            optionalUpdateMessage: '有新版本了,是否更新?',
            title: '更新提示'
        },
        installMode: CodePush.InstallMode.IMMEDIATE
    });
    
    三种更新的策略: 配置到installMode: 之后即可生效
    * IMMEDIATE 立即更新APP
    * ON_NEXT_RESTART 到下一次启动应用时
    * ON_NEXT_RESUME 当应用从后台返回时
    • 项目实际发布时使用命令
    1. 登录: code-push login
    2. 列出账号下的所有项目: code-push app list
    3. 列出应用的部署: code-push deployment ls MyApp
    4. 查看部署的历史版本信息: code-push deployment history MyApp Debug
    5. 发布版本更新: code-push release-react MyApp ios -d Staging -p ../MyApp/Info.plist --des 'UI调整' -t '1.0.2'
    6. 把更新推到另一个环境: code-push promote QQMProjec Staging Production
    7. 关闭某个版本: code-push patch MyApp Staging -l v13 --des '关闭v13' -x true

    注意:
    在关联项目登录的时候,有时候已经登录其他账号,需要查看登录账号或者退出的话
    进入reactnative 项目根目录执行命令查看当前是否登录,先保证没有别的账号正在登录

    code-push whoami

    如果报错如下,表示没有登录

    [Error]  You are not currently logged in. Run the 'code-push login' command to authenticate with the CodePush server.

    如果没有报错 且显示邮箱账号,则表示已经登录账户,我们要先注销当前账号

    code-push logout

    成功注销后执行登录指令,登录服务器

    code-push login http://localhost:8080

     

    参考文章:
    https://segmentfault.com/a/1190000008591456
    https://blog.csdn.net/zhuchuanwu2013/article/details/51262718
    https://www.jianshu.com/p/51b36ed583ef
    展开全文
  • RN中热更新CodePush使用

    千次阅读 2019-04-25 19:19:51
    RN中涉及到热更新使用微软提供的CodePush插件实现,具体使用如下: 更新流程 1、安装 code-push-cli插件(在项目根目录) npm install -g code-push-cli //全局安装code-push-cli插件 2、注册登录微软Code...

    RN中涉及到热更新使用微软提供的CodePush插件实现,具体使用如下:

    更新流程

     

    1、安装 code-push-cli插件(在项目根目录)

    npm install -g code-push-cli        //全局安装code-push-cli插件

    2、注册登录微软CodePush服务

    code-push register

       此时会打开一个网页

    选择一个账号登录,登录成功会自动创建一个token

    在terminal中继续输入上面获取的token

    Enter your token from the browser:  6921*********************0c33

    出现如下信息提示成功且自动登录CodePush服务(其中session被保存在.code-push.config文件中)

    Successfully logged-in. Your session file was written to /Users/xxxxx/.code-push.config. You can run the code-push logout command at any time to delete this file and terminate your session.

    打开.code-push.config文件可见accesskey

    3、向CodePush微软服务添加APP

        为了让CodePush服务器有我们的App,我们需要CodePush注册App(在项目根目录下执行)

    //注册Android
    code-push app add 应用名 android react-native
    //注册iOS
    code-push app add 应用名 ios react-native
    
    
    code-push app add RNDemo01 Android react-native   //将当前应用Android平台RNDemo01注册到服务

     向CodePush服务注册App之后会得到Production key和Staging key(Production-代表生产热更新部署,Staging-代表开发热更新部署),在ios中将Staging的部署key复制在info.plist的CodePushDeploymentKey值中,在android中复制在Application的getPackages的CodePush中。

    注意:注意如果我们的应用分为iOS和Android两个平台,这时我们需要分别注册两套key。

    查看已经在CodePush注册的APP

    code-push app list

    4、原生应用中配置CodePush

    这里原生应用中配置CodePush我们需要分别配置iOS平台和Android平台

    配置iOS平台

    • 使用Xcode打开项目,Xcode的项目导航视图中的PROJECT下选择你的项目,选择Info页签 ,在Configurations节点下单击 + 按钮 ,选择Duplicate "Release Configaration,输入Staging

    • 选择Build Settings tab,搜索Build Location -> Per-configuration Build Products Path -> Staging,将之前的值:
    $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
      改为:
    $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

     

    • 选择Build Settings tab,点击 + 号,选择Add User-Defined Setting,将key设置为CODEPUSH_KEY,Release 和 Staging的值为前面创建的key,我们直接复制进去即可

    • 打开Info.plist文件,在CodePushDeploymentKey中输入$(CODEPUSH_KEY),并修改Bundle versions为三位

    iOS平台CodePush环境集成完毕。

    配置Android平台

    在android中将部署key复制在Application的getPackages的CodePush中。

     

    5、在RN代码中集成CodePush

    在使用之前需要考虑的是检查更新时机,更新是否强制更新是否要求即时

    更新时机

    一般常见的应用内更新时机分为两种,一种是打开App就检查更新,一种是放在设置界面让用户主动检查更新并安装

    打开APP就检查更新

    最为简单的使用方式在React Natvie的根组件的componentDidMount方法中通过codePush.sync()(需要先导入codePush包:import codePush from 'react-native-code-push')方法检查并安装更新,如果有更新包可供下载则会在重启后生效。不过这种下载和安装都是静默的,即用户不可见。如果需要用户可见则需要额外的配置。具体可以参考codePush官方API文档,部分代码,完整代码请参照文档上面

    CodePush.sync( {
                    //更新是否要求即时
                    //ON_NEXT_RESUME 下次恢复到前台时
                    //ON_NEXT_RESTART 下一次重启时
                    //IMMEDIATE 马上更新
                    installMode : CodePush.InstallMode.IMMEDIATE ,
                    //对话框
                    updateDialog : {
                        //是否显示更新描述
                        appendReleaseDescription : true ,
                        //更新描述的前缀。 默认为"Description"
                        descriptionPrefix : "更新内容:" ,
                        //强制更新按钮文字,默认为continue
                        mandatoryContinueButtonLabel : "立即更新" ,
                        //强制更新时的信息. 默认为"An update is available that must be installed."
                        mandatoryUpdateMessage : "必须更新后才能使用" ,
                        //非强制更新时,按钮文字,默认为"ignore"
                        optionalIgnoreButtonLabel : '稍后' ,
                        //非强制更新时,确认按钮文字. 默认为"Install"
                        optionalInstallButtonLabel : '后台更新' ,
                        //非强制更新时,检查到更新的消息文本
                        optionalUpdateMessage : '有新版本了,是否更新?' ,
                        //Alert窗口的标题
                        title : '更新提示'
                    } ,
                } ,
            );

    上面的配置在检查更新时会弹出提示对话框, mandatoryInstallMode表示强制更新,appendReleaseDescription表示在发布更新时的描述会显示到更新对话框上让用户可见

    用户点击检查更新按钮

    在用户点击检查更新按钮后进行检查,如果有更新则弹出提示框让用户选择是否更新,如果用户点击立即更新按钮,则会进行安装包的下载(实际上这时候应该显示下载进度,这里省略了)下载完成后会立即重启并生效(也可配置稍后重启),部分代码如下

    codePush.checkForUpdate(deploymentKey).then((update) => {
        if (!update) {
            Alert.alert("提示", "已是最新版本--", [
                {
                    text: "Ok", onPress: () => {
                    console.log("点了OK");
                }
                }
            ]);
        } else {
            codePush.sync({
                    deploymentKey: deploymentKey,
                    updateDialog: {
                        optionalIgnoreButtonLabel: '稍后',
                        optionalInstallButtonLabel: '立即更新',
                        optionalUpdateMessage: '有新版本了,是否更新?',
                        title: '更新提示'
                    },
                    installMode: codePush.InstallMode.IMMEDIATE,
    
                },
                (status) => {
                    switch(status) {
                        case codePush.SyncStatus.CHECKING_FOR_UPDATE:
                            console.log("Checking for updates.");
                        break;
                            case codePush.SyncStatus.DOWNLOADING_PACKAGE:
                            console.log("Downloading package.");
                        break;
                            case codePush.SyncStatus.INSTALLING_UPDATE:
                            console.log("Installing update.");
                        break;
                            case codePush.SyncStatus.UP_TO_DATE:
                            console.log("Installing update.");
                        break;
                            case codePush.SyncStatus.UPDATE_INSTALLED:
                            console.log("Update installed.");
                        break;
            }
                },
                (progress) => {
                    console.log(progress.receivedBytes + " of " + progress.totalBytes + " received.");
                }
            );
        }
     }

    更新是否强制

    如果是强制更新需要在发布的时候指定,发布命令中配置--m true

    更新是否要求即时

    在更新配置中通过指定installMode来决定安装完成的重启时机,亦即更新生效时机

    • codePush.InstallMode.IMMEDIATE:表示安装完成立即重启更新

    • codePush.InstallMode.ON_NEXT_RESTART:表示安装完成后会在下次重启后进行更新

    • codePush.InstallMode.ON_NEXT_RESUME:表示安装完成后会在应用进入后台后重启更新

    6、如何发布CodePush更新包

    在将RN的bundle放到CodePush服务器之前,我们需要先生成bundle,在将bundle上传到CodePush

    生成bundle

    • 我们在RN项目根目录下线创建bundle文件夹,再在bundle中创建创建ios和android文件夹,最后将生成的bundle文件和资源文件拖到我们的项目工程中

    生成bundle命令 react-native bundle --platform 平台 --entry-file 启动文件 --bundle-output 打包js输出文件 --assets-dest 资源输出目录 --dev 是否调试

    react-native bundle --platform android --entry-file index.js --bundle-output ./bundle/android/android.bundle --assets-dest ./android/app/src/main/res/ --dev false
    

    执行命令后bundle文件会自动生成在我们指定的文件夹下面。

    上传bundle到CodePush服务器

    code-push release-react <Appname> <Platform> --t <本更新包面向的旧版本号> --des <本次更新说明>

    code-push release-react RNDemo01 android --t 1.0.1 --des "这是第一个更新包"
    

    注意: CodePush默认是更新Staging 环境的,如果发布生产环境的更新包,需要指定--d参数:--d Production,如果发布的是强制更新包,需要加上 --m true强制更新

     

    查看发布的历史记录,命令如下

    查询Production

    code-push deployment history projectName Production

    查询Staging

    code-push deployment history projectName Staging

    code-push deployment history RNDemo01 Staging
    

    PS:

    • 发布更新包命令中的 -- t 对应的参数是和我们项目中的版本号一致的,这个不要误理解为是更新包的版本号,例如项目中的版本号为1.0.0, 这时如果我们需要对这个1.0.0 版本的项目进行第一次热更新,那么命令中的 -- t 也为1.0.0,第二次热更新任然为1.0.0

    • 项目的版本号需要改为三位的,默认是两位的,但是CodePush需要三位数的版本号

    • 发布更新应用时,应用的名称必须要和之前注册过的应用名称一致

    7、CodePush常用命令

    // 账户相关
    code-push login 登陆
    code-push loout 注销
    code-push access-key ls 列出登陆的token
    code-push access-key rm <accessKye> 删除某个 access-key
    // app操作相关
    code-push app add <appName> <platform> react-native  在账号里面添加一个新的app
    code-push app remove 或者 rm 在账号里移除一个 app
    code-push app rename 重命名一个存在 app
    code-push app list 或则 ls 列出账号下面的所有 app
    code-push app transfer 把app的所有权转移到另外一个账号
    // 应用信息相关
    code-push deployment add <appName> 部署
    code-push deployment rm <appName> 删除部署
    code-push deployment rename <appName> 重命名
    code-push deployment ls <appName> 列出应用的部署情况
    code-push deployment ls <appName> -k 查看部署的key
    code-push deployment history <appName> <deploymentName> 查看历史版本
    // 发布
    code-push release-react <appName> <platform> -t 版本  -d 环境  --des 描述 -m true (强制更新)
    // 清除历史部署记录
    code-push deployment clear <appName> Production or Staging
    // 回滚
    code-push rollback <appName> Production --targetRelease v4(codepush服务部署的版本号)

    注意事项
    1. 更新规则

    1.1 CodePush部署版本 > App版本

        更新可用,但当前版本比运行版本高。不作更新

    1.2. CodePush部署版本 < App版本

        不执行更新处理

    1.3. CodePush部署版本 == App版本

        自动下载更新,并根据加载策略加载最新bundle

    2. 回滚 

        2.1当部署的版本不同时,不能跨版本回滚。

        例如:CodePush历史版本中为2.10.1,此时发布2.10.2版本。当从2.10.2发起回滚操作回到2.10.1时,是不可行的。

    8、部署信息参数

    在部署了版本之后,执行 【code-push deployment ls uniApp-Android】可以查看当前版本、当前部署环境下的部署信息

    . Update Metadata(更新信息)

        Label:标识当前部署版本,每部署新版本,版本号增加1

        App Version:当前部署的App版本号

        Mandatory:是否强制更新

        Release Time:部署时间

        Released By:部署用户

        Description:部署 描述信息

    从上面内容不难发现,这些信息基本都会在我们执行 code-push release 时配置

    2. Install Metrics(安装指标) 

        Active:成功安装并运行当前release的用户的数量,即表示当前下载更新部署的活跃用户数量,of 左边数会随着用户安装、卸载而 增加、减少。of右边数代表当前安装或收到部署版本的用户数,当有用户卸载App,该数值会降低。因此它很好的解释了当前更新包有多少活跃用户,多少用户接收过这个安装包

        Total:成功安装部署当前release的用户量,只增不减    Pending:当前release版本被下载的数量,但是还没有被安装,该值会随着用户下载安装后增加, 在卸载时降低
     

    原文地址

    参考文章:

    https://blog.csdn.net/u013718120/article/details/78344866

    https://www.jianshu.com/p/9b39710ebb4e

     

    展开全文
  • 手把手教你接入快应用Push

    千次阅读 2020-10-20 15:04:49
    快应用提供了标准的Push能力,开发者可以给用户推送消息,比如推送一本好书、推送一个美食等,点击消息可以拉起快应用。 适用场景 场景一:购物 商城类快应用通过接入Push,给用户推送心仪商品的降价通知。 场景...
  • Git原理杂谈之pull/push命令

    万次阅读 多人点赞 2019-08-01 22:11:24
    这边文章是基于之前三篇文章的后续篇,之前三篇能够帮助小白同学概要性地理解Git的整体原理及快速掌握Git基本技能以进入团队开发,所以建议对Git只...好了废话不多说了,直接进入今天的主题——git push/ git pull命...
  • 之前在介绍vector的初始化的时候有介绍到容器的push_back操作,push_back基本所有容器都支持,而push_front则是有的支持有的不支持。insert和push_back一样,所有容器都支持。 这里简单介绍一下三种不同添加元素的...
  • APNs Push Notification教程一

    千次阅读 2018-12-15 12:26:33
    ##说明push的作用## push notifications allow developers to reach users and perform small tasks — even when users aren’t actively using an app! In this tutorial, you’ll learn how to configure your ...
  • UniPush使用指南

    千次阅读 2019-06-27 09:22:00
    原贴:... UniPush使用指南 分类:uni-app Pushunipush ...从HBuilderX 1.7.2起,uni-app支持UniPush。从HBuilderX 2.0.3 alpha起,5+App支持UniPush。...uniPush的客户端jsapi不是uni.push,...
  • Web Push功能使用

    千次阅读 2018-09-05 18:48:09
    本文主要介绍H5的桌面通知和web push,H5的Notification主要用于向用户展示通知,而web push 主要用于订阅推送消息。
  • 最近在写一个简单的jq的id元素获取的实现,在使用push遇到了点小麻烦。感觉pushpush.call实现都可以,但是push无法实现。 代码大致意思是:通过封装了的循环函数去获取id元素,在循环函数中实现改变元素样式。...
  • 华为推送服务(Push)

    千次阅读 2019-06-05 22:56:22
    Huawei PUSH(华为推送服务)是华为为开发者提供的消息推送平台 1. 华为服务简介 是什么华为推送服务? 云端到终端的消息推送通道。PUSH通道拥有高到达率,推送速度每秒最高可达百万级,消息量每日百亿级,并且支持...
  • push方法

    万次阅读 2019-04-04 17:18:20
    push方法push()方法的使用基本用法使用数组扩展将一个数组的元素依次添加到一个数组中使用call()或apply()在对象中使用push() push()方法的使用 push()方法在数组的尾部添加一个或多个元素,并返回数组新的长度,...
  • leftPush和rightPush区别

    千次阅读 2020-02-18 00:04:38
    redisTemplate.opsForList().leftPush() 实际调用的是lPush return connection.lPush(rawKey, new byte[][]{rawValue}); redisTemplate.opsForList().rightPush() 调用的是rPush lPush将数据添加到key对应的现有数据...
  • unipush实现ios、android推送教程

    万次阅读 热门讨论 2020-01-19 19:43:01
    2.unipush支持很多推送模板,有兴趣了解的朋友可以在 官网 查看,因为要给ios实现推送的话只能使用透传模板,所以要实现给安卓和ios都可以推送的话,要在官网示例的透传模板代码上做些许修改; 3.即便代码和推送...
  • 前两天在配置codePush时找到了一篇总结的非常好的文章,在这里分享给大家https://www.jianshu.com/p/28589c0be542?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_...
  • IDEA撤销Git已经push的操作;Git取消push的操作

    千次阅读 多人点赞 2021-04-14 21:13:38
    新进公司,用的Git,之前一直用的svn,使用IDEA撤销已经push的代码搞了半天,尴尬的一逼,还三年经验的程序员呢。就这。。。。特此记录此篇博客。 IDEA 撤销已经push的操作 1、从Git拉取代码 2、修改本地配置文件,...
  • Git push

    千次阅读 2019-05-28 10:38:48
    在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地... git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如git push origin master:re...
  • 参考资料:https://github.com/Microsoft/react-native-code-push 环境:react-native(0.58.6) ...code-push app add <appName> <os> <platform> 生成发布环境的DelopmentKey:Productio...
  • java中的push方法 ArrayDeque类push()方法 (ArrayDeque Class push() method) push() Method is available in java.lang package. push()方法在java.lang包中可用。 push() Method is used to push an element onto ...
  • C++ push方法与push_back方法

    万次阅读 2018-11-23 14:38:39
    pushpush_back是STL中常见的方法,都是向数据结构中添加元素。初识STL,对于添加元素的方法以产生混淆,这里暂对两种方法作出比较分析。此外,本文还将简述push对应的stack与queue系列,常见方法的介绍,以及与...
  • stack push_Java Stack push()方法与示例

    千次阅读 2020-08-01 09:07:22
    stack push 堆栈类push()方法 (Stack Class push() method) push() method is available in java.util package. push()方法在java.util包中可用。 push() method is used to push the given element (ele) onto ...
  • C++ push方法与push_back方法 浅析

    万次阅读 2019-01-16 15:10:35
    pushpush_back是STL中常见的方法,都是向数据结构中添加元素。初识STL,对于添加元素的方法以产生混淆,这里暂对两种方法作出比较分析。此外,本文还将简述push对应的stack与queue系列,常见方法的介绍,以及与...
  • git push origin master和git push的区别

    万次阅读 多人点赞 2019-07-28 11:04:24
    git push是git push origin master的一种简写形式,推荐使用git push origin master。
  • 对闲鱼的用户来说,Push更是与用户息息相关,因为闲鱼商品库存只有一件,商品的时效性很强,所以当用户关注的卖家上新、浏览的商品发生降价或者是平台为用户找到一批高性价比商品时,用户都期望尽快被通知。Push已经...
  • unipush+java+个推实现app消息推送

    千次阅读 热门讨论 2020-08-26 11:09:15
    但是无奈被墙,所以各个大厂就自己各搞一套,那我们开发者如果每个都去开发一套成本就太高了,所以就需要借助第三方通道,让他们帮我们处理,目前比较火的有个推,极光等等,由于前段使用unipush,它使用的是个推,...
  • idea git push 远程地址配置 项目目录下.git文件下config 文件 [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [submodule]...
  • 小米push

    千次阅读 2016-01-11 17:55:36
    最近在看小米push的SDK,今天总结总结。小米为什么要开发push这个要从苹果iPhone的push谈起。1.IOS的push原理我们知道iPhone的APP从前台退到后台进程就处于挂起状态了,不在运行了,流量也不在消耗了。那么,如果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,174,929
精华内容 869,971
关键字:

push