koogawa blog

iOS、Android、foursquareに関する話題

【StackOverflow活動日記】MapKit: MKAnnotation の Callout がうまく表示されない問題

割と続いております。StackOverflow活動日記です。

さて、今日回答したのはこちらの質問。

stackoverflow.com

私が得意とする MapKit 関連の質問です。

この分野で多いのが、

  • 地図上にピンが表示されない
  • ピンをタップしたときに表示されるバルーンが思い通りにならない
  • ピンがドラッグできない
  • 地図上に線が引けない

等の質問です。そして、そのほとんどが delegate プロパティのセット忘れや、delegate メソッドの実装漏れによるものです。

今回も「ピンは表示されるけど、ピンをタップしたときに表示されるバルーンにCallout(ボタンみたいなの)が表示されないよ」といった内容でした。

f:id:koogawa:20170831233019p:plain
▲この右側のボタンが表示されないようです

コメント欄のやり取りを見ると、どうやら delegate プロパティにはちゃんと self がセットされている様子です。その後、Stackoverflow のチャットルームに移動したようですが、解決には至らなかったもようです。*1

となると、次に疑うのは delegate メソッド(viewForAnnotation)の実装漏れです。質問文に載せられたソースコードをじっくり見てみると、どうやらちゃんと実装されている様子・・・いや、よく見てみると

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!

になっていました。このメソッドは Swift 3 で

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?

に変わっています。そのため、このメソッドが呼ばれず、Callout の設定も実行されずにいたようです。

その旨を回答したところ、無事問題が解決されたようです👍

***

Accept + vote up により、reputation が +25 されました。

2,500 まであと少し!がんばります💪

*1:Stackoverflowにはディスカッションのためのチャットルームが用意されている。20 reputation以上のユーザなら誰でも入室することができる

2017/8/22 から Foursquare API の Rate Limits ルールが変わったよ

TL;DR

  • 2017/8/22 までに開発者アカウントを認証しない場合、1日に呼び出せるAPIの回数が 1,000 回に制限される
  • 開発者アカウントを認証すればこの回数が 100,000 回に増える
  • ログイン不要の userless requests は対象外(呼び出せる回数に変更なし)

認証は https://ja.foursquare.com/developers/verify から行える。(クレジットカードが必要。課金されることはないとのことだが自己責任で)

はじめに

今年の6月に foursquare asia を名乗るアカウントから「Foursquareの開発者のアカウントを認証してください」というメールが届きました。

f:id:koogawa:20170824001835p:plain

・ ・ ・

なんだか日本語があやしい🤔

さらに、クレジットカードの登録も必要になるとのことなので、しばらく様子を見ることにしました。

アプリが機能しなくなる

8/23 の夜、Foursquare API を利用している私のアプリが動いていないことに気付きます。

「あのメールは本物だったのか…!」

慌てて API のレスポンスを調べてみると

HTTP/1.1 429 Too Many Requests
X-Cache-Hits:
0
Tracer-Time:
2
Content-Length:
134
X-RateLimit-Limit:
0
X-RateLimit-Remaining:
0

が返ってきていました。どうやら、1日1,000リクエストの制限に達してしまったようです。

ちなみに、1,000リクエストというのは、ユーザ一1人あたりのリミットではなく、アプリ全体のリミットです。例えば100人ユーザーがいるアプリの場合、ひとり1日10回しかAPIを呼び出せない計算になります。(これはキツイ)

あらためて公式ドキュメントを見てみると、

On August 22, 2017, if you have not verified your account, all of your existing apps will be subject to a call quota of 1,000 calls per day. You will still be able to verify your account at any time to receive 100,000 calls per day for one primary app.

の行がいつの間にか追記されていました。昨日ぐらいからこのルールが適用されたようですね。(CHANGELOGには無かったぞ!)

ちなみに、ログイン不要で使える userless requests は対象外のようです。つまり、

https://api.foursquare.com/v2/venues/search?ll=40.7,-74&
client_id=CLIENT_ID&client_secret=CLIENT_SECRET&v=YYYYMMDD

のように、oauth_token を使わずに API を利用しているアプリは何の影響もありません。

開発者アカウントを認証してみる

取り急ぎ、クレジットカードを登録して開発者アカウントを認証してみました。

Rate Limits を読む限り、次のリセット時刻(midnight UTC と書かれている)が来るまで制限は解除されないようなので、ひたすら待ちたいと思います。

アプリ利用者の皆様にはご迷惑をお掛けいたしますが、復旧まで今しばらくお待ちいただけますようお願いいたします。

2017.8.24 9:00:制限が解除されました!

【StackOverflow活動日記】ブログのサイドメニューにバナーを貼ってみた

