블로그 이미지
Sunny's

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2012. 3. 7. 16:52 IPhone

앱스토어에 앱을 올린 이후 가장 중요한 것은 앱스토어에서의 순위를 유지하거나 높이는 것이라 할 수 있다.


그러기 위해서는 앱 판매에 대한 상세 모니터링을 해야 하는데,
단순 다운로드 추이만 보여주는 iTunes Connect 의 Sales and Trends 로는 한계가 있다.

구글의 Web Analytics 와 같이 모바일 앱에 대한 분석을 제공하고 동시에 분석 내용을 바탕으로 공지 팝업과 push notification 메시지를 보낼 수 있는 서비스가 Apptract 라는 이름으로 국내에 런칭되었다.

www.apptract.com


push 는 아직 iOS의 apns 만 지원하나 향후 Android의 c2dm 서비스도 지원할 예정이라고 한다.

회원 가입 후, 분석을 위한 신규 앱을 등록하면 key 문자열과 sdk를 다운로드 할 수 있는 링크가 뜬다.


개발자 가이드 페이지(http://www.apptract.com/developerGuideIOS.do)를 참고해서 sdk를 추가하고 코드 한줄 삽입하니 끝이다.


만약 버튼 클릭 등의 사용자 정의 이벤트에 대한 분석을 추가하려면

이벤트 항목들을 상수 배열로 정의하여 초기화 하고,




이벤트가 호출되는 메소드에 addEventLog 를 추가한다.



iPhone 디바이스에서 디버그 모드로 앱을 몇번 실행 했다가 web 사이트로 가서 바로 확인해보면 아직 status 가 waiting 이다.

실시간 분석이 아니라 상태가 running 이 되려면 최대 1시간 이상 지나야 한다.

로그아웃 후 한 시간 뒤에 다시 들어가보면 아래와 같이 Running 인 상태를 확인 할 수 있다.

View Report 링크를 눌러 리포트를 확인한다.

아래 이미지는 오늘 하루 앱을 실행한 횟수(sessions) 에 대한 리포트 화면이다.

각 리포트 마다 기본적으로 차트와 상세 테이블로 데이터를 보여주고 있다.


sessions 이외에

하루를 기준으로 앱을 실행한 Unique 한 사용자 수,

새로 설치한 사람 수,

앱 사용 시간,

사용자의 앱 실행 횟수,

앱 사용자의 위치정보,

사용자 정의 이벤트,

디바이스 정보,

OS 버젼,

탈옥 여부,

앱 버젼

등에 대한 것을 리포팅 하고 있다.

분석 부분은 여러모로 유용한 정보이고,

공지와 push 전송 기능을 테스트해 보겠다.

테스트 발송 화면에서 iPhone 의 UDID 를 입력하고.

공지와 링크를 추가 입력하여 send 버튼을 누른다.

앱을 실행하면 약 2초 후 공지팝업이 뜨는 걸 확인 할 수 있다.

링크 버튼도 잘 동작한다.


발송 리스트 화면을 새로고침 하면

공지가 1 건 send 되었고 1 명이 읽었다고 표시가 된다.

공지를 잘못 보냈을 경우 해당 공지 기능을 멈추게 하는 버튼도 제공하고 있다.


테스트 발송 이외에 자동발송, 전체 발송, 특정 대상자에게 발송 등 다양한 옵션을 제공하고 있다.

아직 사이트는 베타 버젼이나 기능에는 문제가 없다고 하니,

당장 앱에 SDK를 삽입하여 앱스토어에 배포하여도 문제가 없을 것이다.

모바일 앱에 대한 사용자 분석 뿐만 아니라

공지 팝업, push notification 등의 서비스는

배포 후 앱을 마케팅하는 기준을 마련할 수 있는 매우 유용한 서비스가 될 것 같다.

출처 : http://blog.naver.com/martis2?Redirect=Log&logNo=90099405691
posted by Sunny's
2011. 5. 18. 21:31 IPhone

We have just published a full implementation for providing Push Notifications (APS) support for iPhone clients using RemObjects SDK, with minimal work required.

The current implementation is provided for servers written in .NET, although it should be easily adaptable to serve as a reference for implementing a similar functionality for RO/Delphi.

Contents

 [hide]

What are Push Notifications?

To conserve battery power, as well as reduce CPU load and network traffic, iPhone does not allow applications to stay active in the background and keep communicating with servers. This makes traditional approaches for real-time notifications, such as RemObjects SDK's event sinks unfeasible, but is an understandable limitation given that users expect their iPhone batteries to last a long time and want to keep a tab on (sometimes metered) network traffic.

In exchange, Apple provides so called Apple Push Services (APS) that provide a unified approach for all applications on the device to receive notifications while they are not running.

Details about how APS works can be found in Apple's documentation in the iPhone SDK (link), but basically, the system works by iPhone applications registering a device token with their servers (that's the server you, the application author, is providing), and the server then dispatching notification messages through infrastructure provided by Apple. Apple's servers will consolidate notifications received from all the different sources (yours and others) and send them to the devices .

