xamarin forms with Jpush (极光推送)

Recently, I started a project using xamarin forms which targets both ios and android platform. The intention of these posts is to share the knowledge about xamarin forms and analyze the pros and cons of the technology. 

Push notification that pushes message to registered devices, is becoming an essential component of any mature APP. There are many powerful as well as cost efficient push notification provider around the global, such as Google cloud messaging, Amazon simple notification service and Baidu. Jpush(极光推送 ) is our selected provider for the specific application as the simplicity of configuration. 

 

Android:

(1) Firstly, download xamainr.jpush dll file and then add it to the reference foder under droid project. 

 

(2) Initialize the JPush at OnCreate method under MainActivity. 

(3) Configure AndroidMainfest.xml file to support JPush, please refer to Jpush documentation for detailed configuration 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="Your Package"
    android:versionCode="100"
    android:versionName="1.0.0"
    >
  
    <!-- Required -->
    <permission android:name="Your Package.permission.JPUSH_MESSAGE" android:protectionLevel="signature" />
   
    <!-- Required -->
    <uses-permission android:name="You Package.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.WAKE_LOCK" />
    <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.VIBRATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 
    <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!--since 1.6.0 -->
     
    <!-- Optional. Required for location feature -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <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" />
     
应用包名及appkey替换:   
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:name="Your Application">
         
        <!-- Required -->
        <service
            android:name="cn.jpush.android.service.PushService"
            android:enabled="true"
            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>
         
        <!-- Required -->
        <receiver
            android:name="cn.jpush.android.service.PushReceiver"
            android:enabled="true" >
          <intent-filter android:priority="1000"> <!--since 1.3.5 -->
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <!--since 1.3.5 -->
                <category android:name="Your Package" /> <!--since 1.3.5 -->
            </intent-filter> <!--since 1.3.5 -->
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <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核心功能-->
        <activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="orientation|keyboardHidden" >
            <intent-filter>
                <action android:name="cn.jpush.android.ui.PushActivity" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="Your Package" />
            </intent-filter>
        </activity>
        <!-- Required SDK核心功能-->
        <service
            android:name="cn.jpush.android.service.DownloadService"
            android:enabled="true"
            android:exported="false" >
        </service>
        <!-- Required SDK核心功能-->
        <receiver android:name="cn.jpush.android.service.AlarmReceiver" />
      
        <!-- Required. For publish channel feature -->
        <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
        <!-- 例如: -->
        <!-- 发到 Google Play 的APK可以设置为 google-play; -->
        <!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
        <!-- 目前这个渠道统计功能的报表还未开放。-->
        <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
        <!-- Required. AppKey copied from Portal -->
        <meta-data android:name="JPUSH_APPKEY" android:value="Your AppKey"/>
    </application>
</manifest>

 

IOS:

(1) Add ThinkPower.BindingIOS.JPush package to iOS project using Nuget.

Remembe to tick show pre-release packages checkbox at left-bottom of the page, as the package has not been official released yet.

 

2. Initialize Jpush at FinishedLaunching method under AppDe

 1             //set up jpush
 2             APService.RegisterForRemoteNotificationTypes (1, new NSSet());
 3             APService.RegisterForRemoteNotificationTypes (2, new NSSet());
 4             APService.RegisterForRemoteNotificationTypes (4, new NSSet());                
 5 
 6             options = new NSDictionary();
 7             APService.SetupWithOption(options);
 8 
 9             LoadApplication (new App (new Setup()));
10 
11             return base.FinishedLaunching (app, options);
[Export("setAliasCallBack:tags:alias:")]
public void setAliasCallBack(int iResCode, NSSet tags, NSString alias)
{
    var result = iResCode;
    if (result == 0){//success}
    
}
			
public override void RegisteredForRemoteNotifications (UIApplication application, NSData deviceToken)
{
    APService.RegisterDeviceToken (deviceToken); //register device with JPush server
    var alias = GenerateRandomNumber (10); //generate alias
    APService.SetAlias (alias, new ObjCRuntime.Selector("setAliasCallBack:tags:alias:"), this);	//push alias to JPush server

}
						
public override void ReceivedRemoteNotification (UIApplication application, NSDictionary userInfo)
{
	APService.HandleRemoteNotification (userInfo);
	application.ApplicationIconBadgeNumber = 0; //clear badge number after clicking message
}
			
public override void ReceivedLocalNotification (UIApplication application, UILocalNotification notification)
{
	APService.ShowLocalNotificationAtFront (notification, null);
}

  

  

   

posted @ 2016-06-20 19:13  tim_bo  阅读(842)  评论(0)    收藏  举报