ãªããããå¿ èŠãªã®ã
é ããæ©ãããåäŸãã¡ã¯æé·ããŸãã åå£ãªçå®ã ããã§ç§ã®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ãµãŒãã¹ã®å®è£ ã«é¢é£ããç¬éãæããã«ããèŠèŠçãªå©ããšããŠèª°ãã«åœ¹ç«ã€ãªãå¬ããã§ãïŒãã®æ©èœã¯æ¯èŒçæ°ãããå®è£ äŸãã©ããããããŸãç¥ããªãïŒã ãŸããããããã°ãã³ã¡ã³ãæ¬ã§è³ªåã«ãçãããŸãã