# [Titanium]用appcelerator的app management實現Push Notification

- URL: https://justfly.idv.tw/titanium%e7%94%a8appcelerator%e7%9a%84app-management%e5%af%a6%e7%8f%bepush-notification/
- 日期: 2012-05-02
- 分類: WEB&amp;RIA
- 標籤: ACS, api, app, Titanium

https://justfly.idv.tw/wp-content/uploads/2012/05/acs-management.png在「[[titanium] Apple Push Notification Services & Titanium SDK 2.0](https://justfly.idv.tw/2012/04/27/Just_1195.html)」中，雖然實現了Push Notification，但是，還要自己準備一張php才能做發佈（但其實或許在某些時候這樣反而更能客製化push的時機跟內容也不一定）。

而既然appcelerator已經提供了雲端服務，不用一下實在有點可惜，並且也感謝[默司 (Herxun co.)](http://www.herxun.co/)提供的資料，就照著它做了一點點的修正，實作了這個服務。

不過因為遊戲還是必須有一個自己的資料庫，所以這個例子中等於做了雙重的登入：

```
var Cloud = require('ti.cloud');
exports.doLogin = function(uinfo) {
	doXHR(function(res){
		Ti.API.info('model.doLogin - onload');
		if(res.id > 0){
			Ti.App.fireEvent("loading:lock");
			Cloud.Users.login({
				login: 'j'+res.id+'@justfly.idv.tw',
				password: res.password,
			}, function(e) {
				Ti.App.fireEvent("loading:unlock");
				if (e.success) {
					Ti.App.fireEvent("login:success",res);
					if(Titanium.Platform.osname == 'android')
						retrieveDeviceTokenAndroid(); //註冊Android Device
					else
						retrieveDeviceTokenApple(); //註冊IOS Device
				} else {
					alert('ACS loginError:\\n' + ((e.error && e.message) || JSON.stringify(e)));
				}
			});
		}else{
			Ti.App.fireEvent("login:error");
		}
	},{
		action:'doLogin',
		name:uinfo.name,
		password:uinfo.password
	});
}
```

這樣就可以登入acs服務了。至於在acs創建使用者的方式，在「[[titanium] Apple Push Notification Services & Titanium SDK 2.0](https://justfly.idv.tw/2012/04/27/Just_1195.html)」中的留言裡就蠻完整的，這邊就不多寫嚕。另外提供它註冊硬體的function:

```
function retrieveDeviceTokenApple(){ //跟APNS 取得Token
	Ti.Network.registerForPushNotifications({
		types : [Ti.Network.NOTIFICATION_TYPE_ALERT, Ti.Network.NOTIFICATION_TYPE_BADGE, Ti.Network.NOTIFICATION_TYPE_NEWSSTAND, Ti.Network.NOTIFICATION_TYPE_SOUND],
		success : function(e) {
			ACSsubscribe(e.deviceToken,'ios');
		},
		error : function(e) {
			alert(e.error);
		},
		callback : function(e) {
			Ti.API.info(JSON.stringify(e.data));
		}
	}); 
}
function ACSsubscribe(deviceToken,osname){
	Cloud.PushNotifications.subscribe({
		channel : 'friend_request',
		device_token : deviceToken,
		type : osname
	}, function(e) {
		if(e.success) {
			Ti.API.info('ACSsubscribe:success');
		} else {
			alert('ACSsubscribe:error:\\n' + ((e.error && e.message) || JSON.stringify(e)));
		}
	}); 
}
```

然後還必須發佈道實機上才能有效的註冊硬體！看到左上的圖就表示成功啦～
