Visualforce User Agent Detection

The code below provides an example of a page action method used to detect a mobile user-agent and perform redirection. Alternatively the same approach could be used with dynamic Visualforce components to switch between mobile/web optimised page composition.

	public PageReference redirectDevice(){
		String userAgent = ApexPages.currentPage().getHeaders().get('USER-AGENT');
		
		//& some devices use custom headers for the user-agent.
		if (userAgent==null || userAgent.length()==0){
			userAgent = ApexPages.currentPage().getHeaders().get('HTTP_X_OPERAMINI_PHONE_UA');
		}		
		if (userAgent==null || userAgent.length()==0){
			userAgent = ApexPages.currentPage().getHeaders().get('HTTP_X_SKYFIRE_PHONE');
		}
		 		
  		//& replace with custom setting - using (?i) case insensitive mode.		
		String deviceReg = '(?i)(iphone|ipod|ipad|blackberry|android|palm|windows\\s+ce)';
		String desktopReg = '(?i)(windows|linux|os\\s+[x9]|solaris|bsd)';
		String botReg = '(?i)(spider|crawl|slurp|bot)';
		
		Boolean isDevice=false, isDesktop=false, isBot=false;
		
		Matcher m = Pattern.compile(deviceReg).matcher(userAgent);
		if (m.find()){
			isDevice = true;
		} else {
			//& don't compile the patterns unless required.
			m = Pattern.compile(desktopReg).matcher(userAgent);
			if (m.find()) isDesktop = true;
			
			m = Pattern.compile(botReg).matcher(userAgent);
			if (m.find()) isBot = true;
		}
		//& Default is mobile - unless a desktop or bot user-agent identified.					
		if (!isDevice && (isDesktop || isBot)) return null; //& no redirect.						
		return new PageReference('/apex/MobileIndex'); //& redirect.
	}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: