VK APIを介しお堎所を共有する方法

最近、私はVK APIを介しお友人ずほがリアルタむムモヌドで堎所を共有する方法のアむデアを実装しようずするこずにしたした。 出力は、iOS / Android向けのクロスプラットフォヌムQtアプリケヌション、VKontakte向けのWebアプリケヌション、VK API向けのプルリク゚ストでした。 この蚘事では、誰かに興味があるかもしれないいく぀かの非自明な実装ポむントを共有したいず思いたす。 だから、猫を求めお興味を持っおください。



なぜそれが必芁なのか



遅かれ早かれ、子䟛たちは成長したす。 卑劣な真実。 それで私の10歳の嚘は、「お父さん、もう車で連れお行っおはいけない。自分で孊校に行きたい」ず蚀いたした。 それで、私はクレヌムフェアを芋぀け、2週間の遅延を芁求し、準備を始めたした。



私はアプリケヌションを曞いた経隓があり、嚘は垞にiPhone SEのポケットに入れお持ち歩いおいるので、準備ずしお、嚘がこの特定の瞬間にどこにいるかを瀺すアプリケヌションをすぐに曞くこずにしたした。 はい、今ではそのようなアプリケヌションが非垞にたくさんあるこずを知っおいたす同様の機胜が最近Googleマップに登堎したした、既補の゜リュヌションを䜿甚するこずは可胜でしたが、私は自分のものを曞くこずに興味がありたした。



なぜVKontakteなのか



これから生じるすべおの「魅力」ず、他の人可胜性のある芋蟌みの機噚䞊の個人デヌタの凊理ず保存に関連付けたくないので、自分のサヌバヌパヌツなしで行う方法を考えたした。 そしお、それは私に倜明けを告げたした-結局のずころ、VKontakteのようなモンスタヌがありたす ファッショナブルでパワフルで、独自に開発されたAPIを備えおおり、最も重芁なこずは、すべおの子䟛たちが長い間座っおいおタむトだったこずです奜きだったずは蚀えたせんが、珟実です しかし、地獄、ホヌムズ、䜍眮デヌタをそこに詰め蟌んで、たず、それが必芁でない堎所に衚瀺されないように、そしお次に、あなたがこのデヌタぞのアクセスを制埡しお、圌らぞの悪いpedobirsそこに着かなかった



メモが助けになりたした。 はい、同じりィキペディアは、か぀お噂によるず人気があり、珟圚はペンになっおいるず述べおいたす。ほずんどの郚分で、圌らはテヌプのハむラむトを停止し、サむトの別のセクションに移動したした。 任意のテキストデヌタを配眮できたすが、䞻なこずは、このメモを衚瀺およびコメントできるナヌザヌずグルヌプをリストするアクセスリストを割り圓おるこずができるこずです。



私の目には、アプリケヌションの䞀般的なスキヌムは次のようになり始めたした。





だから、アむデアがありたす、それは小さな問題です-それを実珟するために。



iOS



圌女の嚘はiPhoneを䜿甚しおいるため、iOSバヌゞョンで実装を開始するこずは論理的でした。 クロスプラットフォヌムの芳点から、Qtはフレヌムワヌクずしお遞択されたした。私は長い間これに粟通しおおり、叀き良きOpen Street Mapがマップ゚ンゞンずしお遞択されたした。QtLocationにはプラグむンがありたす。 このアプリケヌションは元々オヌプン゜ヌスずしお䜜成されたため、Qtのラむセンス制限は私を怖がらせたせんでした。



GUIはVMLで動䜜するようにQMLで蚘述され、通垞のVK iOS SDKを接続しお䜿甚したした。Objective-Cで蚘述されおいるため、統合しおも問題は発生したせんでした。 iOSのバックグラりンドでの䜜業は、Significant Change Location Serviceを通じお実装されたす。 ゚ネルギヌ消費を削枛するために、アプリケヌションは動きのアクティビティを監芖し、人がほが1か所に長時間座っおいるこずたずえば、圌が孊校やオフィスに来たを理解した堎合、ゞオロケヌションを決定するために必芁な粟床を䞋げ、OSがそれを決定する゚ネルギヌ集玄床の䜎い方法方法原則ずしお、セルタワヌで。 人が積極的に動き始めたこずをアプリケヌションが理解するず、粟床が再び䞊がりたす。



iOSバヌゞョンの完党な゜ヌスコヌドはGitHubで入手できたす 。 実装プロセスで出䌚ったいく぀かの非自明なポむントを次に瀺したす。



QtアプリケヌションでNSApplicationDelegateメ゜ッドをオヌバヌラむドする



VKontakteのiOS SDKでは、アプリケヌションの関数の䞀郚にdidFinishLaunchingWithOptionsおよびapplicationopenURLoptionsメ゜ッドの呌び出しを远加する必芁がありたす。 Qtのいく぀かのバヌゞョン私の意芋では、5.11以前では、QIOSApplicationDelegateのカテゎリを次のように䜜成するだけで十分でした。



@interface QIOSApplicationDelegate : UIResponder <UIApplicationDelegate> @end @interface QIOSApplicationDelegate (QIOSApplicationDelegateVKGeoCategory) @end @implementation QIOSApplicationDelegate (QIOSApplicationDelegateVKGeoCategory) - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [...] } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { [...] } @end
      
      





しかし、Qtの最近のバヌゞョンでは、QIOSApplicationDelegateには既にapplicationopenURLoptionsの実装がありたす。そのため、カテゎリのオプションはロヌルバックしたせん。 QIOSApplicationDelegateから盞続人を䜜成し、setDelegateを介しおデリゲヌトを割り圓おる必芁がありたした。



 @interface VKGeoApplicationDelegate : QIOSApplicationDelegate @end @implementation VKGeoApplicationDelegate - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { [...] } @end void InitializeVKGeoApplicationDelegate() { [[UIApplication sharedApplication] setDelegate:[[VKGeoApplicationDelegate alloc] init]]; } int main(int argc, char *argv[]) { [...] InitializeVKGeoApplicationDelegate(); [...] }
      
      





VKRequestからの゚ラヌ凊理



゚ラヌ時にVKRequestが空の空のNSErrorを返すこずに盎面したした。 誰かの以前のパッチずこのパッチのプルリク゚ストにパッチを圓おるパッチを䜜成したしたが、ただレビュヌされおいないパッチではハングしたす。



Android



以䞋はAndroid甚のバヌゞョンです。 GUIコヌドはiOSからほが完党に再利甚され、VKずやり取りし、通垞のVK Android SDKが再び䜿甚されたした。JNIを介しお行われるやり取りは、バックグラりンドでの䜜業は、そのようなアプリケヌションに察するGoogleの芏玄に埓っお、぀たりフォアグラりンドサヌビスを通じお実装されたす。 もちろん、iOSで䜿甚されおいるのず同様に、電力消費を削枛するロゞックも実装されおいたす。



Androidバヌゞョンの゜ヌスコヌドの完党なセットはGitHubで再床入手できたす。このバヌゞョンを実装する過皋で出䌚ったいく぀かの非自明なポむントを以䞋に瀺したす。



QtでAndroidサヌビスを䜜成する方法



Qt 5.10でサヌビスを䜜成するために、QGuiApplicationの代わりに䜿甚する必芁があるQAndroidServiceクラスが衚瀺されたした。 アクティビティずサヌビス甚に別々の.soをコンパむルするか、すべおに1぀の.soを䜿甚し、コヌドが動䜜するモヌドを理解するために、コマンドラむンスむッチでこのモヌドを指定できたす。



 <service android:name=".VKGeoService"> <meta-data android:name="android.app.arguments" android:value="-service"/> </service>
      
      





 int main(int argc, char *argv[]) { if (argc == 1) { QGuiApplication app(argc, argv); [...] } else if (argc == 2 && QString(argv[1]) == "-service") { QAndroidService app(argc, argv); [...] } else { return 0; } }
      
      





onDestroyの奇劙な「ハング」アクティビティ



サヌビスを実装する過皋で、おもしろい問題が明らかになりたした。QtActivityは、onDestroyの腞のどこかに「ハング」したした。 どうやら、Qtは、アクティビティが完了した埌、アプリケヌションから䜕か他のものが残るこずを期埅しおいたせん。 この問題は、マニフェストのandroidプロセスを䜿甚しお、さたざたなプロセスにアクティビティずサヌビスを配眮するこずで解決したした。



 <service android:name=".VKGeoService" android:process=":VKGeoService"> [...] </service>
      
      





オヌバヌラむドされたonDestroyで、アクティビティが実行されおいるプロセスを釘付けしたす。



 @Override public void onDestroy() { [...] /* * This call hangs when foreground service is running, * so we just kill activity process instead (service * is running in a different process). * * super.onDestroy(); */ Process.killProcess(Process.myPid()); }
      
      





はい、糞くずは垞にこれを誓いたすが、どう察凊するかは私にはただ明らかではありたせんが、このトピックに぀いおはPoCでQTBUGにただ觊れおいたせん。



曎新 Qt 5.12.3少し前かもしれたせん-私はチェックしたせんでしたハングしたQtActivity.onDestroyのバグはサヌビスの開始時に修埩されたため、この回避策は必芁ありたせん。



VKBatchRequestをキャンセルするずきにerrorBlock呌び出しがありたせん



VKontakteサヌバヌの負荷を軜枛するためにバッチリク゚ストを広く䜿甚しおいたすが、VKBatchRequest errorBlocksをキャンセルした堎合やリク゚ストをキャンセルした堎合に問題が発生したのはAndroidすべおiOSで正垞に動䜜したすです。 ラむブラリのロヌカルバヌゞョンでこの問題を修正し、このパッチに察応するパッチずプルリク゚ストを䜜成したしたが、未確認のものでもハングしたす。



おわりに



AppleのiOSバヌゞョンはApp Storeに簡単に配眮でき、匕き続き利甚できたす。Androidバヌゞョンは、Google Playポリシヌが厳栌化されるたでしばらくの間Google Playに存圚しおいたしたゞオロケヌションを远跡するアプリケヌションは明瀺的に家族たたは䌁業での䜿甚を目的ずしおいたす、その埌、アプリケヌションはそこで安党にブロックされたした。 私の蚎えに、責任あるGoogleの埓業員たたはボットだったかもしれたせんが、誰があなたの質問に正確に答えおいるかは今では明らかではありたせんが断固ずしお「このアプリケヌションは家族や䌁業の远跡にのみ䜿甚できたす」 、私は議論するものを芋぀けるこずができたせんでした-実際、ハンマヌで釘を打぀だけでなく、あなたの頭を打぀こずもできたす... AndroidバヌゞョンをYandex.StoreずAmazon Appstoreに、APKずしおプロゞェクトのりェブサむトに配眮したした。



このアプリケヌションが、iOS / Android甚のQtアプリケヌションを曞く際のいく぀かの明癜でない瞬間、特にQtでのAndroidサヌビスの実装に関連する瞬間を明らかにする芖芚的な助けずしお誰かに圹立぀なら嬉しいですこの機胜は比范的新しく、実装䟋、どれくらいあたり知らない。 たた、もしあれば、コメント欄で質問にお答えしたす。



All Articles