Personal Project

Tuesday, June 14, 2016

Tutorial (1) : How to send Push Notifications to iPhone using Java ?

Get Started

In this tutorial, you will lean how Push Notifications work and how to send Push Notifications to iPhone using an open source library - JavaAPNS.

Apple Push Service Overview


1. An app registers to iOS to enable Push notification; iOS sends device`s UDID to APNS.
2. The app receives a “device token” from APNS. You can think of the device token as the address that push notifications will be sent to.
3. The app sends the device token to your server.
4. When something of interest to your app happens, the server sends a push notification to the Apple Push Notification Service with device token id.
5. APNS sends the push notification to the user’s device.

 Enable Provisioning Profiles and Certificates

To enable push notifications in your app, it needs to be signed with a provisioning profile that is configured for push. In addition, your server needs to sign its communications to APNS with an SSL certificate.

There are also two types of push server certificates:
- Development. If your app is running in Debug mode and is signed with the Development provisioning profile (Code Signing Identity is “iPhone Developer”), then your server must be using the Development certificate.

- Production. Apps that are distributed as Ad Hoc or on the App Store (when Code Signing Identify is “iPhone Distribution”) must talk to a server that uses the Production certificate. If there is a mismatch between these, push notifications cannot be delivered to your app.


Generating the Certificate Signing Request (CSR)

The first thing you need is your Push certificates. These identify you when communicating with APNS over SSL.

Generating the Apple Push Notification SSL certificate on Mac:






Enter your email address here. I’ve heard people recommended you use the same email address that you used to sign up for the iOS Developer Program, but it seems to accept any email address just fine.

Enter “PushChat” for Common Name. You can type anything you want here, but choose something descriptive. This allows us to easily find the private key later.

Check Saved to disk and click Continue. Save the file as “PushChat.certSigningRequest”.



Generating the private key




If you go to the Keys section of Keychain Access, you will see that a new private key has appeared in your keychain. Right click it and choose Export.

Save the private key as “PushChatCert.p12” and enter a passphrase.



4.   Making the App ID and SSL certificate
Log in to the iOS Provisioning Portal.

First, we are going to make a new App ID. Each push app needs its own unique ID because push notifications are sent to a specific application. (You cannot use a wildcard ID.)



Filled in the fields as follows:
Description: PushChat
Bundle Seed ID: Generate New (this is the default option)
Bundle Identifier: com.hollance.PushChat

It is probably best if you choose your own Bundle Identifier here – com.companyName.PushChat – instead of using mine. You will need to set this same bundle ID in your Xcode project.
This certificate is linked with your App ID. Your server can only send push notifications to that particular app, not to any other apps.
After you have made the App ID, it shows up like this in the list:



Click on the Configure link to open the Configure App ID screen.



choose Certificate Signing Request file, “PushChat.certSigningRequest” for the Development Push SSL Certificate.




Download SSL certificate.
Click Done to close the assistant and return to the Configure App ID screen.


As you can see, we have a valid certificate and push is now available for development. The development certificate is only valid for 3 months. When you are ready to release your app, repeat this process for the production certificate. The steps are the same.

Note: The production certificate remains valid for a year, but you want to renew it before the year is over to ensure there is no downtime for your app.



Until now, we have generated three files:

1. Push.certSigningRequest
2. PushChatCert.p12
3. aps_developer.cer

Wednesday, June 8, 2016

Useful commands to debug Android APK

// Install Android Apk
adb install apk

// Check Android devices
adb devices
 
// Dump Log 
adb logcat > logfile

// Dump Android and API version
adb shell getprop

[ro.build.version.release]: [4.1.2]   --> Android v 4.1.2
[ro.build.version.sdk]: [16           --> API 16 

   

Sunday, June 5, 2016

How to dump APP ID of an Android APK ?

// Install android-sdk-macosx

 // Edit
vim ~/.profile
export ANDROID_CMD_HOME=/Users/WeiShihHsun/Desktop/cocos2dx/android/android-sdk-macosx/build-tools/23.0.2/
export PATH=$ANDROID_CMD

// Relogin

// Dump AppId
aapt dump badging <path-to-apk> | grep package:\ name


 
 
 




Friday, June 3, 2016

Is OAuth secure enough for REST API ?

OAuth protocol is widely used for authorization of logging in users. Some famous social gaming platform companies like Line, Mobage, Gree, and DMM have also adapted this technology to develop their REST API.

You might have a question - is it secure enough to only use OAuth for REST API ?

From my experience, the answer is no.

Even if you adapt OAuth 2.0 to your REST system, your system still could be vulnerable to Man-In-Middle Attack. Because OAuth is based on HTTP protocol, you must set up SSL encryption protocol to assure your message being sent over HTTPS. Otherwise, the hacker can wiretap your communication and retrieve your account and password from wire packets.

In terms of development, it is actually very easy to develop a secure REST API server with high performance using Spring framework. I already created a very simple template at github. You just need to configure some settings and modify API controller files of Java as needed.

The source codes of Secure REST API  Server can be seen here

Thursday, June 2, 2016

How to get Video Info by using Youtube Datat API ?

Get Started

Youtube Data API has provided an HTTP interface to retrieve plenty of counter numbers to record who has seen or voted for your video. You simply send a GET request shown below to youtube and will get all the information related to your video.

GET Request

https://www.googleapis.com/youtube/v3/videos?id=[VIDEO ID]&key=[ API KEY]&fields=items%28id,snippet%28channelTitle,title,thumbnails%29,statistics%29&part=snippet,contentDetails,statistics

VIDEO ID is a unique key to identify the Video.
API KEY   is the key which you must create a service to use Youtube Data API at Google Developer API Console.

How to implement this feature in PHP ?

Send a GET Request to Youtube

 The function below shows how to send a GET request to Youtube by using Youtube Data  API.
function getYoutubeInfo($videoId, $key)
    {       
        // Get cURL resource
        $curl = curl_init();
        // Set some options - we are passing in a useragent too here
        curl_setopt_array($curl, array(
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_URL => 'https://www.googleapis.com/youtube/v3/videos?id='.$videoId.'&key='.$key.'&fields=items(id,snippet(channelTitle,title,thumbnails),statistics)&part=snippet,contentDetails,statistics',
            CURLOPT_USERAGENT => 'Your Agent Name'
        ));
        // Send the request & save response to $resp
        $resp = curl_exec($curl);
       
        $resp = json_decode($resp, true);
           
        if(!isset($resp['code']))
        {
            if(isset($resp['items']))
            {
                foreach ($resp['items'] as $data)
                {
                    $dataArray = array();
                    $dataArray = $data['snippet'];                                   
                                   
                    $tmpArray = $data['statistics'];
                    //  You can get ViewCount, likeCount, and CommentCount here
                    error_log("### get respond viewCount:" . $tmpArray['viewCount']. " likeCount" . $tmpArray['likeCount']. " commentCount:" .$tmpArray['commentCount']);               
               
                    //  You can get the image url of your video
                    return $dataArray['thumbnails'];

                }
            }
        }   
        // Close request to clear up some resources
        curl_close($curl);
        return;
    }






Monday, May 30, 2016

How to set up Master Slave replication for REST server using Spring framework ?


MYSQL replication architecture is vital for building high available REST API servers.
In order to avoid singe-point of failure problem, it`s recommended that setting 2 application servers and  Master-Slave database in MYSQL. Of course, you have to set up the application servers behind the load balancer.