Notifications can include text messages (which will show on the device as alerts, similar to SMS), app icon badges (like the 'unread email count' in Mail) that will be attached to your application icon on the home screen, and sound alerts.

Beyond providing these notifications, and giving the option to launch into your application from the displayed alert message, APS does not affect the actual communication or flow of data between your application and its servers, and neither does our ApplePushProvider implementation. If the user launches your application, it is up to your own code to retrieve the latest data from your servers (for example to display data matching a badge count or alert message your server pushed down to the phone). RemObjects SDK (or Data Abstract) of course make this easy, but this functionality will be application-specific, so it is beyond the scope of what the ApplePushProvider classes do for you.


Apple Push Notifications Diagram.png


What does ApplePushProvider Do?

The classes provided by RemObejcts.SDK.ApplePushProvider basically provide three sets of functionality for you: Provide a service with a consistent interface that your iPhone client can use to register (and, if needed, unregister) devices for receiving notifications.

Provide a central "device manager" to keep track and persist information about registered devices on disk. A class that encapsulates the logic needed to talk to the APS servers in order to send out the actual notifications to one or more devices.

Optionally, this can all be tied in with your server's existing User Management, to link devices to your server's user accounts and provide user-specific notifications.

On the iPhone: Registering your Application for Push

Registering your iPhone application to receive Push Notifications is very straight forward, requiring only a handful of lines of code, in addition to the provisioning required to enable Push from Apple's side. Provisioning for Push is explained in detail in Apple's documentation, but basically involves the following steps:

  1. Creating a unique AppID for your application (wildcard AppIDs will not work for Push).
  2. Enabling that AppID for Push and creating and uploading a certificate to the iPhone Developer Portal (the certificate created here will later need to be exported to the machine running your server).

Once that is done, all that is left is to add the two PushProvider.m and PushProvider.h source files to your project (and link your project against libRemObejctsSDK.a), and add the following few lines of code to your AppDelegate:

#import "PushProvider.h"
#define URL @"http://yourserver.com"

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{    
	// ... existing code ...

	// pick which of the three notification types your app wants to receive
	[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert];
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
	ApplePushProviderService_AsyncProxy *p = [ApplePushProviderService_AsyncProxy proxyWithMessage:[ROBinMessage message]
						  channel:[ROHTTPClientChannel channelWithTargetUrl:URL]];
	[p beginRegisterDevice:newDeviceToken:@""]; // we don't care about the response.
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
	NSLog(@"application:didFailToRegisterForRemoteNotificationsWithError: %@", error);
	if ([error code] != 3010) // 3010 is for the iPhone Simulator
	{
        	// show some alert or otherwise handle the failure to register.
	}
}

90% of this is general plumbing for the Apple Push APIs, with your application calling registerForRemoteNotificationTypes: and getting a callback with a device token (a 32 byte binary token). Only the two lines inapplication:didRegisterForRemoteNotificationsWithDeviceToken: are specific to RemObjects.SDK.ApplePushProvider – passing the token and an optional string to the server.

The optional string parameter is provided in case your application wants to pass information to the server to influence notifications. It will be stored server side, but is not used directly by the provider code. Your own server code can look at this string to determine what notifications to send, if needed (more on that, later).

On the Server: Receiving Device Registrations

Next, let's move to the server and enable it to receive the device registrations we just implemented client-side. Simply add a reference to the RemObejcts.SDK.ApplePushProvider to your server project, and - somewhere in your server's initialization code - add the following two lines of code to let the provider know about two critical file names:

PushDeviceManager.CertificateFile = ...;
PushDeviceManager.DeviceStoreFile = ...;

The first line tells the server where to find the .p12 file that contains the Certificate you created when setting up your AppID for Push in the iPhone Developer Portal (simply export this certificate from the Keychain Access app, and copy it yo your server machine. For best ease of use, export it without a password - else, you will need to write some more custom code, server side, to load and decrypt the certificate file yourself).

The second line tells the provider where to store the file that contains information about the registered devices.

