2012年5月28日 星期一

iOS token



From : http://davehiren.blogspot.com/2012/03/get-device-token-for-apple-push.html


Get device token for apple push notifications in sencha touch and phone gap

Hello,

Recently I was working on Apple push notifications with sencha touch and phonegap project. Requirement was to get device token in JavaScript file so that it can be sent to server for getting push notifications. For that first thing we need to do is register device to get Push notifications.

Please make sure that you have real apple device like iPad, iPhone or iPod touch to test this. This will not work in Simulator.

To register device for push notifications add following in your AppDelegate.m file.  Find method


- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

Also add following line to define token variable.


@synthesize token;


and add following code at end of the method.


NSLog(@"Registering for push notifications...");    
    [[UIApplication sharedApplication] 
     registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeAlert | 
      UIRemoteNotificationTypeBadge | 
      UIRemoteNotificationTypeSound)];

This will register device for getting push notifications. Please make sure that you have added provisioning profile which configured with non wild card app id and app is configured to receive  push notifications in your development portal. Also you need valid developer certificate.

After that you need to add following methods at end of the file.

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 

    
    self.token = [[[[deviceToken description]
                    stringByReplacingOccurrencesOfString: @"<" withString: @""]
                   stringByReplacingOccurrencesOfString: @">" withString: @""]
                  stringByReplacingOccurrencesOfString: @" " withString: @""];
    
    NSLog(@"My token is: %@", self.token);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    
    NSString *str = [NSString stringWithFormat: @"Error: %@", err];
    NSLog(str);    
    
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    
    for (id key in userInfo) {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }    
    
}


This will get device token and store it to token. Now to send this token to JavaScript we will create a phonegap plugin. Please make sure that this code will work with Phonegap version 1.5.0. They named this version as Cardova.

First create folder inside plugins folder of your project folder and name it as PushToken and add two files to it PushToken.m and PushToken.h

Open PushToken.h file and add following code to it.



#import <Foundation/Foundation.h>
#import <Cordova/CDVPlugin.h>

@interface PushToken : CDVPlugin{
    
    NSString* callbackID;  
}

@property (nonatomic, copy) NSString* callbackID;

- (void) getToken:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;

@end



Now open PushToken.m file and add following code to it.

#import "PushToken.h"
#import "AppDelegate.h"

@implementation PushToken

@synthesize callbackID;

-(void)getToken:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options  {
    self.callbackID = [arguments pop];
    
    NSString *token = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).token;
    
    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[token stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    
    if(token.length != 0)
    {
        [self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]];
    }else {    
        [self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]];
    }
}

@end

Now we have to map this plugin. For that open Cordova.plist file and following key value pair to it.

PushToken : PushToken

After that open AppDelegate.h file and add following line to it.

@property (retain, nonatomic) NSString* token;

That's it of phonegap side now we have to create JavaScript file form where we will execute this plugin code. Create JavaScript file with name PushToken.js and add it to www folder. Add following code to it.

var PushToken = {
    getToken: function(types, success, fail) {
        return Cordova.exec(success, fail, "PushToken", "getToken", types);
    }
};

Add link of this JavaScript file to your index.html page after phonegap JavaScript file. To get device token wherever you want use following code.


PushToken.getToken(     
                     ["getToken"] ,           
                     function(token) {
                              global.token = token; 
                     },
                     function(error) {
                              console.log("Error : \r\n"+error);      
                     }
          );

That's it and you have your device token.

2012年5月16日 星期三

2012年5月8日 星期二

PUSH on Android and Windows Phone

做了個測試把 Push notification 直接到兩個不同 OS - Android / WP.  好厲害超快亦機乎同時到達


2012年4月29日 星期日

Windows 7 Push Notification