The following details how to setup  REST API server by using Spring framework of Java.
How to set up MYSQL Master/Slave replication ?
// Edit
vim /src/main/resources/application.properties

## Master and Slave
spring.datasource.url = jdbc:mysql:replication://localhost1:3306,localhost2:3306/userdb 

The source codes of REST server can be seen here.

Wednesday, May 25, 2016

How to sniff packets for REST API on Ubuntu ?


Since the REST API is based on Http protocol, it is necessary to sniff the http header
and messages to assure that your applications function well.  The more you understand
how the Http messages work and communicate, the faster you can make your job done.

The command shown below might be useful for you to dump Http header and message while developing REST API on Ubuntu Linux. Its feature is as same as whireshark on Windows.


tcpdump -A -vvv -i [network card] port [ number]
 ex:
tcpdump -A -vvv -i eth0 port 8080


Thursday, May 12, 2016

How to validate Store Receipt for Apple Store and Google Play using Unity and PHP ?

Get Started

This tutorial will teach you how to validate Store receipt for Google Play and Apple Store using PHP and Unity.  You have to upload the PHP (verifyReceipt.php) to your server and set up the Unity plugin and add the following sample codes.

Import Unity Prime31 Plugin

Import Prime31 plugins StoreKit for Apple Store and In-App-Billing for Google Play into Unity.