Note: the provider, as present, is implemented to store the list of registered devices in an XML file. This should work fine for most scenarios, and scale up to thousands of clients. If you are implementing a really high load server that will handle hundreds of thousands or even millions of clients, you might want to provide your own storage for device information, for example in your database. And that's it – your server is ready to receive device registrations. If you want to test this, you can add a third line below to send a message to every registered client, when the server starts up:

PushDeviceManager.PushMessageNotificationToAllDevices("Server was Started. Welcome Back!");

Of course the first time you run your server, there will be no devices yet. But if you launch your server, then your iPhone app, and then stop and restart your server, you should see the above alert message pop up on your phone.

You should also see the file specified as DeviceStoreFile above show up on your server harddisk, containing XML describing your device token and details.

Authentication

If you want to tie device notification to user accounts, or simply prevent unauthorized clients to sign up for notifications, you can set the following PushDeviceManagers' RequireSession property to true. This will force the service that handles the registration to participate in regular RemObjects SDK user authentication, as described in Login and Authentication.

This of course assumes you are providing a Login service, and have the proper delegate assigned client side, to handle authentication. All of this would of course be shared with your regular RemObjects SDK services that use authentication, so this is not really extra infrastructure specific to Push.

If RequireSession is set to true, the Push Provider will automatically store the User variable from the session, along with the device token. This will later allow you to associate the different device IDs with individual users (more on that in the next section).

Still on the Server: Sending Notifications

There's one part left to do: sending actual notifications to the registered iPhones. You-ve already seen a simple call that sent an alert to all registered devices – but in real live, you'll want more control. PushDeviceManager exposes a set of four methods that allow you to easily send a message to every device – either an alert, a sound, a badge count or a combination of the three.

In addition, it exposes a property called APSConnect (of class APSConnect), that exposes the full API for talking to the APS server, including versions of the above four methods that allow you to send notifications to a specific device, as well as to send a raw JSON data package (if you want more control over the message than the above four pairs of methods give you).

Of course, to send a message to a specific device, you need to know about devices that are registered. For this, PushDeviceManager exposes the Devices property, a dictionary that matches each device token to the information the server has stored about this device. For each device, there are three values available (in addition to the token):

  • The UserReference (if you enabled authentication, as described above). You can use this value to map a particular device back to a user account, for example to send a badge reflecting that user's unread messages, or whatever other information you want to convey to the user
  • ClientInfo: this is the string you passed from the client when registering your device. If you want to expose options on the phone for what kind of notification the user wants to receive, your client app can use this to send an application-specific string that you can evaluate when sending notifications. This is particularly useful if your users can choose per-device options that might be unrelated to user accounts (for example to show more/different notifications on their iPhone than on their iPod touch).
  • ServerInfo: this is a string that your server can read and write to keep track of information for the device. For example, you might want to keep track of what was the last notification you sent to the device, so you won't send it again (frequently resending identical notifications, such as an unchanged badge count, can drain the user's battery).

For example, the following code might update all your devices with a badge count:

for each d in PushDevicemanager.Devices.Values do begin 
  var lCount: Int32 := GetUnreadMessagesForUser(d.UserReference); { your method! }
  if lCount.ToString <> d.ServerInfo then begin
    fAPSConnect.PushBadgeNotification(d.Token.ToArray, lCount);
    d.ServerInfo := lCount.ToString;
  end;
  PushDeviceManager.Flush; { make sure all state gets saved to disk. }
end;

It's that easy!

Where to Get It

You can get the latest version of the ApplePushprovider code from our open source code repository at code.remobjects.com. You can access this via SVN to get the very latest, or get a pre-compiled download.

You will need Delphi Prism or the free Delphi Prism command line compiler to build the provider for source, but you can consume it from any .NET language supported by RemObejcts SDK.

posted by Sunny's
2011. 5. 18. 21:08 IPhone

출처 :  http://artyst.egloos.com/2652130

1. 내 아이폰에서 개발어플 실행하기 (푸시 서비스를 하기 위해 필수)

http://artyst.egloos.com/2650529

------------------------------------------------------------------------------------------

2. 푸시 서비스등록 및 인증서 다운로드

https://developer.apple.com/iphone/ 에 접속하여 로그인한다.


화면 우측에 iPhone Provisioning Portal 클릭.

App IDs 메뉴에서 등록했던 어플목록을 보자.

Apple Push Notification service 항목에 노란불이 켜져있다. 활성화되지 않은 상태이다.

Action 항목의 Configure 를 클릭.


