2017-02-28 5 views
27

Google का कस्टम आईओएस ऐप, Gboard, एक दिलचस्प विशेषता है जिसे आईओएस एसडीके (आईओएस 10 के रूप में) में सार्वजनिक एपीआई का उपयोग करके पूरा नहीं किया जा सकता है। मैं जानना चाहता हूं कि Google ने गॉबोर्ड में ऐप स्विचिंग स्टैक में प्रोग्रामिंग के एक प्रोग्राम को पॉप-अप करने का कार्य कैसे पूरा किया है।Google का कस्टम आईओएस कीबोर्ड, गबोर्ड, प्रोग्रामेटिक रूप से सामने वाले ऐप को कैसे खारिज करता है?

कस्टम आईओएस कीबोर्ड में दो प्रमुख घटक हैं: कंटेनर ऐप और कीबोर्ड ऐप एक्सटेंशन। कीबोर्ड ऐप एक्सटेंशन एक अलग ओएस प्रक्रिया में चलता है जो तब भी शुरू होता है जब कोई उपयोगकर्ता अपने फोन पर किसी ऐप में होता है जिसके लिए टेक्स्ट इनपुट की आवश्यकता होती है।

ये अनुमानित चरण हैं, जो पीछा किया जा सकता है, Gboard का उपयोग कर, प्रोग्राम के रूप में पिछले ऐप्लिकेशन की ओर लौटने का प्रभाव देखने के लिए कर रहे हैं:

  1. एक उपयोगकर्ता अपने iPhone पर एप्पल Messages एप्लिकेशन शुरू होता है और एक पाठ क्षेत्र पर टैप पाठ दर्ज करना शुरू करने के लिए।
  2. गबोर्ड कीबोर्ड एक्सटेंशन लॉन्च किया गया है और उपयोगकर्ता गबोर्ड कस्टम कीबोर्ड देख रहे हैं (जबकि वे अभी भी ऐप्पल संदेश ऐप में हैं)।
  3. उपयोगकर्ता वॉयस-टू-टेक्स्ट इनपुट करने के लिए गॉबोर्ड कीबोर्ड एक्सटेंशन के अंदर माइक्रोफ़ोन कुंजी को टैप करता है।
  4. गबोर्ड कंटेनर ऐप लॉन्च करने के लिए custom url scheme का उपयोग करता है। गॉबोर्ड कीबोर्ड और ऐप्पल संदेश ऐप को ऐप स्टैक में एक परत को धक्का दिया जाता है और गॉबर कंटेनर ऐप अब ऐप स्टैक में सबसे पहला ऐप है। गबोर्ड कंटेनर ऐप उपयोगकर्ता के भाषण को सुनने के लिए माइक्रोफोन का उपयोग करता है और इसे स्क्रीन पर रखे पाठ में अनुवाद करता है।
  5. उपयोगकर्ता "पूर्ण" बटन टैप करता है जब वे स्क्रीन पर दिखाई देने वाले टेक्स्ट इनपुट से संतुष्ट होते हैं।
  6. यह वह जगह है जहां जादू होता है ... क्योंकि टेक्स्ट इनपुट स्क्रीन को खारिज कर दिया जाता है, तो गबोर्ड कंटेनर ऐप भी स्वचालित रूप से खारिज कर दिया जाता है। गबोर्ड कंटेनर ऐप चला जाता है और ऐप्पल मैसेज ऐप द्वारा प्रतिस्थापित किया जाता है (कभी-कभी गबोर्ड कीबोर्ड एक्सटेंशन प्रक्रिया अभी भी जिंदा है, कभी-कभी इसे फिर से लॉन्च किया जाता है, और कभी-कभी इसे टेक्स्ट फ़ील्ड के अंदर टैप करके मैन्युअल रूप से पुनः लॉन्च करने की आवश्यकता होती है।)। Google इसे कैसे पूरा करता है?
  7. अंत में, उपयोगकर्ता उस टेक्स्ट को देखता है जिसे टेक्स्ट इनपुट फ़ील्ड के अंदर स्वचालित रूप से डाला गया था। संभावित रूप से Google इसे sharing data द्वारा गबोर्ड कंटेनर ऐप और कीबोर्ड एक्सटेंशन के बीच पूरा करता है।

मुझे लगता है कि गूगल ऑब्जेक्टिव-सी क्रम आत्मनिरीक्षण का उपयोग कर स्थिति पट्टी के दृश्य पदानुक्रम खोज और किसी भी तरह नल घटनाओं synthesizing या एक संपर्क में लक्ष्य/कार्रवाई को फोन करके निजी एपीआई उपयोग कर रहा है ग्रहण करेंगे। मैंने इसे बहुत कम खोज लिया है और स्टेटस बार के अंदर दिलचस्प UIView उप-वर्गों को खोजने में सक्षम है, जैसे UIStatusBarBreadcrumbItemView जिसमें UISystemNavigationAction एस की एक सरणी शामिल है। मैं उम्मीद में इन कक्षाओं का पता लगाने के लिए जारी रख रहा हूं कि मैं उपयोगकर्ता बातचीत को दोहराने का कोई तरीका ढूंढ सकता हूं।