How to setup In-App-Purchase for IOS ?

There are two steps for this.
  • Setup Item`s Product Id
  • Setup Payment Success Event to Get Receipt

Setup Item`s Product Id

Open a demo scene in folder
  /Plugins/Prime31/Storekit/demo/StoreKitTestScene.
Edit StoreKitGUIManager.cs and modify Product Id.
 /Plugins/Prime31/Storekit/demo/ StoreKitGUIManager.cs

 // XXXX is the product Id, which must match what you have in iTunes.
 var productIdentifiers = new string[] { "XXXX" };
 StoreKitBinding.requestProductData( productIdentifiers );

Setup Payment Success Event to Get Receipt

The following function aims to capture the receipt from Apple when the payment becomes successful, and send the receipt to PHP to validate the receipt`s correctness.
Edit /Plugins/Prime31/Storekit/demo/ StoreKitEventListener.cs

void purchaseSuccessfulEvent( StoreKitTransaction transaction )
   {
       Debug.Log( "purchaseSuccessfulEvent: " + transaction );

       // Get iOS receipt 
       string receipt = transaction.base64EncodedTransactionReceipt;

       // Build POST form
       WWWForm form = new WWWForm ();
       form.AddField ("key", "1234");
       form.AddField ("receipt", receipt);
       form.AddField ("en", "prod") // dev, prod
       form.AddField ("os", "ios")  // ios, android

       // Server URL
       string url = "http://your server IP/verifyPayment.php";

       // Process respond
       StartCoroutine(this.DoWWW(new WWW(url, form), (www) => {
           Debug.Log("-------- Callback Success: " + www.text);
       }));
   }

How to setup In-App-Billing for Android ?

There are two steps for this.
  • Setup App Public Key
  • Setup Item`s Product Id
  • Setup Payment Success Event to Get Receipt

Setup App Public Key

Open a demo scene in folder
/Plugins/ InAppBillingAndroid /demo/IABTestScene.unity
Setup Public key
Edit /Plugins/ InAppBillingAndroid /demo/ IABUIManager.cs

// Setup Public key 
var key = "Your Public Key on Google Play";

GoogleIAB.init( key );