Development Push SSL Certificate 는 개발 어플용이다.
Production 을 선택하면 테스트는 불가능할 것이다. (배포용 제품어플은 실제 배포했을때만 동작됨)

Development Push SSL Certificate의 Configure 버튼을 누른다.

아래와 같은 화면에서 파일선택을 눌러
#내 아이폰에서 개발어플 실행하기 ( http://artyst.egloos.com/2650529 )의 "1. 인증키 생성" 에서 생성한 인증서 파일을 선택한다.

등록 성공!!!


Continue 버튼을 눌러 다음 화면으로 이동하면 푸시관련 인증서를 다운로드 받을 수 있다.

다운로드 받은 인증서를 더블클릭하여 실행하면 "키체인 접근" 프로그램이 실행되면서 해당 인증서가 추가된다.


예전에 Provisioning Profile 을 다운로드 받아 적용했다면, 위의 과정 이후에 아마도 다시 다운로드 받아서 적용해야할 것이다.


Provisioning 메뉴에서 등록했던 profile 의 Edit 버튼을 눌러 다시 한번 Submit하고 (App IDs 를 잘 확인할것),
Provisioning Profile 을 다운로드 받아 적용하자.
#내 아이폰에서 개발어플 실행하기 ( http://artyst.egloos.com/2650529 )의 과정과 동일함.

@ 추후 푸시 기능이 제대로 작동하지 않는다면 Certificates 메뉴에서 인증서를 다운로드 받아 적용해보자.

------------------------------------------------------------------------------------------

3. 어플(클라이언트) 소스코드
지금부터 소개되는 함수들은 UIApplicationDelegate 에 정의된 함수들이다.
예) @interface 프로젝트명AppDelegate : NSObject <UIApplicationDelegate>
푸시 기능을 사용하기 위해 아래의 상속된 함수들을 overriding 하겠다.

(1)  어플 실행시
푸시알림 서비스를 허용하겠는지 묻고, 해당 장치(아이폰)를 APNS 에 등록

아래의 함수는 [ 프로젝트이름AppDelegate.m ] 파일에 있다.
어플이 시작할때 실행되는 함수인데 //APNS에 장치등록 부분과 //Badge개수설정 을 추가했다.

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

[window makeKeyAndVisible];

//APNS  장치 등록

[application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

//Badge 개수 설정

application.applicationIconBadgeNumber = 0;

return YES;

}


최초에 어플이 실행될때만 "푸시알림을 허용할것인지" 묻고, 그 이후에 어플이 실행되어도 다시 묻지 않는다.

위의 함수처럼 코드를 작성했을 경우, 최초에 "허용"을 했다면 매번 APNS 에 장치를 등록하게 된다.

그러므로 따로 함수를 만들어 사용자가 (내 서버에) 로그인할때만 APNS에 등록되도록 코드를 작성하는 편이 좋을 것이다.


UIRemoteNotificationTypeBadge 는 앱스토어 아이콘에 업데이트할 어플의 갯수를 표시하거나

문자가 몇개 왔는지 아이콘에 나타낼때 처럼, 우리가 만든 어플의 아이콘에도 푸시가 올때 표시하겠다는 것.

UIRemoteNotificationTypeSound 는 푸시알림이 왔을때 어떤 소리를 낼지 결정하겠다는 것.

UIRemoteNotificationTypeAlert 은 알림 메시지를 보내겠다는 것.


Badge 갯수 = 0 은 사용자가 어플 아이콘을 눌러 실행할때, 아이콘에 표시되었던 Badge갯수를 초기화 하려고 한다.


(2) APNS 에 장치 등록시

APNS에 장치를 등록하는 코드가 실행되면 APNS 에 등록요청하며 성공/실패 여부를 알려준다.

성공/실패 여부에 따라 아래의 2가지 함수가 자동호출된다.


//push : APNS  장치 등록 성공시 자동실행

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

NSLog(@"deviceToken : %@", deviceToken);


/*

 여기에 당신의 서버와 통신하는 부분을 만들것.

 푸시를 누구에게 보낼지를 결정하는 것이 바로 deviceToken 값이다.

 내가 운영할 서버에 deviceToken  보내서 보관하자.

 */

}


//push : APNS  장치 등록 오류시 자동실행

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {

NSLog(@"deviceToken error : %@", error);

}


성공시 deviceToken를 문자열로 보내준다.

NSLog 를 이용해 출력해보면 아이폰(장치)의 식별토큰을 알수있다.

테스트 해봐야하니 복사해서 보관해놓자.