मैं समझता हूं कि निजी एपीआई का उपयोग करना ऐप स्टोर से आपके ऐप सबमिशन को अस्वीकार करने का एक अच्छा तरीका है - यह कोई चिंता नहीं है कि मैं जवाब में संबोधित करना चाहता हूं। मैं मुख्य रूप से विशिष्ट उत्तरों के लिए देख रहा हूं कि Google कैसे गॉबर में ऐप स्विचिंग स्टैक में प्रोग्रामिंग के एक प्रोग्राम को पॉप-अप करने का कार्य पूरा करता है।

+0

क्या यह किसी भी मनमाने ढंग से आवेदन के साथ होता है? सिस्टम संदेश ऐप के मामले में, यह काफी आसान है - इसे लॉन्च करने की एक योजना है: https://developer.apple.com/library/content/featuredarticles/iPhoneURLScheme_Reference/SMSLinks/SMSLinks.html। यदि यह अन्य ऐप्स (विशेष रूप से कम लोकप्रिय वाले) के साथ भी काम करता है तो यह वास्तव में उत्सुक होगा। – Losiowaty

+0

@Losiowaty यह किसी भी मनमाने ढंग से आवेदन के साथ होता प्रतीत होता है। – Prairiedogg

+0

चरण 4 के बारे में, मैं कंटेनर/होस्ट ऐप नहीं खोल सकता, आप यह कैसे करते हैं? धन्यवाद – Changwei

उत्तर

26

आपका अनुमान सही है - गबोर्ड इसे करने के लिए निजी एपीआई का उपयोग कर रहा है।

... हालांकि दृश्य पदानुक्रम या घटना इंजेक्शन की खोज के माध्यम से नहीं।

जब वॉयस-टू-टेक्स्ट एक्शन किया जाता है, तो हम एक्सकोड या कंसोल से syslog जांच सकते हैं कि यह -[AVAudioSession setActive:withOptions:error:] विधि को कॉल करता है। तो मैंने गबोर्ड ऐप को रिवर्स-इंजीनियर किया है और इससे संबंधित स्टैक ट्रेस की तलाश की है।

कॉल स्टैक हम -[GKBVoiceRecognitionViewController navigateBackToPreviousApp] विधि पा सकते हैं ऊपर चढ़ना, और ...

enter image description here

_systemNavigationAction? हां, निश्चित रूप से निजी एपीआई।

चूंकि class_getInstanceVariable एक सार्वजनिक एपीआई है और "_systemNavigationAction" एक स्ट्रिंग अक्षर है, स्वचालित परीक्षक निजी एपीआई उपयोग को नोट करने में सक्षम नहीं है, और मानव समीक्षकों को शायद पिछले ऐप पर वापस कूदने में कुछ भी गलत नहीं दिख रहा है " व्यवहार। या शायद इसलिए कि वे गूगल रहे हैं और आप नहीं कर रहे हैं ...


वास्तविक कोड करता है कि "पिछले ऐप्लिकेशन पर लगातार वापस कूद" कार्रवाई इस तरह है:

@import UIKit; 
@import ObjectiveC.runtime; 

@interface UISystemNavigationAction : NSObject 
@property(nonatomic, readonly, nonnull) NSArray<NSNumber*>* destinations; 
-(BOOL)sendResponseForDestination:(NSUInteger)destination; 
@end 

inline BOOL jumpBackToPreviousApp() { 
    Ivar sysNavIvar = class_getInstanceVariable(UIApplication.class, "_systemNavigationAction"); 
    UIApplication* app = UIApplication.sharedApplication; 
    UISystemNavigationAction* action = object_getIvar(app, sysNavIvar); 
    if (!action) { 
     return NO; 
    } 
    NSUInteger destination = action.destinations.firstObject.unsignedIntegerValue; 
    return [action sendResponseForDestination:destination]; 
} 

विशेष रूप से, -sendResponseForDestination: विधि प्रदर्शन वास्तविक "वापस जाएं" कार्रवाई।

(के बाद से एपीआई undocumented है, Gboard वास्तव में एपीआई गलत तरीके से। वे गलत हस्ताक्षर -(void)sendResponseForDestination:(id)destination इस्तेमाल किया उपयोग कर रहा है। लेकिन यह होता है कि 1 के अलावा अन्य सभी नंबरों को एक ही काम करेंगे, तो गूगल के डेवलपर्स इस बार भाग्यशाली हो)

+0

महान उत्तर! मुझे संदेह है कि Google ने जानबूझकर इसे छिपाने की कोशिश की, हालांकि। मुझे लगता है कि बड़े निगमों के बीच कुछ हद तक निजी एपिस की अनुमति है। – Segev

+0

बस प्रभावशाली! इस पर प्रकाश डालने के लिए धन्यवाद। बस यह सुनिश्चित करने के लिए कि मुझे यह सही लगता है: क्या कोड हमें भी काम करने के लिए प्रदान किया गया है या यह अभी भी निजी एपीआई है? –

+0

@ AhmetAkkök यह अभी भी ऐप्पल के लिए निजी है। – kennytm

संबंधित मुद्दे