From web: $uri="http://db3.notify.live.net/throttledthirdparty/01.00/AAHCuoXMr7ucQphPazXmhi9_AgAAAAADDAAAAAQUZm52OkJCMjg1QTg1QkZDMkUxREQ"; //uri sended by Microsoft plateform $notif=new WindowsPhonePushNotification($uri); $notif->push_toast("123","456"); notif_url = $notif_url; } /** * Toast notifications are system-wide notifications that do not disrupt the user workflow or require intervention to resolve. They are displayed at the top of the screen for ten seconds before disappearing. If the toast notification is tapped, the application that sent the toast notification will launch. A toast notification can be dismissed with a flick. * Two text elements of a toast notification can be updated: * Title. A bolded string that displays immediately after the application icon. * Sub-title. A non-bolded string that displays immediately after the Title. */ public function push_toast($title, $subtitle,$delay = WindowsPhonePushDelay::Immediate, $message_id=NULL) { $msg = "" . "" . "" . "".htmlspecialchars($title)."" . "".htmlspecialchars($subtitle)."" . "" . ""; return $this->push('toast',$delay+2,$message_id, $msg); } /** *A Tile displays in the Start screen if the end user has pinned it. Three elements of the Tile can be updated: *@background_url : You can use a local resource or remote resource for the background image of a Tile. *@title : The Title must fit a single line of text and should not be wider than the actual Tile. If this value is not set, the already-existing Title will display in the Tile. *@count. an integer value from 1 to 99. If not set in the push notification or set to any other integer value, the current Count value will continue to display. */ public function push_tile($background_url, $title, $count, $delay = WindowsPhonePushDelay::Immediate,$message_id=NULL) { $msg = "" . "" . "" . "".htmlspecialchars($background_url)."" . "$count" . "".htmlspecialchars($title)."" . "" . ""; return $this->push('token',$delay+1, $message_id,$msg); } /** * If you do not wish to update the Tile or send a toast notification, you can instead send raw information to your application using a raw notification. If your application is not currently running, the raw notification is discarded on the Microsoft Push Notification Service and is not delivered to the device. The payload of a raw notification has a maximum size of 1 KB. */ public function push_raw($data, $delay = WindowsPhonePushDelay::Immediate,$message_id=NULL) { return $this->push(NULL,$delay+3,$message_id, $data); } /** *@target : type of notification *@delay : immediate, in 450sec or in 900sec *@message_id : The optional custom header X-MessageID uniquely identifies a notification message. If it is present, the same value is returned in the notification response. It must be a string that contains a UUID */ private function push($target,$delay,$message_id,$msg) { $sendedheaders= array( 'Content-Type: text/xml', 'Accept: application/*', "X-NotificationClass: $delay" ); if($message_id!=NULL) $sendedheaders[]="X-MessageID: $message_id"; if($target!=NULL) $sendedheaders[]="X-WindowsPhone-Target:$target"; $req = curl_init(); curl_setopt($req, CURLOPT_HEADER, true); curl_setopt($req, CURLOPT_HTTPHEADER,$sendedheaders); curl_setopt($req, CURLOPT_POST, true); curl_setopt($req, CURLOPT_POSTFIELDS, $msg); curl_setopt($req, CURLOPT_URL, $this->notif_url); curl_setopt($req, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($req); curl_close($req); $result=array(); foreach(explode("\n",$response) as $line) { $tab=explode(":",$line,2); if(count($tab)==2) $result[$tab[0]]=trim($tab[1]); } return $result; } } ?>

2012年3月20日 星期二

Mobile devices screen size

jquery zoom 解決不同 mobile devices 的 screen 問題

$( document ).ready( function() {
var $body = $('body'); //Cache this for performance

var setBodyScale = function() {
var scaleSource = $body.width(),
scaleFactor = 0.35,
maxScale = 600,
minScale = 30; //Tweak these values to taste

var fontSize = scaleSource * scaleFactor; //Multiply the width of the body by the scaling factor:

if (fontSize > maxScale) fontSize = maxScale;
if (fontSize < minScale) fontSize = minScale; //Enforce the minimum and maximums

$('body').css('font-size', fontSize + '%');
}

$(window).resize(function(){
setBodyScale();
});

//Fire it when the page first loads:
setBodyScale();
});



var designWidth = 480; // zoom to fit this ratio
var designHeight = 762; // not 800 b/c top bar is 38 pixels tall
var scaleChange = 1; // % change in scale from above #s

function zoomScreen() {
var docWidth = window.outerWidth;
var docHeight = window.outerHeight;

if (docWidth != designWidth) {
var scaleX = docWidth / designWidth;
var scaleY = docHeight / designHeight;
if (scaleX < scaleY) {
$('body').css('zoom', scaleX);
scaleChange = scaleX;
} else {
$('body').css('zoom', scaleY);
scaleChange = scaleY;
}
}
}

2012年1月29日 星期日

林國雄信箱

初學八字就當然會四處找人問問 今天找回林國雄信箱幫我睇的一些回覆 那時時間為 2002 年 12 月 我第一年跟余老師學風水的年份 也算是初踏玄學界

姓名:ALEX NG
性別:男 婚姻狀況:未婚
出生年月日時:新曆一九七三年十一月四日十三時二十五分

詢問事項:1.八字中五行的喜忌?
2.何時事業才會暢旺?什麼事業才好?
3.是否適合創業?
4.正財及偏財運如何?
5.何時會結婚?

吳先生的八字為癸丑、壬戌、甲辰、辛未。辰戌丑未齊,四庫齊沖,不能在一個地方待得太久,故適宜從事服務性行業,左撲右撲為合。
 
八字喜木喜火,虛齡廿九歲起行火運,一直好下去。
 
婚姻一定要遲,早婚易離婚。虛齡廿九歲後始可論婚姻。
 
八字身旺,不旺偏財。正財於虛齡廿九歲後轉好,亦適宜於虛齡廿九歲後創業,宜選木火行業。

2012年1月25日 星期三

2012 外星文明的信息 - Part 1

這幾天被一本書(我被外星人綁架 11 次)吸引。關於外星人、UFO都聽好多。真真假假 自行判斷。而這本書講的不只是作者聲稱被綁架,我感興趣的是書裡面的數學! 真的大開眼界。先不理作者講的是真是假,但裡面的數學斷估作者作不出來的。因裡面所寫的連當今物理學家也在研究中,而作者只有小六程度的數學。除了數學外,作者亦畫了以下這張圖。最後那個行星在當時沒多人知而這張圖是 2002 年畫的。一輸入程式 你會見原來這些行星的排列就是出現在一個重要日子 - 2012年9月21日! 即今年。會有什麼事沒人知,也可能什麼事都沒。但最多人猜是人類會見到外星人出現整個天空。另一圖在這些行星傍有兩條蟲洞,如果真的人類就真的認真思考自己的位置,我們太渺少。