아래와 같은 xcode 화면에서 "Build and Run" 을 눌러 아이폰에서 실행시키고

필자가 분홍색 동그라미로 강조해놓은 부분을 눌러 출력되는 로그를 보자.

녹색 네모로 강조해놓은 부분에 출력된 것을 볼 수 있다. 복사해놓자.



만약 code 3000 에러가 발생하면 인증서 문제이므로,

애플-개발자-사이트에서 프로젝트 관련 모든 인증서를 새로 다운로드 받아 적용해보자.


(3) 어플 실행중일때 알림 도착

이때는 알림 확인창이 뜬다거나 소리가 나지 않을것이다. 대신 아래의 함수가 실행되므로 알맞게 처리하면 되겠다.


//push : 어플 실행중에 알림도착

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

NSDictionary *aps = [userInfo valueForKey:@"aps"];

NSLog(@"userInfo Alert : %@", [aps valueForKey:@"alert"]);

}


------------------------------------------------------------------------------------------


4. 운영서버 설정하기


(1) APNS 와 보안통신 할때 사용할 인증서 추출


응용프로그램 > 유틸리티 > 키체인접근 을 실행.


아래의 화면과 같이 "Apple Development Push Services"와 거기에 포함되어 있는

"개인키"까지 2개를 한꺼번에 선택하고 "2개 항복 보내기"(Export 2 items...)를 한다. 

(인증서와 개인키를 하나의 p12 파일로 만든다)

화면 왼쪽의 키체인항목에서 "로그인" 선택. 카테고리항목에서 "인증서" 선택해야 포함된 개인키가 보인다.




파일포멧은 p12 로 선택하고, 디스크에 저장한다.


디스크에 저장할 인증서의 암호를 설정한다. 암호를 지정하고 기억해두자.


맥OS 로그인 암호를 입력하여 내보내기를 허용한다.



(2) 서버 소스코드


개발환경 : 자바(JAVA)

@ PHP 나 Objective C 는 다루는 곳이 많으므로 자바(JAVA) 로만 작성하도록 하겠다.


APNS 와 통신하려면 먼저 java에서 편리하게 이용할 수 있는 라이브러리를 다운로드 받자. http://code.google.com/p/javapns/ 에서 jar 파일을 다운로드 받을 수 있다.



그런데 이 API를 사용하기 위해서 필요한 라이브러리가 있다.


commons-lang-x.x.jar 가 없다면 org.apache.commons.lang.StringUtils 를 찾을 수 없다며 에러가 발생한다.

bcprov-ext-jdk16-xxx.jar 가 없다면 암호화관련 에러가 발생한다.


http://commons.apache.org/lang/ => apache

http://www.bouncycastle.org/ => 암호화 모듈


위의 사이트에서 각각 다운로드 받을 수 있다.


이제 서버에서 APNS로 메시지를 발송하는 JAVA 서버 프로바이저를 작성해보자.

deviceToken 에는 아이폰 클라이언트 어플에서 APNS 에 등록하고 나서 받은 토큰값을 넣어주자.

certificatePath 에는 인증서 경로와 파일명을 넣어주고, password에는 인증서를 추출할때 입력한 암호를 넣자.


import javapns.back.PushNotificationManager;

import javapns.back.SSLConnectionHelper;

import javapns.data.Device;

import javapns.data.PayLoad;


public class ApnsManager {

  public void provider() throws Exception {

    try {

      String deviceToken = "6a4aa1981062d0b8bxxbbaa3b6b0fdc275exyyx0f5dcac1ce101d314acca1a35";


      PayLoad payLoad = new PayLoad();

      payLoad.addAlert("알림 메시지 테스트");

      payLoad.addBadge(1);

      payLoad.addSound("default");

      PushNotificationManager pushManager = PushNotificationManager.getInstance();

      pushManager.addDevice("iPhone", deviceToken);

      //Connect to APNs

      String host = "gateway.sandbox.push.apple.com";

      int port = 2195;

      String certificatePath = "/work/project/apple-apns-key.p12";

      String certificatePassword = "인증서암호";

      pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);

      //Send Push

      Device client = pushManager.getDevice("iPhone");

      pushManager.sendNotification(client, payLoad);

      pushManager.stopConnection();


      pushManager.removeDevice("iPhone");

    }

    catch (Exception e) {

      e.printStackTrace(); 

    }

}



혹시 푸시알림을 제대로 받지 못했다면 아이폰의 설정을 살펴보자.



~ 끝 ~

posted by Sunny's
prev 1 next