自分のウェブサイトに Stack Overflow のプロフィールバナーを貼れることを知ったので、やり方をメモしておきます。

  1. Stack Overflow を開く
  2. ヘッダーの右にある自分のアイコンをクリック
  3. 画面上部にある「Edit Profile & Settings」をクリック
  4. 左メニューにある「Flair」をクリック
  5. 画面の下の方にある「How do I use it?」の HTML をコピーして自分のウェブサイトにペースト

これだけです!

テーマも4種類ほど用意されているようですね。

f:id:koogawa:20170818141123p:plain

「Hotdog」は見た目も強烈で目立ちそうですが、使い所が難しそうです🌶

【StackOverflow活動日記】WKWebView reload() がページをリフレッシュしてくれない件

完全に思いつきだけど、Stackoverflow活動 のログをなるべく残していきたいと思う。

Stackoverflow で何か回答してみたいけど、どんな風に回答したらよいかわからない人の参考になれば幸いである。

今回解決した質問はこちら。

stackoverflow.com

the first time load web page fail at offline. then I connect network call reload() to refresh current page, but it is not work, the WKNavigationDelegate can't get any callback.

初回ロード時にオフラインで失敗した場合、再びオンラインになった際に reload() を呼んでもページをリフレッシュしてくれないよ!という内容。

実際にコードを書いて試したところ、確かに reload() 呼んでもウンともスンとも言わない。

調べてみると、WKWebViewurl プロパティ(現在表示しているページのURLがセットされる)には初回ロード時に失敗すると nil がセットされることがわかった。

reload() メソッドはこのURLを再読み込みしようとするため、何度実行してもリフレッシュされなかったわけだ。この仕様は今まで知らなかったので勉強になった。

というわけで、ページをリフレッシュする際は url プロパティをチェックするといいよ、といった内容をサンプルコード付きで回答した。

後日、私の回答が承認され、reputation は 2350 になった。

f:id:koogawa:20170818135040p:plain

この調子で 2500 目指すぞ💪

StackOverflow、昨年リリースした Documentation の投稿受付を終了

去年リリースされた StackOverflow の Documentation というサービスを覚えているでしょうか?

www.publickey1.jp

上記の紹介記事も300以上ブックマークされていることから、日本でも一部では注目されていたのではないでしょうか。

その Documentation ですが、静かにその役目を終えようとしています。

meta.stackoverflow.com

文中では

We still think Stack Overflow Documentation is a good idea.

「我々は今もなお Documentation は良いアイデアだと思っている」という考えは強調しつつも

By May, it was clear we weren't on the right path. New users weren't coming to Documentation. So we went back to the drawing board and started another round of user interviews focused on Transact SQL. We brought on a user experience researcher to help us interview technical writers. The results were encouraging in the sense that we know a lot more about what makes for great documentation and how we might support that effort.

以前から新しいユーザー集めに苦戦していたことは認めており、それを解決するために色々と試行錯誤を重ねていたようです。

But it was also clear fixing Documentation would require a significantly larger team.

しかし、すべてを解決するためには莫大なリソースが必要になることもよくわかっていたようです。

今後

投稿されたコンテンツの扱いについては、今後ユーザーと議論しながら決めていくようです。最低限、テキストのアーカイブは提供されるとのことです。

Documentation によって獲得した reputation やバッジの取扱についても詳しく書かれているので、気になる方は読んでみると良いでしょう。

iOS 11にアップデートしたら「○○が位置情報を利用中」という青いバーが常に表示されるようになった場合の対処法

iOS 11にアップデートした直後、次のような「○○が位置情報を利用中」という青いバーが常に表示されるようになった場合の対処法です。

f:id:koogawa:20170618224214p:plainNDA期間中につき、スクリーンショットiOS 10のものを使用しています

1. どのアプリが青いバーを表示しているか確認

「○○が位置情報を利用中」の○○の部分がこの青いバーを表示しているアプリの正体です。上記の例だと、Google Maps がそれにあたります。

2. 位置情報の利用設定を変更

設定アプリを起動します。

f:id:koogawa:20170618224703p:plainNDA期間中につき、スクリーンショットiOS 10のものを使用しています

プライバシー>位置情報サービス>アプリ名

の順にタップします。

f:id:koogawa:20170618230330p:plainNDA期間中につき、スクリーンショットiOS 10のものを使用しています

「常に許可」以外 を選択することで青いバーは表示されなくなります。

注意

「このAppの使用中のみ許可」を選択した場合、当然そのアプリは起動している間しか位置情報を利用できなくなります。アプリによっては起動中以外も位置情報を取得し続けることが前提で作られているものもあります。その場合はアプリが正常に動かなくなる可能性もあるのでご注意下さい。(自己責任でお願いします)

なぜ青いバーが出るようになったのか?

技術的な理由を知りたい方は下記エントリをご覧ください。

qiita.com

【iOS 11】#WWDC17 What's New in MapKit メモ

developer.apple.com