Setup Item`s Product Id

Edit /Plugins/ InAppBillingAndroid /demo/ IABUIManager.cs

// Setup Product ID 
private string[] skus = new string[] 
{
    "XXXXXX"  //  your Product Id here 
};

GoogleIAB.queryInventory( skus );

Setup Payment Success Event to Get Receipt

Edit /Plugins/ InAppBillingAndroid /demo/ GoogleIABEventListener.cs


void purchaseCompleteAwaitingVerificationEvent( string purchaseData, string signature )
{
    Debug.Log( "purchaseCompleteAwaitingVerificationEvent. purchaseData: " + purchaseData + ", signature: " + signature );
    Prime31.Utils.logObject (purchaseData);
    Prime31.Utils.logObject (signature);

    // Google receipt 
    string receipt = purchaseData;

    // Initil POST form
    WWWForm form = new WWWForm ();
    form.AddField ("key", "1234");
    form.AddField ("os", "android");
    form.AddField ("en", "prod");
    form.AddField ("receipt", receipt);
    form.AddField ( "sing", signature);

    // Server URL
    string url = "http://your server ip/veryPayment.php";
    // Process respond
    StartCoroutine (this.DoWWW (new WWW (url, form), (www) => 
    {
        Debug.Log("-------- Callback Success: " + www.text);
    }));
}

Tuesday, May 10, 2016

How to develop a secure REST server with high performance using OAuth, HIBERNATE, and MYSQL in Spring framework ?

I found it difficult to develop a secure REST API Server from scratch with features like OAuth, MYSQL, HIBERNATE, MYSQL Token Store, JDBCTemplate, and HTTPS. It will take lots of time to put all the features together and make them work properly. 

In order to reduce redundant work, I therefore created the REST API server template in Spring framework. With this server template, you can focus on developing REST API to meet your needs without being distracted by other technologies.

Get Started

This project is a very simple REST and OAuth server template with high performance. Since the authenticated token is stored in MYSQL, its easy to scale up your server to meet high user traffic.

Project

This project includes the following features.
MVN
Spring-Boot
REST
JPA
MYSQL + HIBERNATE 
MYSQL Token Store
JDBCTemplate
Https

Setup MYSQL Database

Import userdb.sql into your database.
import database/userdb.sql into MYSQL database

Enable SSL

// Create key store 
bash
keytool -genkey -alias tomcat -keyalg RSA

// Edit 
vim /src/main/resources/application.properties

// Uncomment the following lines and set up your key store path
## SSL
server.port=8443
server.ssl.key-store=./src/main/resources/your.jks
server.ssl.key-store-password=your store passowrd
server.ssl.key-password=your pass

Building

You need Java (1.7 or better) and Maven (3.0.5 or better):
$ mvn clean package
$ mvn package
$ java -jar target/*.jar
...

// Http
<app starts and listens on port 8080>

// Https
<app starts and listens on port 8443>

Here are some curl commands to use to get started:
// Get Token
curl -k -X POST -d 'grant_type=client_credentials' --user 'my-client-with-secret:secret' https://localhost:8443/oauth/token
{"access_token":"bf12a9c8-c341-44a6-9ce6-084a8ba86652","token_type":"bearer","expires_in":43199,"scope":"read"}

// hasUserId GET
curl -k -H "Authorization: 5470484a-148d-479f-988e-89dfce617bb1" https://localhost:8443/user/hasUserId?uid=336u594534
{"status":200, "userId": 336u594534}

// Twitter Login POST
curl -k -H "Authorization: Bearer b61db2dd-0af4-4e3c-b2b9-7c307a9d7c69" -X POST -H "Content-Type: application/json" -d "{\"twitterId\": \"0926841831\", \"deviceId\": \"2222\"}" https://localhost:8443/user/twitterLogin

How to optimize MYSQL connection pool ?

// Edit
vim /src/main/resources/application.properties

// Configure initial and maximal connections 
spring.datasource.initialSize= 15
spring.datasource.maxActive= 30 

Monday, April 11, 2016

How to cache UIWebView webpage for offline viewing ?

There is an issue when invoking UIWebView API on iOS that webpage won`t be displayed 
immediately.  It will take around 2 seconds to load the html page from the server and display
it properly. 
In order to optimize the UI, i suggest that  preloading the webpage in cache and it could be displayed for offline viewing at anytime.  

This solution has integrated UnityAds SDK for displaying video ad and the source codes can be seen at github.


Monday, March 7, 2016

Configuring Tomcat To Use SSL

Setting up SSL for Tomcat can be pided into two main tasks: creating a functional keystore, and configuring the Tomcat connectors and applications. Let's tackle them one at a time.  

Step 1 - Creating the Keystore

$JAVA_HOME/bin/keytool -genkey -alias 6waves -keyalg RSA -keystore /key/keystore

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore /key/keystore


 

Step 2- Creating the Certificate Signing Request


$JAVA_HOME/bin/keytool -certreq -keyalg RSA -alias 6waves -file 6wavesCerificate.csr -keystore /key/keystore
$JAVA_HOME/bin/keytool -certreq -keyalg RSA -alias [youralias] -file [yourcertificatname].csr -keystore [path/to/your/keystore]

 

Step 3
Download CA



 

Step 4

To import the Root Certificate -
keytool -import -alias root -keystore /key/keystore -trustcacerts -file GeoTr                                                      ust_Global_CA.cer
To import your new Certificate -
keytool -import -alias 6waves -keystore /key/keystore -file
keytool -import -alias [youralias] -keystore [path/to/your/keystore] -file [path/to/your_keystore]

Test URL
https://your server ip:8443/test.jsp