极光推送_极光推送集成 - CSDN
精华内容
参与话题
  • 然后点击下一步推送设置 把你的工程应用名字输入: 应用包名就是build.gradle文件里的applicationId 名字 完成之后点击下载Demo Demo下载完成之后解压 ,压缩包 将libs文件夹里的工具jar包全部复制到你...

    先注册账户:

    然后点击开发者服务:点击打开链接

    创建应用:

    随便起个名字,但是最好和你的应用名字一样

    然后点击下一步推送设置

    把你的工程应用名字输入:

    应用包名就是build.gradle文件里的applicationId 名字

    完成之后点击下载Demo

    Demo下载完成之后解压 ,压缩包
    将libs文件夹里的工具jar包全部复制到你的项目中,记得编译

     

     

     

    将文件中的jar包导入工程中的libs文件夹 并引用, 
    在将res文件夹直接复制到项目中的src文件夹下的main文件夹里, 
    它会直接补齐你工程中缺少的部分,所以不用害怕它会替换掉你的原文件

     

     

     

    使用 android studio 的开发者,如果使用 jniLibs 文件夹导入 so 文件,则仅需将所有 cpu 类型的文件夹拷进去;如果将 so 文件添加在 module的libs 文件夹下,注意在 module 的 gradle 配置中添加一下配置:

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

    注意点,还有 jniLibs 空文件夹不要忘

     

     

     

     

    MyApp  类(记得在清单文件中添加name)

    public class MyApp extends Application {
        public static String registrationId ;//获取 极光推送的设备唯一性标识 RegistrationID
    
        @Override
        public void onCreate() {
            super.onCreate();
    
    
            //极光推送
            JPushInterface.setDebugMode(true); 	// 设置开启日志,发布时请关闭日志
            JPushInterface.init(this);  // 初始化 JPush
    
            registrationId = JPushInterface.getRegistrationID(this);//获取 极光推送的设备唯一性标识 RegistrationID
            Log.e("111111registrationId", "run:--------->:" + registrationId );
        }
    }

     

    MyReceiver

    TestActivity

    Logger 

    MyReceiver
    package com.sgy.sgy_jpush;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.text.TextUtils;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.util.Iterator;
    import cn.jpush.android.api.JPushInterface;
    
    /**
     * 自定义接收器
     * 
     * 如果不定义这个 Receiver,则:
     * 1) 默认用户会打开主界面
     * 2) 接收不到自定义消息
     */
    public class MyReceiver extends BroadcastReceiver {
    	private static final String TAG = "JIGUANG-Example";
    
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		try {
    			Bundle bundle = intent.getExtras();
    			Logger.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));
    
    			if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
    				String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
    				Logger.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
    				//send the Registration Id to your server...
    
    			} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
    				Logger.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
    //				processCustomMessage(context, bundle);
    
    			} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
    				Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知");
    				int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
    				Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);
    
    			} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
    				Logger.d(TAG, "[MyReceiver] 用户点击打开了通知");
    
    				//打开自定义的Activity
    				Intent i = new Intent(context, TestActivity.class);
    				i.putExtras(bundle);
    				//i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    				i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
    				context.startActivity(i);
    
    			} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
    				Logger.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
    				//在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..
    
    			} else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
    				boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
    				Logger.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
    			} else {
    				Logger.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
    			}
    		} catch (Exception e){
    
    		}
    
    	}
    
    	// 打印所有的 intent extra 数据
    	private static String printBundle(Bundle bundle) {
    		StringBuilder sb = new StringBuilder();
    		for (String key : bundle.keySet()) {
    			if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
    				sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
    			}else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){
    				sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
    			} else if (key.equals(JPushInterface.EXTRA_EXTRA)) {
    				if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) {
    					Logger.i(TAG, "This message has no Extra data");
    					continue;
    				}
    
    				try {
    					JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA));
    					Iterator<String> it =  json.keys();
    
    					while (it.hasNext()) {
    						String myKey = it.next();
    						sb.append("\nkey:" + key + ", value: [" +
    								myKey + " - " +json.optString(myKey) + "]");
    					}
    				} catch (JSONException e) {
    					Logger.e(TAG, "Get message extra JSON error!");
    				}
    
    			} else {
    				sb.append("\nkey:" + key + ", value:" + bundle.get(key));
    			}
    		}
    		return sb.toString();
    	}
    	
    	//send msg to MainActivity
    //	private void processCustomMessage(Context context, Bundle bundle) {
    //		if (MainActivity.isForeground) {
    //			String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
    //			String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
    //			Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION);
    //			msgIntent.putExtra(MainActivity.KEY_MESSAGE, message);
    //			if (!ExampleUtil.isEmpty(extras)) {
    //				try {
    //					JSONObject extraJson = new JSONObject(extras);
    //					if (extraJson.length() > 0) {
    //						msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);
    //					}
    //				} catch (JSONException e) {
    //
    //				}
    //
    //			}
    //			LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent);
    //		}
    //	}
    }
    
    TestActivity
    package com.sgy.sgy_jpush;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.TextView;
    import cn.jpush.android.api.JPushInterface;
    
    public class TestActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            TextView tv = new TextView(this);
            tv.setText("用户自定义打开的Activity");
            Intent intent = getIntent();
            if (null != intent) {
    	        Bundle bundle = getIntent().getExtras();
                String title = null;
                String content = null;
                if(bundle!=null){
                    title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
                    content = bundle.getString(JPushInterface.EXTRA_ALERT);
                }
                tv.setText("Title : " + title + "  " + "Content : " + content);
            }
            addContentView(tv, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        }
    
    }
    
    Logger 
    package com.sgy.sgy_jpush;
    
    import android.util.Log;
    
    /**
     * Created by efan on 2017/4/13.
     */
    
    public class Logger {
    
        //设为false关闭日志
        private static final boolean LOG_ENABLE = true;
    
        public static void i(String tag, String msg){
            if (LOG_ENABLE){
                Log.i(tag, msg);
            }
        }
        public static void v(String tag, String msg){
            if (LOG_ENABLE){
                Log.v(tag, msg);
            }
        }
        public static void d(String tag, String msg){
            if (LOG_ENABLE){
                Log.d(tag, msg);
            }
        }
        public static void w(String tag, String msg){
            if (LOG_ENABLE){
                Log.w(tag, msg);
            }
        }
        public static void e(String tag, String msg){
            if (LOG_ENABLE){
                Log.e(tag, msg);
            }
        }
    }
    

     

     

    清单文件:加权限:

        <!-- Required -->
        <permission
            android:name="com.sgy.sgy_jpush.permission.JPUSH_MESSAGE"
            android:protectionLevel="signature" />
    
        <!-- Required  一些系统要求的权限,如访问网络等-->
        <uses-permission android:name="com.sgy.sgy_jpush.permission.JPUSH_MESSAGE" />
        <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        
        <!-- Optional for location -->
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.GET_TASKS" />

     

            <!-- For test only 测试状态通知栏,需要打开的Activity -->
            <activity android:name="com.sgy.sgy_jpush.TestActivity" android:exported="false">
                <intent-filter>
                    <action android:name="jpush.testAction" />
                    <category android:name="jpush.testCategory" />
                </intent-filter>
            </activity>
    
            <!-- Rich push 核心功能 since 2.0.6-->
            <activity
                android:name="cn.jpush.android.ui.PopWinActivity"
                android:theme="@style/MyDialogStyle"
                android:exported="false">
            </activity>
    
            <!-- Required SDK核心功能-->
            <activity
                android:name="cn.jpush.android.ui.PushActivity"
                android:configChanges="orientation|keyboardHidden"
                android:theme="@android:style/Theme.NoTitleBar"
                android:exported="false">
                <intent-filter>
                    <action android:name="cn.jpush.android.ui.PushActivity" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="com.sgy.sgy_jpush" />
                </intent-filter>
            </activity>
    
            <!-- Required SDK 核心功能-->
            <!-- 可配置android:process参数将PushService放在其他进程中 -->
            <service
                android:name="cn.jpush.android.service.PushService"
                android:process=":pushcore"
                android:exported="false">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.REGISTER" />
                    <action android:name="cn.jpush.android.intent.REPORT" />
                    <action android:name="cn.jpush.android.intent.PushService" />
                    <action android:name="cn.jpush.android.intent.PUSH_TIME" />
                </intent-filter>
            </service>
            <!-- since 3.0.9 Required SDK 核心功能-->
            <provider
                android:authorities="com.sgy.sgy_jpush.DataProvider"
                android:name="cn.jpush.android.service.DataProvider"
                android:process=":pushcore"
                android:exported="false"
                />
    
            <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
            <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
            <service
                android:name="cn.jpush.android.service.DaemonService"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.DaemonService" />
                    <category android:name="com.sgy.sgy_jpush" />
                </intent-filter>
    
            </service>
            <!-- since 3.1.0 Required SDK 核心功能-->
            <provider
                android:authorities="com.sgy.sgy_jpush.DownloadProvider"
                android:name="cn.jpush.android.service.DownloadProvider"
                android:exported="true"
                />
            <!-- Required SDK核心功能-->
            <receiver
                android:name="cn.jpush.android.service.PushReceiver"
                android:enabled="true"
                android:exported="false">
                <intent-filter android:priority="1000">
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />   <!--Required  显示通知栏 -->
                    <category android:name="com.sgy.sgy_jpush" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.USER_PRESENT" />
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                </intent-filter>
                <!-- Optional -->
                <intent-filter>
                    <action android:name="android.intent.action.PACKAGE_ADDED" />
                    <action android:name="android.intent.action.PACKAGE_REMOVED" />
    
                    <data android:scheme="package" />
                </intent-filter>
            </receiver>
    
            <!-- Required SDK核心功能-->
            <receiver android:name="cn.jpush.android.service.AlarmReceiver" android:exported="false"/>
    
            <!-- User defined.  For test only  用户自定义的广播接收器-->
            <receiver
                android:name="com.sgy.sgy_jpush.MyReceiver"
                android:exported="false"
                android:enabled="true">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required  用户注册SDK的intent-->
                    <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required  用户接收SDK消息的intent-->
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required  用户接收SDK通知栏信息的intent-->
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  用户打开自定义通知栏的intent-->
                    <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 -->
                    <category android:name="com.sgy.sgy_jpush" />
                </intent-filter>
            </receiver>
            
            <!-- Required  . Enable it you can get statistics data with channel -->
            <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
            <meta-data android:name="JPUSH_APPKEY" android:value="da075747e2a374d552993f2a" /> <!--  </>值来自开发者平台取得的AppKey-->
    

     

     

     

    然后运行一下工程:

    在回到极光平台:点击打开链接

     

    哈哈哈,然后你就可以收到推送的消息啦,是不是很简单呢!!!

     

     

    最后在附上完整的AndroidManifest.xml清单文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.sgy.sgy_jpush">

        <!-- Required -->
        <permission
            android:name="com.sgy.sgy_jpush.permission.JPUSH_MESSAGE"
            android:protectionLevel="signature" />

        <!-- Required  一些系统要求的权限,如访问网络等-->
        <uses-permission android:name="com.sgy.sgy_jpush.permission.JPUSH_MESSAGE" />
        <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

        <!-- Optional for location -->
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.GET_TASKS" />

        <application
            android:name=".MyApp"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            <!-- For test only 测试状态通知栏,需要打开的Activity -->
            <activity android:name="com.sgy.sgy_jpush.TestActivity" android:exported="false">
                <intent-filter>
                    <action android:name="jpush.testAction" />
                    <category android:name="jpush.testCategory" />
                </intent-filter>
            </activity>

            <!-- Rich push 核心功能 since 2.0.6-->
            <activity
                android:name="cn.jpush.android.ui.PopWinActivity"
                android:theme="@style/MyDialogStyle"
                android:exported="false">
            </activity>

            <!-- Required SDK核心功能-->
            <activity
                android:name="cn.jpush.android.ui.PushActivity"
                android:configChanges="orientation|keyboardHidden"
                android:theme="@android:style/Theme.NoTitleBar"
                android:exported="false">
                <intent-filter>
                    <action android:name="cn.jpush.android.ui.PushActivity" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="com.sgy.sgy_jpush" />
                </intent-filter>
            </activity>

            <!-- Required SDK 核心功能-->
            <!-- 可配置android:process参数将PushService放在其他进程中 -->
            <service
                android:name="cn.jpush.android.service.PushService"
                android:process=":pushcore"
                android:exported="false">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.REGISTER" />
                    <action android:name="cn.jpush.android.intent.REPORT" />
                    <action android:name="cn.jpush.android.intent.PushService" />
                    <action android:name="cn.jpush.android.intent.PUSH_TIME" />
                </intent-filter>
            </service>
            <!-- since 3.0.9 Required SDK 核心功能-->
            <provider
                android:authorities="com.sgy.sgy_jpush.DataProvider"
                android:name="cn.jpush.android.service.DataProvider"
                android:process=":pushcore"
                android:exported="false"
                />

            <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
            <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
            <service
                android:name="cn.jpush.android.service.DaemonService"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.DaemonService" />
                    <category android:name="com.sgy.sgy_jpush" />
                </intent-filter>

            </service>
            <!-- since 3.1.0 Required SDK 核心功能-->
            <provider
                android:authorities="com.sgy.sgy_jpush.DownloadProvider"
                android:name="cn.jpush.android.service.DownloadProvider"
                android:exported="true"
                />
            <!-- Required SDK核心功能-->
            <receiver
                android:name="cn.jpush.android.service.PushReceiver"
                android:enabled="true"
                android:exported="false">
                <intent-filter android:priority="1000">
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />   <!--Required  显示通知栏 -->
                    <category android:name="com.sgy.sgy_jpush" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.USER_PRESENT" />
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                </intent-filter>
                <!-- Optional -->
                <intent-filter>
                    <action android:name="android.intent.action.PACKAGE_ADDED" />
                    <action android:name="android.intent.action.PACKAGE_REMOVED" />

                    <data android:scheme="package" />
                </intent-filter>
            </receiver>

            <!-- Required SDK核心功能-->
            <receiver android:name="cn.jpush.android.service.AlarmReceiver" android:exported="false"/>

            <!-- User defined.  For test only  用户自定义的广播接收器-->
            <receiver
                android:name="com.sgy.sgy_jpush.MyReceiver"
                android:exported="false"
                android:enabled="true">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required  用户注册SDK的intent-->
                    <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required  用户接收SDK消息的intent-->
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required  用户接收SDK通知栏信息的intent-->
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  用户打开自定义通知栏的intent-->
                    <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 -->
                    <category android:name="com.sgy.sgy_jpush" />
                </intent-filter>
            </receiver>

            <!-- Required  . Enable it you can get statistics data with channel -->
            <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
            <meta-data android:name="JPUSH_APPKEY" android:value="da075747e2a374d552993f2a" /> <!--  </>值来自开发者平台取得的AppKey-->


        </application>

    </manifest>

     

     

     

     

    展开全文
  • [一、百度一下:极光推送的官网] [二、进入官网,并注册账号登录] [三、点击“应用管理”,并“创建应用”] [四、应用名称、应用图标随意起名,上传,最后点击“创建我的应用”] [五、请...

    [一、百度一下:极光推送的官网]

     

    [二、进入官网,并注册账号登录]

     

     

    [三、点击“应用管理”,并“创建应用”]

     

     

    [四、应用名称、应用图标随意起名,上传,最后点击“创建我的应用”]

     

     

    [五、请记好你的AppKey,然后点击“完成推送设置”]

     

    [六、我们先测试android,请填入你”项目的包名”,最后点击保存,弹出一个窗口,我们点击确定]

     

     

    • 在项目的build.gradle的Module:app中获取包名

       

       

     

    【七、点击下载Demo】

     

    【八、下载完成后,建一个文件夹,把压缩包放进去然后解压到当前文件夹】

     

     

     

    【九、返回浏览器,点击查看集成指南】

     

     

     

    【十、我们选择自动集成】

     

     

    • 在项目的清单文件中,把service这段复制到application中去,tools报红就导包,name爆红先不管,省略号去掉

       

       

    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            //把service这段复制,tools报红就导包,name爆红先不管
            <service android:name="cn.jpush.android.service.PushService"
                android:process=":multiprocess"
                tools:node="replace" >
            </service>
            
        </application>
    
    
    • 确认android studio的 Project 根目录的主 gradle 中配置了jcenter支持。(新建project默认配置就支持)

     

    • 在 module 的 gradle 中添加依赖和AndroidManifest的替换变量。

       

       

    • 注意修改AppKey,并Sync Now

       

       

    【十一、Sync Now 等运行完毕就OK咯】

    【十二、开始推送(以上为自动集成步骤)】

    • 在清单文件AndroidManifest中,复制Required这段请求

       

       

    • 在清单文件中复制receiver这段

       

       

    
     <receiver
                android:name=".di.global.PushReceiver" //换成自己的receiver路径!!!
                android:enabled="true"
                android:exported="true" >
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.REGISTRATION" />
                    <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION" />
                    <action android:name="cn.jpush.android.intent.CONNECTION" />
                    <category android:name="com.example.myproject" />
                </intent-filter>
            </receiver>
    
    
    • 在工程中加混淆

       

       

    • 在项目中创建App继承Application,不要忘记在清单文件的Application中添加name!!!

       

       

       

       

    • 新建一个Receiver

       

       

       

       

    • 打开我们刚下的Demo,打开MyReceiver.java,把里面的内容都复制到项目的PushReceiver中去

       

       

       

       

    • 爆红了是吧,我们接着在下载的Demo中复制Logger.java到项目中去,直接复制啊!!!

       

       

    • 还爆红对不对,注意项目导的包,我们删除这个就好啦

       

       

    • 接下来创建一个Activity,是为了自定义推送的内容

       

       

    • 在Activity的布局中加一个TextView布局

       

       

    • 还有报红的没解决,接着来

       

       

    • 打开下载的Demo中的MainActivity,查找有关isForeground的所有代码,并复制到项目中的MainActivity中去

    public static boolean isForeground = false;
    
        @Override
        protected void onResume() {
            isForeground = true;
            super.onResume();
        }
    
    
        @Override
        protected void onPause() {
            isForeground = false;
            super.onPause();
        }
    
    • 打开下载的Demo中的MainActivity,查找有关isForeground的所有代码,并复制到项目中的MainActivity中去

       

       

    
        private MessageReceiver mMessageReceiver;
        public static final String MESSAGE_RECEIVED_ACTION = "com.example.jpushdemo.MESSAGE_RECEIVED_ACTION";
        public static final String KEY_TITLE = "title";
        public static final String KEY_MESSAGE = "message";
        public static final String KEY_EXTRAS = "extras";
    
        public void registerMessageReceiver() {
            mMessageReceiver = new MessageReceiver();
            IntentFilter filter = new IntentFilter();
            filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
            filter.addAction(MESSAGE_RECEIVED_ACTION);
            LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter);
        }
    
        public class MessageReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                try {
                    if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
                        String messge = intent.getStringExtra(KEY_MESSAGE);
                        String extras = intent.getStringExtra(KEY_EXTRAS);
                        StringBuilder showMsg = new StringBuilder();
                        showMsg.append(KEY_MESSAGE + " : " + messge + "\n");
                        if (!ExampleUtil.isEmpty(extras)) {
                            showMsg.append(KEY_EXTRAS + " : " + extras + "\n");
                        }
                        setCostomMsg(showMsg.toString());
                    }
                } catch (Exception e){
                }
            }
        }
    
    
    • 把这行删去,改为Toast
     setCostomMsg(showMsg.toString());//删除
    
    Toast.makeText(context, showMsg.toString(), Toast.LENGTH_SHORT).show();
    
    • 剩下最后一个爆红的了,打开下载的Demo并把ExampleUtil.java复制到项目中去

       

       

       

       

    • 返回浏览器,点击统计,发现我们的累积用户为0

       

       

    • 运行我们的项目到手机上去(模拟器也可以)

       

       

    • 刷新刚刚的浏览器,发现用户变成1了,表示集成成功,可以推送了

       

       

    • 点击浏览器的”推送---发送通知”,在输入框填写你想要推送的内容

       

       

    • 推送对象选择android,点击立即发送

       

       

    • 立即发送

       

       

     

     

    最后如果有朋友消息推送手机端收不到,可能是Manifest这块的receiver配置出错,

    将jpush版本改成3.3.0之前即可。

    另外还需注意jcore版本

    展开全文
  • 极光推送 使用实例 (一)服务端

    万次阅读 多人点赞 2015-07-09 09:58:51
    ...最近一直在做后台开发,但心里还是总惦记着Android,感觉还是...正好项目中要用到极光推送,今天抽空来记录下这两天的研究成果。  我们知道IOS有自己的推送服务,但很遗憾Android没有原生的推送服务,现在

    原文:http://blog.csdn.net/u014733374/article/details/43560983



    最近一直在做后台开发,但心里还是总惦记着Android,感觉还是Android有意思。正好项目中要用到极光推送,今天抽空来记录下这两天的研究成果。

             我们知道IOS有自己的推送服务,但很遗憾Android没有原生的推送服务,现在有很多第三方的推送服务,比如个推、极光、亚马逊、百度云、聚能等。今天我们就来研究下极光推送的后台服务器如何实现。

             关键点:

            1.首先最好是把极光官网java后台服务器的demo下载下来,里面有我们需要的jar包,以及example.

            2.极光推送的关键jpushClient = new JPushClient(masterSecret, appKey, 3);就是这个类。其中的参数需要我们从极光官网注册开发者,然后创建具体项目获取相应的两                 个key值。其中appKey值就是我们手机端对应的key值

            3.极光推送给我们提供了很多种推送的方式,我们可以选择某一个平台进行推送(Android ,IOS ,Windows Phone),也可以全部推送;我们可以针对某个特别的用户进行推送(设置alisa),也可以针对特别的群体进行推送(设置tag),第三个参数是设置推送保留的时间,只要在有效时间内上线就可以收到推送信息

            4. 极光推送现在都用https连接,提交请求是post,获取数据为get


            ok 接下来就看服务端的实现(JAVA),JdPush推送方法+一个Servlet

    :

    [java] view plaincopy
    1. package com.weiwend.jdpush;  
    2.   
    3. import org.slf4j.Logger;  
    4. import org.slf4j.LoggerFactory;  
    5.   
    6. import cn.jpush.api.JPushClient;  
    7. import cn.jpush.api.common.resp.APIConnectionException;  
    8. import cn.jpush.api.common.resp.APIRequestException;  
    9. import cn.jpush.api.push.PushResult;  
    10. import cn.jpush.api.push.model.Message;  
    11. import cn.jpush.api.push.model.Options;  
    12. import cn.jpush.api.push.model.Platform;  
    13. import cn.jpush.api.push.model.PushPayload;  
    14. import cn.jpush.api.push.model.audience.Audience;  
    15. import cn.jpush.api.push.model.audience.AudienceTarget;  
    16. import cn.jpush.api.push.model.notification.AndroidNotification;  
    17. import cn.jpush.api.push.model.notification.IosNotification;  
    18. import cn.jpush.api.push.model.notification.Notification;  
    19.   
    20. public class Jdpush {  
    21.      protected static final Logger LOG = LoggerFactory.getLogger(Jdpush.class);  
    22.   
    23.      // demo App defined in resources/jpush-api.conf   
    24.   
    25.     public static final String TITLE = "申通快递";  
    26.     public static final String ALERT = "祝大家新春快乐";  
    27.     public static final String MSG_CONTENT = "申通快递祝新老客户新春快乐";  
    28.     public static final String REGISTRATION_ID = "0900e8d85ef";  
    29.     public static final String TAG = "tag_api";  
    30.       
    31.     public  static JPushClient jpushClient=null;  
    32.       
    33.     public static void testSendPush(String appKey ,String masterSecret) {  
    34.           
    35.           
    36.           
    37.          jpushClient = new JPushClient(masterSecret, appKey, 3);  
    38.           
    39.         // HttpProxy proxy = new HttpProxy("localhost", 3128);  
    40.         // Can use this https proxy: https://github.com/Exa-Networks/exaproxy  
    41.          
    42.           
    43.         // For push, all you need do is to build PushPayload object.  
    44.         //PushPayload payload = buildPushObject_all_all_alert();  
    45.          //生成推送的内容,这里我们先测试全部推送  
    46.         PushPayload payload=buildPushObject_all_alias_alert();  
    47.           
    48.           
    49.         try {  
    50.             System.out.println(payload.toString());  
    51.             PushResult result = jpushClient.sendPush(payload);  
    52.             System.out.println(result+"................................");  
    53.               
    54.             LOG.info("Got result - " + result);  
    55.               
    56.         } catch (APIConnectionException e) {  
    57.             LOG.error("Connection error. Should retry later. ", e);  
    58.               
    59.         } catch (APIRequestException e) {  
    60.             LOG.error("Error response from JPush server. Should review and fix it. ", e);  
    61.             LOG.info("HTTP Status: " + e.getStatus());  
    62.             LOG.info("Error Code: " + e.getErrorCode());  
    63.             LOG.info("Error Message: " + e.getErrorMessage());  
    64.             LOG.info("Msg ID: " + e.getMsgId());  
    65.         }  
    66.     }  
    67.       
    68.     public static PushPayload buildPushObject_all_all_alert() {  
    69.         return PushPayload.alertAll(ALERT);  
    70.     }  
    71.       
    72.     public static PushPayload buildPushObject_all_alias_alert() {  
    73.         return PushPayload.newBuilder()  
    74.                 .setPlatform(Platform.all())//设置接受的平台  
    75.                 .setAudience(Audience.all())//Audience设置为all,说明采用广播方式推送,所有用户都可以接收到  
    76.                 .setNotification(Notification.alert(ALERT))  
    77.                 .build();  
    78.     }  
    79.       
    80.     public static PushPayload buildPushObject_android_tag_alertWithTitle() {  
    81.         return PushPayload.newBuilder()  
    82.                 .setPlatform(Platform.android())  
    83.                 .setAudience(Audience.all())  
    84.                 .setNotification(Notification.android(ALERT, TITLE, null))  
    85.                 .build();  
    86.     }  
    87.       
    88.     public static PushPayload buildPushObject_android_and_ios() {  
    89.         return PushPayload.newBuilder()  
    90.                 .setPlatform(Platform.android_ios())  
    91.                 .setAudience(Audience.tag("tag1"))  
    92.                 .setNotification(Notification.newBuilder()  
    93.                         .setAlert("alert content")  
    94.                         .addPlatformNotification(AndroidNotification.newBuilder()  
    95.                                 .setTitle("Android Title").build())  
    96.                         .addPlatformNotification(IosNotification.newBuilder()  
    97.                                 .incrBadge(1)  
    98.                                 .addExtra("extra_key""extra_value").build())  
    99.                         .build())  
    100.                 .build();  
    101.     }  
    102.       
    103.     public static PushPayload buildPushObject_ios_tagAnd_alertWithExtrasAndMessage() {  
    104.         return PushPayload.newBuilder()  
    105.                 .setPlatform(Platform.ios())  
    106.                 .setAudience(Audience.tag_and("tag1""tag_all"))  
    107.                 .setNotification(Notification.newBuilder()  
    108.                         .addPlatformNotification(IosNotification.newBuilder()  
    109.                                 .setAlert(ALERT)  
    110.                                 .setBadge(5)  
    111.                                 .setSound("happy")  
    112.                                 .addExtra("from""JPush")  
    113.                                 .build())  
    114.                         .build())  
    115.                  .setMessage(Message.content(MSG_CONTENT))  
    116.                  .setOptions(Options.newBuilder()  
    117.                          .setApnsProduction(true)  
    118.                          .build())  
    119.                  .build();  
    120.     }  
    121.       
    122.     public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras() {  
    123.         return PushPayload.newBuilder()  
    124.                 .setPlatform(Platform.android_ios())  
    125.                 .setAudience(Audience.newBuilder()  
    126.                         .addAudienceTarget(AudienceTarget.tag("tag1""tag2"))  
    127.                         .addAudienceTarget(AudienceTarget.alias("alias1""alias2"))  
    128.                         .build())  
    129.                 .setMessage(Message.newBuilder()  
    130.                         .setMsgContent(MSG_CONTENT)  
    131.                         .addExtra("from""JPush")  
    132.                         .build())  
    133.                 .build();  
    134.     }  
    135. }  


    可以看到上面我们推送平台设置的是所有平台,Audience设置为all(所有用户),这里key值和masterSecret值放在servlet中了。


    servlet很简单,只要传入两个key值,调用该方法就可以

    [java] view plaincopy
    1. package com.weiwend.jdpush.servlet;  
    2.   
    3. import java.io.IOException;  
    4.   
    5. import javax.servlet.ServletException;  
    6. import javax.servlet.http.HttpServlet;  
    7. import javax.servlet.http.HttpServletRequest;  
    8. import javax.servlet.http.HttpServletResponse;  
    9.   
    10. import com.sun.org.apache.xml.internal.serializer.utils.Utils;  
    11. import com.weiwend.jdpush.Jdpush;  
    12. import com.weiwend.jdpush.utils.Base64Utils;  
    13.   
    14. /** 
    15.  * Servlet implementation class tuisong 
    16.  */  
    17. public class tuisong extends HttpServlet {  
    18.     private static final long serialVersionUID = 1L;  
    19.          
    20.     private static final String appKey ="84cf5ee2099c654aa03a5d70";  
    21.     private static final String masterSecret = "7cf23f25a41806d5fd29e3c5";  
    22.       
    23.     public tuisong() {  
    24.         super();  
    25.         // TODO Auto-generated constructor stub  
    26.     }  
    27.   
    28.     /** 
    29.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    30.      */  
    31.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    32.         Jdpush.testSendPush(appKey,masterSecret);  
    33.         System.out.println("sucess");  
    34.     }  
    35.   
    36.     /** 
    37.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    38.      */  
    39.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    40.         // TODO Auto-generated method stub  
    41.     }  
    42.   
    43. }  


    最后来看下运行的结果,可以看到,提交数据是以json格式。如果返回{"msg_id":1663001319,"sendno":1981162191}这样数据说明推送已经成功发送


    [java] view plaincopy
    1. {"platform":"all","audience":"all","notification":{"alert":"祝大家新春快乐"},"options":{"sendno":1981162191,"apns_production":false}}  
    2. {"msg_id":1663001319,"sendno":1981162191}................................  
    3. sucess  


    源码分析:

     JPushClient jpushClient = new JPushClient(masterSecret, appKey, 3);实际上是实例化了一下三个类

    [java] view plaincopy
    1. public JPushClient(String masterSecret, String appKey, int maxRetryTimes) {  
    2.         _pushClient = new PushClient(masterSecret, appKey, maxRetryTimes);  
    3.         _reportClient = new ReportClient(masterSecret, appKey, maxRetryTimes);  
    4.         _deviceClient = new DeviceClient(masterSecret, appKey, maxRetryTimes);  
    5.     }  
    PushPayload payload = buildPushObject_all_all_alert();,PushPayload类里包含了传递和返回的所有数据

    [java] view plaincopy
    1. public class PushPayload implements PushModel {  
    2.     private static final String PLATFORM = "platform";  
    3.     private static final String AUDIENCE = "audience";  
    4.     private static final String NOTIFICATION = "notification";  
    5.     private static final String MESSAGE = "message";  
    6.     private static final String OPTIONS = "options";  
    7.       
    8.     private static final int MAX_GLOBAL_ENTITY_LENGTH = 1200;  // Definition acording to JPush Docs  
    9.     private static final int MAX_IOS_PAYLOAD_LENGTH = 220;  // Definition acording to JPush Docs  
    10.       
    11.     private static Gson _gson = new Gson();  
    12.       
    13.     private final Platform platform;  
    14.     private final Audience audience;  
    15.     private final Notification notification;  
    16.     private final Message message;  
    17.     private Options options;  
    18.       
    19.       
    20.     private PushPayload(Platform platform, Audience audience,   
    21.             Notification notification, Message message, Options options) {  
    22.         this.platform = platform;  
    23.         this.audience = audience;  
    24.         this.notification = notification;  
    25.         this.message = message;  
    26.         this.options = options;  
    27.     }  

     PushResult result = jpushClient.sendPush(payload);可以看到就是sendPost方法,然后接受返回的数据

    [java] view plaincopy
    1. public PushResult sendPush(PushPayload pushPayload) throws APIConnectionException, APIRequestException {  
    2.        Preconditions.checkArgument(! (null == pushPayload), "pushPayload should not be null");  
    3.          
    4.        if (_globalSettingEnabled) {  
    5.            pushPayload.resetOptionsTimeToLive(_timeToLive);  
    6.            pushPayload.resetOptionsApnsProduction(_apnsProduction);  
    7.        }  
    8.          
    9.        ResponseWrapper response = _httpClient.sendPost(_baseUrl + PUSH_PATH, pushPayload.toString());  
    10.          
    11.        return BaseResult.fromResponse(response, PushResult.class);  
    12.    }  

    另外我专门找了下sendNo如何生成的,其实就是随机生成的一个数字

    [java] view plaincopy
    1. public static Options sendno() {  
    2.        return newBuilder().setSendno(ServiceHelper.generateSendno()).build();  
    3.    }  

    [java] view plaincopy
    1. public static int generateSendno() {  
    2.        return RANDOM.nextInt((MAX - MIN) + 1) + MIN;  
    3.    }  

    大家有兴趣也可以详细看一下代码的实现.


             刚开始值直接下载的demo运行,一直提示Audience没有对应的用户,是引文Audience设置了别名alias,而用户里面并没有设置对应的alias,所以找不到对应的用户。
    最后我们来看一张图,再深入理解下极光推送的原理

    展开全文
  • JPush(极光推送)实战总结

    万次阅读 2016-03-18 11:11:35
    关于JPush极光推送是国内的服务厂商提供的一站式push服务(同时支持iOS、android),后面也加入了即时通讯的能力供app使用。致力于打造简单、可靠、价格有竞争力的服务(简单功能全免费,高级版才收费),让应用开发商...

    关于JPush

    极光推送是国内的服务厂商提供的一站式push服务(同时支持iOS、android),后面也加入了即时通讯的能力供app使用。致力于打造简单、可靠、价格有竞争力的服务(简单功能全免费,高级版才收费),让应用开发商可以聚焦业务开发,push相关的技术实现全部通过极光推送来解决,仅需调用极光推送的api即可。正因为如此,开发者小伙伴们对其的评价相当不错。笔者的app新增了从服务器往移动客户端下发简单消息的需求,多方权衡下,我们准备尝试jpush的服务来解决问题(这里仅介绍iOS端的集成过程)。

    集成步骤

    step1:去极光推送注册账号:https://www.jpush.cn/,并注册应用。

    step2:上传apns证书到极光,apns证书的生成步骤参考:

    http://docs.jpush.io/client/ios_tutorials/#ios_1
    仔细阅读该文档,上传成功后控制台的应用详情里面会显示“已验证”,说明证书有效。

    step3:对你的app工程重新配置,使用新的支持apns的provision文件(若此前应用已支持apns,可以不用换),否则后面无法正常获得device token.

    step4:集成其sdk,包括一个.a和一个.h文件,最新版本大约是2.1,其sdk中也包含了demo,注意在2.1版本之前需要创建一个plist文件用于保存秘钥信息等,在最新版本不需要此文件。

    sdk下载地址:https://www.jpush.cn/common/products#product-download

    step5:主要代码修改如下:

    appdelegate.h:

    static NSString *appKey = @"Your_app_key";
    static NSString *channel = @"Your_channel_identifier";
    static BOOL isProduction = NO;
    

    appdelegate.m:

    #import "JPUSHService.h"
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                          UIUserNotificationTypeSound |
                                                          UIUserNotificationTypeAlert)
                                              categories:nil];
        [JPUSHService setupWithOption:launchOptions appKey:appKey
                          channel:channel apsForProduction:isProduction];
        // your codes
        return YES;
    }
    
    - (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        NSLog(@"%@", [NSString stringWithFormat:@"Device Token: %@", deviceToken]);
        [JPUSHService registerDeviceToken:deviceToken];
    }
    
    - (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
    {
        NSLog(@"didReceiveRemoteNotification :%@", userInfo);
        [JPUSHService handleRemoteNotification:userInfo];
    }
    - (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:
    (void (^)(UIBackgroundFetchResult))completionHandler
    {
        NSLog(@"didReceiveRemoteNotification fetchCompletionHandler:%@", userInfo);
        [JPUSHService handleRemoteNotification:userInfo];
        completionHandler(UIBackgroundFetchResultNewData);
    }
    
    - (void)application:(UIApplication *)application
    didReceiveLocalNotification:(UILocalNotification *)notification
    {
    
        //[JPUSHService showLocalNotificationAtFront:notification identifierKey:nil];
    }
    

    监听自定义消息相关的通知(建议在你应用中创建一个单例的manager中专门管理):

            NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
            [defaultCenter addObserver:self
                              selector:@selector(networkDidSetup:)
                                  name:kJPFNetworkDidSetupNotification
                                object:nil];
            [defaultCenter addObserver:self
                              selector:@selector(networkDidClose:)
                                  name:kJPFNetworkDidCloseNotification
                                object:nil];
            [defaultCenter addObserver:self
                              selector:@selector(networkDidRegister:)
                                  name:kJPFNetworkDidRegisterNotification
                                object:nil];
            [defaultCenter addObserver:self
                              selector:@selector(networkDidLogin:)
                                  name:kJPFNetworkDidLoginNotification
                                object:nil];
            [defaultCenter addObserver:self
                              selector:@selector(networkDidReceiveMessage:)
                                  name:kJPFNetworkDidReceiveMessageNotification
                                object:nil];
            [defaultCenter addObserver:self
                              selector:@selector(serviceError:)
                                  name:kJPFServiceErrorNotification
                                object:nil];
    // handler
    - (void)networkDidSetup:(NSNotification *)notification
    {
        NSLog(@"networkDidSetup %@, alias=%@", [notification userInfo], [NSString stringWithFormat:@"iOS_%@", GSignInConfig.userID]);
        //针对设备给极光服务器反馈了别名,app服务端可以用别名来针对性推送消息
        [JPUSHService setTags:nil
                        alias:[NSString stringWithFormat:@"iOS_%@", GSignInConfig.userID]
             callbackSelector:nil
                       target:nil];
    }
    
    - (void)networkDidClose:(NSNotification *)notification
    {
        NSLog(@"networkDidClose %@", [notification userInfo]);
    }
    
    - (void)networkDidRegister:(NSNotification *)notification
    {
        NSLog(@"networkDidRegister %@", [notification userInfo]);
    }
    
    - (void)networkDidLogin:(NSNotification *)notification
    {
        NSLog(@"networkDidLogin %@", [notification userInfo]);
    }
    
    - (void)networkDidReceiveMessage:(NSNotification *)notification
    {
        NSLog(@"networkDidReceiveMessage notification = %@", notification);
    }
    
    - (void)serviceError:(NSNotification *)notification
    {
        NSDictionary *userInfo = [notification userInfo];
        NSString *error = [userInfo valueForKey:@"error"];
        NSLog(@"serviceError %@", error);
    }

    api参考:http://docs.jpush.io/client/ios_api/#api-ios

    step6:在控制台发送消息,对其进行测试。

    https://www.jpush.cn/push/apps/61466f6a310571060af61a13/push/message/
    在此处可以发送自定义消息和push消息,其中自定义消息只在前台接收,通过长连接发送。笔者这里只使用自定义消息,用于应用在前台时服务器向应用下发消息,实时性比较好。

    错误排查

    http://docs.jpush.io/client/ios_tutorials/
    参考上面链接的思维导图,结合demo(将demo的bundle id修改成你工程的bundle id,并配置你自己的mobile provision文件来对比测试),一般就可以解决常见问题。

    总结

    经过笔者几个小时的实战,即在应用内集成了Jpush的服务,应该说还是相当效率的。Jpush在速度、可靠性、文档等各方面表现都很不错,对开发者很友好。有此类需求的开发者小伙伴们可以优先考虑JPush的方案。

    展开全文
  • 使用极光推送详细步骤

    千次阅读 2018-04-23 11:08:05
    首先进入官网https://www.jpush.cn/,先注册一个账号。注册号以后,创建应用1、点击右上角进入个人中心2、点击创建应用3、在创建应用界面...4、创建完成后就能看到以下界面,这个界面中的AppKey就是我们等下要用的Key。...
  • 极光推送

    2020-10-19 10:02:35
    java 极光推送 <dependency> <groupId>cn.jpush.api</groupId> <artifactId>jpush-client</artifactId> <version>3.2.17</version> </dependency> <...
  • 极光推送实例

    2019-06-13 04:48:38
    为什么80%的码农都做不了架构师?>>> ...
  • 极光推送接入(一)

    千次阅读 2018-03-30 14:53:25
    极光推送接入(一)一,jar引入&lt;dependency&gt;  &lt;groupId&gt;cn.jpush.api&lt;/groupId&gt;  &lt;artifactId&gt;jpush-client&lt;/artifactId&gt;  &lt;...
  • 极光推送详细介绍

    千次阅读 2017-10-19 18:25:05
    一、极光推送介绍 说起推送,不得不提到极光,高效,稳定,最重要的是免费(用户量不是非常大的情况下),让它在推送界占据了很高地位,如果没有完全没有用过的话,还是要花点时间去研究一下,或者遇到一些问题,...
  • 一、推送在app端使用的比较多,常见的第三方推送有百度推送,极光推送,友盟推送等,其实原理都一样。以下介绍以下原理图: 1.设备绑定流程: 2.消息推送流程: 二、搞清楚了原理,下面我们来进行实战操作了 ...
  • 关于极光推送收不到通知的问题

    万次阅读 2016-11-10 11:21:50
    目前极光推送的SDK都是独立进程的, 从安卓SDK的1.8.0版本之后,为了解决市场上一些特殊ROM的限制, 新增了进程之间相互唤醒的功能, 只要有一个app的进程存在,那么就可以唤醒其他同样使用极光SDK的app进程,收到推...
  • 极光推送获取registrationID的方式

    千次阅读 2018-07-13 21:48:32
    极光推送1、通过Android端绑定tag,来进行推送2、第二种后台通过registrationID绑定来进行推送。获取registrationID的方式是在Application中进行获取如下JPushInterface.init(this); registrationID = JPushInterface...
  • 今天在集成极光推送的时候遇到了一个很无奈的问题,在推送时应用的通知图标一直显示极光的图标,折腾了许久也没折腾出来。 我先是将demo的包名改成自己的应用包名跑了一次,效果还行,然后就根据文档将推送sdk集成...
  • 极光推送--RegistrationID

    千次阅读 2017-11-17 11:24:54
    1、在极光推送注册成功后,一定会有这个值 2、在极光推送第一次注册成功后,...4、只要极光推送第一次注册成功了,RegistrationID 就会被保留在手机内,下次如果你是无网状态进入APP,你去获取这个ID都可以获取到 JPu
  • 这个具体参考极光推送的官方文档(http://docs.jiguang.cn/jpush/client/Android/android_senior/),只需在退出登录之后,将别名设置为空就好了。
  • 极光推送中有指定Registration ID推送或根据唯一标识推送的方法吗?文档我看了没有针对这个问题的解释。同时也没有看到文档中提供的相关接口。
  • 第二、确认你的推送证书是否已经过期 第三、确认你的APP_KEY是否和极光APP_KEY是否一致 第四、正确调用bindChannel,并成功返回appid、userid和channelid,而且appid请确认是正确的应用; 第五、确认代码与官方...
  • 极光推送不成功的解决方案

    千次阅读 2016-06-12 18:51:32
    https://www.jpush.cn/ 查看项目中是否存在相应的so文件,若没有,则在极光推送平台下载相应的文件; 查看清单文件中对应的包名是否是项目的包名; 查看手机中是否存在AppKey 相同的应用;如果存在,则删除
  • 2,是极光推送发送通知消息(不是自定义消息) 3,移动端接收到消息时,通知栏下拉后显示的通知消息的图标,能修改么,怎么修改。 ![如下qq的消息通知所示,修改成对应的应用图标]...
  • 极光推送设置别名和标签

    万次阅读 2018-08-27 18:35:40
    做项目需要用,上网看了下文档和博客,自己总结,以后还要用; 3.0.7版本的回调方法 设置别名和标签 通过回调处理返回的数据,6002是超时码,可以进行重连操作 private final Handler mHandler = new Handler() { ...
1 2 3 4 5 ... 20
收藏数 9,274
精华内容 3,709
关键字:

极光推送