Bonjour à tous,
je souhaite mettre en place les notifications GCM sur mon applications .
Comme j'utilise Flash Builder 4.6 , donc j'utilise une extension native qui est celle ci : Afterisk
voici mon fichier manifest :
voici le code qui me permet de me connecter à mon appli GCM :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317 <?xml version="1.0" encoding="utf-8" standalone="no"?> <application xmlns="http://ns.adobe.com/air/application/3.1"> <!-- Adobe AIR Application Descriptor File Template. Specifies parameters for identifying, installing, and launching AIR applications. xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/3.4 The last segment of the namespace specifies the version of the AIR runtime required for this application to run. minimumPatchLevel - The minimum patch level of the AIR runtime required to run the application. Optional. --> <!-- A universally unique application identifier. Must be unique across all AIR applications. Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. --> <id>com.le-nom-de-ma-societe-application</id> <!-- Used as the filename for the application. Required. --> <filename>TestGCMExtension</filename> <!-- The name that is displayed in the AIR application installer. May have multiple values for each language. See samples or xsd schema file. Optional. --> <name>TestGCMExtension</name> <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade. Values can also be 1-part or 2-part. It is not necessary to have a 3-part value. An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5 . --> <versionNumber>0.0.0</versionNumber> <!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents the version of the application, as it should be shown to users. Optional. --> <!-- <versionLabel></versionLabel> --> <!-- Description, displayed in the AIR application installer. May have multiple values for each language. See samples or xsd schema file. Optional. --> <!-- <description></description> --> <!-- Copyright information. Optional --> <!-- <copyright></copyright> --> <!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 --> <!-- <publisherID></publisherID> --> <!-- Settings for the application's initial window. Required. --> <initialWindow> <!-- The main SWF or HTML file of the application. Required. --> <!-- Note: In Flash Builder, the SWF reference is set automatically. --> <content>[This value will be overwritten by Flash Builder in the output app.xml]</content> <!-- The title of the main window. Optional. --> <!-- <title></title> --> <!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. --> <!-- <systemChrome></systemChrome> --> <!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. --> <!-- <transparent></transparent> --> <!-- Whether the window is initially visible. Optional. Default false. --> <!-- <visible></visible> --> <!-- Whether the user can minimize the window. Optional. Default true. --> <!-- <minimizable></minimizable> --> <!-- Whether the user can maximize the window. Optional. Default true. --> <!-- <maximizable></maximizable> --> <!-- Whether the user can resize the window. Optional. Default true. --> <!-- <resizable></resizable> --> <!-- The window's initial width in pixels. Optional. --> <!-- <width></width> --> <!-- The window's initial height in pixels. Optional. --> <!-- <height></height> --> <!-- The window's initial x position. Optional. --> <!-- <x></x> --> <!-- The window's initial y position. Optional. --> <!-- <y></y> --> <!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. --> <!-- <minSize></minSize> --> <!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. --> <!-- <maxSize></maxSize> --> <!-- The aspect ratio of the app ("portrait" or "landscape" or "any"). Optional. Mobile only. Default is the natural orientation of the device --> <!-- <aspectRatio></aspectRatio> --> <!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false --> <!-- <autoOrients></autoOrients> --> <!-- Whether the app launches in full screen. Optional. Mobile only. Default false --> <!-- <fullScreen></fullScreen> --> <!-- The render mode for the app (either auto, cpu, gpu, or direct). Optional. Default auto --> <!-- <renderMode></renderMode> --> <!-- Whether the default direct mode rendering context allocates storage for depth and stencil buffers. Optional. Default false. --> <!-- <depthAndStencil></depthAndStencil> --> <!-- Whether or not to pan when a soft keyboard is raised or lowered (either "pan" or "none"). Optional. Defaults "pan." --> <!-- <softKeyboardBehavior></softKeyboardBehavior> --> <autoOrients>true</autoOrients> <fullScreen>false</fullScreen> <visible>true</visible> <softKeyboardBehavior>none</softKeyboardBehavior> </initialWindow> <!-- We recommend omitting the supportedProfiles element, --> <!-- which in turn permits your application to be deployed to all --> <!-- devices supported by AIR. If you wish to restrict deployment --> <!-- (i.e., to only mobile devices) then add this element and list --> <!-- only the profiles which your application does support. --> <!-- <supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles> --> <!-- Languages supported by application --> <!-- Only these languages can be specified --> <!-- <supportedLanguages>en de cs es fr it ja ko nl pl pt ru sv tr zh</supportedLanguages> --> <!-- The subpath of the standard default installation location to use. Optional. --> <!-- <installFolder></installFolder> --> <!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. --> <!-- <programMenuFolder></programMenuFolder> --> <!-- The icon the system uses for the application. For at least one resolution, specify the path to a PNG file included in the AIR package. Optional. --> <!-- <icon> <image16x16></image16x16> <image29x29></image29x29> <image32x32></image32x32> <image36x36></image36x36> <image48x48></image48x48> <image50x50></image50x50> <image57x57></image57x57> <image58x58></image58x58> <image72x72></image72x72> <image100x100></image100x100> <image114x114></image114x114> <image128x128></image128x128> <image144x144></image144x144> <image512x512></image512x512> <image1024x1024></image1024x1024> </icon> --> <!-- Whether the application handles the update when a user double-clicks an update version of the AIR file (true), or the default AIR application installer handles the update (false). Optional. Default false. --> <!-- <customUpdateUI></customUpdateUI> --> <!-- Whether the application can be launched when the user clicks a link in a web browser. Optional. Default false. --> <allowBrowserInvocation>true</allowBrowserInvocation> <!-- Listing of file types for which the application can register. Optional. --> <!-- <fileTypes> --> <!-- Defines one file type. Optional. --> <!-- <fileType> --> <!-- The name that the system displays for the registered file type. Required. --> <!-- <name></name> --> <!-- The extension to register. Required. --> <!-- <extension></extension> --> <!-- The description of the file type. Optional. --> <!-- <description></description> --> <!-- The MIME content type. --> <!-- <contentType></contentType> --> <!-- The icon to display for the file type. Optional. --> <!-- <icon> <image16x16></image16x16> <image32x32></image32x32> <image48x48></image48x48> <image128x128></image128x128> </icon> --> <!-- </fileType> --> <!-- </fileTypes> --> <!-- iOS specific capabilities --> <!-- <iPhone> --> <!-- A list of plist key/value pairs to be added to the application Info.plist --> <!-- <InfoAdditions> <![CDATA[ <key>UIDeviceFamily</key> <array> <string>1</string> <string>2</string> </array> <key>UIStatusBarStyle</key> <string>UIStatusBarStyleBlackOpaque</string> <key>UIRequiresPersistentWiFi</key> <string>YES</string> ]]> </InfoAdditions> --> <!-- A list of plist key/value pairs to be added to the application Entitlements.plist --> <!-- <Entitlements> <![CDATA[ <key>keychain-access-groups</key> <array> <string></string> <string></string> </array> ]]> </Entitlements> --> <!-- Display Resolution for the app (either "standard" or "high"). Optional. Default "standard" --> <!-- <requestedDisplayResolution></requestedDisplayResolution> --> <!-- </iPhone> --> <!-- Specify Android specific tags that get passed to AndroidManifest.xml file. --> <!--<android> --> <!-- <manifestAdditions> <![CDATA[ <manifest android:installLocation="auto"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/> <application android:enabled="true"> <activity android:excludeFromRecents="false"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> ]]> </manifestAdditions> --> <!-- Color depth for the app (either "32bit" or "16bit"). Optional. Default 16bit before namespace 3.0, 32bit after --> <!-- <colorDepth></colorDepth> --> <!-- </android> --> <!-- End of the schema for adding the android specific tags in AndroidManifest.xml file --> <android> <colorDepth>16bit</colorDepth> <manifestAdditions><![CDATA[ <manifest android:installLocation="auto"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="air.com.le-nom-de-ma-societe-application.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="air.com.le-nom-de-ma-societe-application.permission.C2D_MESSAGE" /> <uses-feature android:required="false" android:name="android.hardware.wifi"/> <application android:enabled="true" android:hardwareAccelerated="true"> <service android:name="com.afterisk.shared.android.gcm.GCMIntentService" /> <receiver android:name="com.afterisk.shared.android.gcm.AfteriskGCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="air.com.le-nom-de-ma-societe-application" /> </intent-filter> </receiver> <activity android:excludeFromRecents="false"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>--> <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>--> <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>--> <!--<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>--> <!--<uses-permission android:name="android.permission.CAMERA"/>--> <!--<uses-permission android:name="android.permission.RECORD_AUDIO"/>--> <!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>--> <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>--> </manifest> ]]></manifestAdditions> </android> <extensions> <extensionID>com.afterisk.shared.android.GCMPush</extensionID> </extensions> <iPhone> <InfoAdditions><![CDATA[ <key>UIDeviceFamily</key> <array> <string>1</string> <string>2</string> </array> ]]></InfoAdditions> <requestedDisplayResolution>high</requestedDisplayResolution> </iPhone> </application>
le problème est que j'ai bien un enregistrement à GCM puisque dans les traces j'ai ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 <?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView" addedToStage="view1_addedToStageHandler(event)"> <fx:Script> <![CDATA[ import com.afterisk.shared.ane.lib.GCMEvent; import com.afterisk.shared.ane.lib.GCMPushInterface; public static const GCM_SENDER_ID:String = "monsenderID"; private var _gcmi:GCMPushInterface; private var _gcmDeviceID:String; private var _payload:String; protected function view1_addedToStageHandler(event:Event):void { NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, handleActivate, false, 0, true); NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true); _gcmi = new GCMPushInterface(); _gcmi.addEventListener(GCMEvent.REGISTERED, handleRegistered, false, 0, true); _gcmi.addEventListener(GCMEvent.UNREGISTERED, handleUnregistered, false, 0, true); _gcmi.addEventListener(GCMEvent.MESSAGE, handleMessage, false, 0, true); _gcmi.addEventListener(GCMEvent.ERROR, handleError, false, 0, true); _gcmi.addEventListener(GCMEvent.RECOVERABLE_ERROR, handleError, false, 0, true); register(); } private function register(e:MouseEvent = null):void { _messageField.text += "\n\nRegistering device with GCM..."; //check if device is already registered otherwise start registration process and wait for REGISTERED event var response:String = _gcmi.register(GCM_SENDER_ID); trace(response); if(response.indexOf("registrationID:") != -1) { _messageField.text += "\n\nDevice was already registered.\n" + response; //extract GCM registration id for your device from response, you will need that to send messages to the device //create your own backend service or use public services _gcmDeviceID = response.substr(response.indexOf(":") + 1); handleRegistrationIDReceived(); //if device was already registered check if there is any pending payload from GCM //this can be true when android shut down your app and its restarted instead of being resumed checkPendingFromLaunchPayload(); } } public function unregister(e:MouseEvent = null):void { _messageField.text += "\n\nUnegistering device with GCM..."; _gcmi.unregister(); } //on successful registration get GCM registration id for your device private function handleRegistered(e:GCMEvent):void { _messageField.text += "\n\nreceived device registrationID: " + e.deviceRegistrationID; _gcmDeviceID = e.deviceRegistrationID; handleRegistrationIDReceived(); } private function handleRegistrationIDReceived():void { //send device id to backend service that will broadcast messages trace("handleRegistrationIDReceived"); _messageField.text += "handleRegistrationIDReceived"; } public function checkPendingFromLaunchPayload():void { _payload = _gcmi.checkPendingPayload(); if(_payload != GCMPushInterface.NO_MESSAGE) { _messageField.text += "\n\npending payload:" + _payload; handlePayload(); } } //messages are received when app is in background therefore add event for when app is resumed from notification private function handleMessage(e:GCMEvent):void { //get payload _payload = e.message; _messageField.text += "\n\nGCM payload received:" + _payload; trace("app is in the background: adding GCM app invoke listener"); NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke, false, 0, true); } private function onInvoke(e:InvokeEvent):void { trace("app was invoked by gcm notification"); _messageField.text += "\n\napp was invoked from GCM notification"; NativeApplication.nativeApplication.removeEventListener(InvokeEvent.INVOKE, onInvoke); handlePayload(); } public function handlePayload():void { //you can parse and treat gcm payload here //dispatch an event or open an appropriate view trace("handlePayload"); _messageField.text += "handlePayload"; } //when device is unregistered on Google side, you might want to unregister it with your backend service private function handleUnregistered(e:GCMEvent):void { _messageField.text += "\n\ndevice was unregistered from GCM"; //unregister with yours or public backend messaging service //... } //handle variety of gcm errors private function handleError(e:GCMEvent):void { trace(e); _messageField.text += e; } protected function handleActivate(event:Event):void { // TODO Auto-generated method stub trace(event); _messageField.text += event; } protected function handleDeactivate(event:Event):void { // TODO Auto-generated method stub trace(event); _messageField.text += event; } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <s:Label id="_messageField" top="0" bottom="0" left="0" right="0"/> </s:View>
mais je ne recois sur ma tablette auccune notifications (j'utilise UrbanAirship)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 GCMPushInterface: registered Status Listeners registrationID:APA91bGdyrvKPRYq_Ne0Qnxc_ZJiiWyXOOx-SJSbMqrQo6VYADs6diTlpzmLXKzvOPosQ3lexiZ_CYKlx_Gk9a-y16zaKX77MoG3E8H1727Sxpq6EOc0QSsUYxNA-dfTSZL0hVz1nDx2qu70LW2-9rfHzWrlaCeeqA handleRegistrationIDReceived
petite precision : si j'utilise tel quel mon application id avec des tirets , ca n'enregistre pas la tablette , mais si j'enleve les tirets , ca enregistre mais auccune notifications
Avez vous une reponse , une idéee , à me donner , la je n'en vois pas
Merci d'avance pour vos reponses.
Partager