/
412.txt
417 lines (343 loc) · 13.6 KB
/
412.txt
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
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
[5]
[CODE[Geolocation]]
[[オブジェクト]]の[[メソッド]]で[[位置情報]]を取得できます。
* 仕様書
[REFS[
- [3] [CITE@en[Geolocation API Specification]], [TIME[2019-11-24 18:38:51 +09:00]] <https://w3c.github.io/geolocation-api/#geolocation_interface>
]REFS]
* 処理
[6]
[CODE[Geolocation]]
[[インターフェイス]]の
[DFN[[CODE[getCurrentLocation]]]]
[[メソッド]]は、
次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]
[FIG(steps)[
= [7] [VAR[成功コールバック]]を、
必須の第1引数を [CODE[PositionCallback]] と解釈した結果に設定します。
= [8] [VAR[エラーコールバック]]を、
第2引数を [CODE[PositionErrorCallback]] と解釈した結果に設定します。
= [9] [VAR[オプション群]]を、
第3引数を [CODE[PositionOptions]]
と解釈した結果に設定します。
]FIG]
[10]
更に、[[非同期的]]に、
次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]
[FIG(steps)[
= [17] [[環境設定群オブジェクト]]の[F[非保安文脈]]が[[真]]の場合、
== [18] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]
: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[PERMISSION_DENIED][GeolocationPositionError]]
]FIG]
== [19] [[開発者コンソール]]に[VAR[エラー]]を表示して[MAY[構いません]]。
== [20] [VAR[エラーコールバック]]に[VAR[エラー]]を報告し、ここで停止します。
= [11] [VAR[位置]]を、
キャッシュされた [CODE[GeolocationPosition]] に設定します。
= [23] [VAR[位置]]の[F[齢]]が[VAR[オプション群]]の
[F[[CODE[maxAge]]]]
[[以下]]の場合、
== [24] [VAR[成功コールバック]]に[VAR[位置]]を報告し、ここで停止します。
= [15] [VAR[オプション群]]の [F[[CODE[timeout][PositionOptions]]]] が [N[0]]
の場合、
== [26] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]
: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[TIMEOUT][GeolocationPositionError]]
]FIG]
== [21] [VAR[エラーコールバック]]に[VAR[エラー]]を報告し、ここで停止します。
= [81]
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]について、
取得の手順群 (>>82) を実行します。
]FIG]
-*-*-
[42]
[CODE[Geolocation]]
[[インターフェイス]]の
[DFN[[CODE[watchPosition]]]]
[[メソッド]]は、
次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]
[FIG(steps)[
= [43] [VAR[成功コールバック]]を、
必須の第1引数を [CODE[PositionCallback]] と解釈した結果に設定します。
= [44] [VAR[エラーコールバック]]を、
第2引数を [CODE[PositionErrorCallback]] と解釈した結果に設定します。
= [45] [VAR[オプション群]]を、
第3引数を [CODE[PositionOptions]]
と解釈した結果に設定します。
= [52] [VAR[識別子]]を、新しい [[watch process]] を固有に識別する
[CODE[long]] の値に設定します。
= [53] [VAR[識別子]]を返します。
]FIG]
[46]
更に、
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[識別子]]について、
[[非同期的]]に次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]
[FIG(steps)[
= [47] [[環境設定群オブジェクト]]の[F[非保安文脈]]が[[真]]の場合、
== [48] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]
: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[PERMISSION_DENIED][GeolocationPositionError]]
]FIG]
== [49] [[開発者コンソール]]に[VAR[エラー]]を表示して[MAY[構いません]]。
== [50] [VAR[エラーコールバック]]に[VAR[エラー]]を報告し、ここで停止します。
= [51] [VAR[成功コールバック]]、
[VAR[失敗コールバック]]、
[VAR[オプション群]]、
[VAR[識別子]]について [[watch process]] を実行します。
]FIG]
[58]
[VAR[成功コールバック]]、
[VAR[失敗コールバック]]、
[VAR[オプション群]]、
[VAR[識別子]]について
[DFN[watch process]]
は、
次のようにします。
[SRC[>>3]]
[FIG(steps)[
= [36] [VAR[以前の位置]]を、
[CODE[null]]
に設定します。
= [59] [VAR[位置]]を、
キャッシュされた [CODE[GeolocationPosition]] に設定します。
= [60] [VAR[位置]]の[F[齢]]が[VAR[オプション群]]の
[F[[CODE[maxAge]]]]
[[以下]]の場合、
== [62] [VAR[成功コールバック]]に[VAR[位置]]を報告します。
== [35] [VAR[以前の位置]]を、[VAR[位置]]に設定します。
= [61]
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[識別子]]、
[VAR[以前の位置]]について、
[[acquisition steps]]
を実行します。
]FIG]
[63]
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[識別子]]、
[VAR[以前の位置]]について
[DFN[acquisition steps]]
は、
次のようにします。
[SRC[>>3]]
[FIG(steps)[
= [34]
取得の手順群 (>>82)
を実行します。
[FIG(list members)[
:[VAR[成功コールバック]]:[VAR[成功コールバック]]、
:[VAR[エラーコールバック]]:[VAR[エラーコールバック]]
:[VAR[オプション群]]:[VAR[オプション群]]
:[VAR[以前の位置]]:[VAR[以前の位置]]
: [VAR[watch]] : [[真]]
: [VAR[次の処理]] :
[FIG(steps)[
= [85] [[実装依存]]の時間、待ちます。
= [84]
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[識別子]]、
[VAR[以前の位置]]について
[[acquisition steps]]
を実行します。
]FIG]
]FIG]
]FIG]
[82]
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[以前の位置]]、
[VAR[watch]] (既定値は[[偽]])、
[VAR[次の処理]] (既定値は何もしない)
について取得の手順群は、
次のようにします。
[SRC[>>3]]
[FIG(steps)[
= [70] [VAR[中断信号]]を、[[偽]]に設定します。
= [28] [VAR[タイマー]]を、新しいタイマーを作成した結果に設定します。
[FIG(list members)[
: 時間 :
[VAR[オプション群]]の [F[[CODE[timeout][PositionOptions]]]]
[[ミリ秒]]
: 時間経過後[[非同期的]]に実行する処理 :
[FIG(steps)[
= [32] [VAR[タイマー]]の[F[停止済み]]が[[真]]の場合、
== [33] ここで停止します。
= [69] [VAR[中断信号]]を、[[真]]に設定します。
= [29] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]
: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[TIMEOUT][GeolocationPositionError]]
]FIG]
= [30] [VAR[エラーコールバック]]に[VAR[エラー]]を報告します。
= [65] [VAR[次の処理]]を実行します。
]FIG]
]FIG]
= [27]
[[プラットフォーム]]から[[位置情報]]を取得します。
[FIG(list members)[
: 取得方法決定のヒント :
[VAR[オプション群]]の [F[[CODE[enableHighAccuracy]]]]
: 取得成功時に[[非同期的]]に実行する処理 :
[FIG(steps)[
= [31] [VAR[中断信号]]が[[真]]の場合、
== [78] ここで停止します。
= [72] [VAR[タイマー]]の[F[停止済み]]を[[真]]に設定します。
= [79] [VAR[位置]]を、
新しい
[CODE[GeolocationPosition]]
に設定します。
= [74]
キャッシュされた
[CODE[GeolocationPosition]]
を、
[VAR[位置]]に設定します。
= [39] [VAR[watch]] が[[真]]で、
[[実装依存]]の基準で[[コールバック]]が呼ばれすぎていると判断される場合、
== [66] [VAR[次の処理]]を実行します。
== [40] ここで停止します。
= [75] [VAR[成功コールバック]]に[VAR[以前の位置]]について[VAR[位置]]を報告します。
]FIG]
: 取得失敗時に[[非同期的]]に実行する処理 :
[FIG(steps)[
= [76] [VAR[中断信号]]が[[真]]の場合、
== [73] ここで停止します。
= [77] [VAR[タイマー]]の[F[停止済み]]を[[真]]に設定します。
= [41] [VAR[watch]] が[[真]]で、
[[実装依存]]の基準で[[コールバック]]が呼ばれすぎていると判断される場合、
== [83] [VAR[次の処理]]を実行します。
== [64] ここで停止します。
= [80] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]
: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[POSITION_UNAVAILABLE]]
]FIG]
= [71] [VAR[エラーコールバック]]に[VAR[エラー]]を報告します。
= [67] [VAR[次の処理]]を実行します。
]FIG]
: 取得を中断する条件 :
[VAR[中断信号]]が[[真]]になったとき
]FIG]
]FIG]
-*-*-
[54]
[DFN[[CODE[PositionCallback]]]]
は、
[[コールバック関数]]で、
[CODE[GeolocationPosition]]
を[[引数]]として実行されます。
[[返り値]]は使われません。 [SRC[>>3]]
[56]
[CODE[getCurrentLocation]]
[[メソッド]]と
[CODE[watchPosition]]
[[メソッド]]の第1引数として指定でき、必須です。
[CODE[getCurrentLocation]]
では高々1回呼び出されます。
[CODE[watchPosition]]
では任意の回数呼び出されます。
[13] [VAR[成功コールバック]]に省略可能な[VAR[以前の位置]]について
[CODE[GeolocationPosition]] [VAR[位置]]を報告するには、
次のようにします。 [SRC[>>3]]
[FIG(steps)[
= [37] [VAR[以前の位置]]が [CODE[null]] でなく、
[[実装依存]]の基準により[RUBYB[[VAR[以前の位置]]と[VAR[位置]]が十分異なる][[DFN[new position differs significantly from the previous position]]]]と''いえない''と判断される場合、
== [38] ここで停止します。
= [12] [VAR[位置]]について、
[VAR[成功コールバック]]を[[呼び出し][コールバックの実行]]ます。
]FIG]
[87]
[CODE[watchPosition]] の[[コールバック関数]]の呼び出しについて、
[[仕様書]]上は値が変化したときとされていて、
値が十分に変化したと認められない時通知されないように規定されています。
さらに、
[[ネットワークの変化]]など位置が変化した可能性があると判断し得るときに[[測位]]することになっています。
逆に変化した場合であっても[[コールバック関数]]の呼び出しは適宜間引いて良いことにされています。
[88]
性質上、こうした規定が忠実に実装されているか確認することは困難です。
[89]
実際に試してみると、値が変化していなくても[[コールバック関数]]が一定時間ごとに呼び出されることがあるようです。
[55]
[DFN[[CODE[PositionErrorCallback]]]]
は、
[[コールバック関数]]で、
[CODE[GeolocationPositionError]]
を[[引数]]として実行されます。
[[返り値]]は使われません。
[SRC[>>3]]
[57]
[CODE[getCurrentLocation]]
[[メソッド]]と
[CODE[watchPosition]]
[[メソッド]]の第2引数として指定できますが、
省略可能です。
省略された場合エラーは捨てられます。
[CODE[getCurrentPosition]]
[[メソッド]]では高々1回呼び出されます。
[25] [VAR[エラーコールバック]]に
[CODE[GeolocationPositionError]] [VAR[エラー]]を報告するには、
次のようにします。 [SRC[>>3]]
[FIG(steps)[
= [14] [VAR[エラーコールバック]]が指定された場合、
== [16] [VAR[エラー]]について、
[VAR[エラーコールバック]]を[[呼び出し][コールバックの実行]]ます。
]FIG]
[68]
[[コールバック関数]]内の[[例外]]の処理は、仕様書上明確になっていません。
[[例外の報告]]がなされて処理が継続されるものとみられます。
-*-*-
[22] キャッシュの利用可能範囲は仕様書に明記がありません。
現在の文書でしょうか。
[CODE[getCurrentPosition]]
と
[CODE[watchPosition]]
で共有できるのかも定かではありません。
[86]
[[仕様書]]は
[CODE[GeolocationPosition]]
の再利用のみ想定していて、
別の[[文書]]が取得した情報やほかの[[アプリ]]の取得した情報の
([[プラットフォーム]]を介した)
再利用は規定していません。
[[Webブラウザー]]や[[プラットフォーム]]の設計によりそうした再利用が発生することも考えられます。
もちろんその場合は測位値は再利用でも
[CODE[GeolocationPosition]]
[[オブジェクト]]は新しいものになります。
(そしてそのような形の再利用は仕様違反ではありません。)
* 歴史
[1] [CITE@en[Geolocation API Specification]]
( ([TIME[2013-10-22 23:10:42 +09:00]] 版))
<http://www.w3.org/TR/geolocation-API/#get-current-position>
[4] [CITE@en[Geolocation API Specification]]
([TIME[2019-03-18 21:22:13 +09:00]])
<https://w3c.github.io/geolocation-api/#dom-geolocation-watchposition>
[2]
[[Android]] の [[Chrome]] では、既定の状態で、ほぼ毎秒くらいの頻度でコールバックが呼び出されます。[TIME[2020-04-15T08:06:25.400Z]]