IOS рдкрд░ рджреБрд░реНрдЧрдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╕реНрдЯрдо рддрд░реАрдХрд╛



рдкреЙрдЬрд┐рдЯрд┐рд╡ рд╣реИрдХ рдбреЗрдЬрд╝ рдкрд░ рдЕрдкрдиреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде iOS 6 рдореЗрдВ MACH рд╕реНрддрд░ рдкрд░ рдХреЙрдиреНрдлрд┐рдб рдбреЗрдореЙрди рдкрд░ рд╢реЛрдз рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, iOS рдореЗрдВ рд╡рд╛рдИ-рдлрд╛рдИ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдПрдбреЙрдкреНрдЯрд░ рдХреЗ SSID, BSSID рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╕рдВрдХреЗрдд рд╢рдХреНрддрд┐? рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдкреНрд░рд╛рдЗрд╡реЗрдЯ рдПрдкреАрдЖрдИ рдФрд░ рдЬреЗрд▓рдмреНрд░реЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╕реАрдЦрдирд╛ рд╣реИред

рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░реВрдВрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдИрдУрдПрд╕ 5. * рдлрд░реНрдорд╡реЗрдпрд░ рдкрд░ред рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ Apple рд╕рд┐рд╕реНрдЯрдо рд▓реЙрдЧ рд╕реБрд╡рд┐рдзрд╛ : рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ рдЬреЛ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рдордп рдУрдПрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдФрд░ рд╕рд┐рдЧреНрдирд▓ рдХреА рддрд╛рдХрдд рджрд┐рдЦрд╛рдИред рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рд╛:

aslmsg asl, message; aslresponse searchResult; int i; const char *key, *val; NSMutableArray *result_dicts = [NSMutableArray array]; asl = asl_new(ASL_TYPE_QUERY); if (!asl) { DDLogCError(@"Failed creating ASL query"); } asl_set_query(asl, "Sender", "kernel", ASL_QUERY_OP_EQUAL); asl_set_query(asl, "Message", "AppleBCMWLAN Joined BSS:", ASL_QUERY_OP_PREFIX|ASL_QUERY_OP_EQUAL); searchResult = asl_search(NULL, asl); while (NULL != (message = aslresponse_next(searchResult))) { NSMutableDictionary *tmpDict = [NSMutableDictionary dictionary]; for (i = 0; (NULL != (key = asl_key(message, i))); i++) { NSString *keyString = [NSString stringWithUTF8String:(char *)key]; val = asl_get(message, key); NSString *string = [NSString stringWithUTF8String:val]; [tmpDict setObject:string forKey:keyString]; } [result_dicts addObject:tmpDict]; } aslresponse_free(searchResult); asl_free(asl); 


рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдРрдкреНрдкрд▓ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдкрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдПрд╕рдПрд▓ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ред рдореБрдЭреЗ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рддрд░реАрдХреЗ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рдереАред рддрдм рдкреНрд░рд╢реНрди рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдореИрдХ рдУрдПрд╕ рдФрд░ рдЖрдИрдУрдПрд╕ рдкрд░ рдХреЛрдИ рдХреИрд╕реЗ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдХреБрдЯрд┐рд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреЛ рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред IOS 6 рдФрд░ рдЬреЗрд▓рдмреНрд░реЗрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг iPhone рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рднреА рдЗрд╕ рдкрд░ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕рдВрдХреЗрдд рдерд╛, рдПрдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рдзрд╛рдЧрд╛, рдФрд░ рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдореИрдВ iOS рдкрд░ SystemConfiguration рдХреЗ рд▓рд┐рдП "рдФрд░ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВ"ред

рдкрде рд╕рд░рд▓ рдФрд░ рдкрд╛рдЧрд▓рдкрди рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ рд╣реЛ рдЧрдпрд╛ - SystemConfiguration.framework рдкреБрд╕реНрддрдХрд╛рд▓рдпред рдЗрд╕рдХреЗ рд╕рд╛рде, рдореИрдХ рдУрдПрд╕ рдкрд░, рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рдпрд░рд▓реЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЖрдИрдУрдПрд╕ рдкрд░ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рджреБрдЦрдж рд╣реИ: рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд╖рд┐рджреНрдз рд╣реИред

 CFPropertyListRef SCDynamicStoreCopyValue ( SCDynamicStoreRef store, CFStringRef key ) __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_NA); 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдЖрдо рддреМрд░ рдкрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред

  void *handle = dlopen("/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration", RTLD_LAZY); CFArrayRef (*_SCDynamicStoreCopyKeyList)(int store, CFStringRef pattern) = dlsym(handle, "SCDynamicStoreCopyKeyList"); NSLog(@"Lib handle: %u", handle); NSString *key = @"State:/Network/Global/DNS"; CFArrayRef testarrray = _SCDynamicStoreCopyKeyList(0, CFSTR("State:/Network/Interface/en0/AirPort")); NSLog(@"Tested array res: %@", testarrray); 


рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрдкреНрдкрд▓ рдкрд░ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХреЛрдИ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд▓реЙрдХ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдРрдкрд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЦреБрдж рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ?

рд╕реНрд░реЛрдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рдирд┐рдХрд▓рд╛: рдпрд╣ рдХреЙрдиреНрдлрд┐рдб рдбреЗрдорди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рддрдм рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк SCDynamicStoreCopyValue рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдкрдврд╝рддреЗ рд╣реИрдВред

 #include "config.h" /* MiG generated file */ ... /* send the key & fetch the associated data from the server */ status = configget(storePrivate->server, myKeyRef, myKeyLen, &xmlDataRef, (int *)&xmlDataLen, &newInstance, (int *)&sc_status); 


рдареАрдХ рд╣реИред MACH рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЗрдирд░реЗрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛ рд░рд╣реА рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдордЖрдИрдЬреА рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рд╡рд░рдг рд╣реИ, рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рд╕ рдореЗрдВ рд╣реИред

 routine configget ( server : mach_port_t; key : xmlData; out data : xmlDataOut, dealloc; out newInstance : int; out status : int); 


рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рд░рд╛рд╕реНрддреЗ рд╣реИрдВ - рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдФрд░ рдПрдХ рдЬреЗрдбреА рдХрд╛ рд░рд╛рд╕реНрддрд╛ред рдЖрдк config.defs рдлрд╝рд╛рдЗрд▓ рдкрд░ рдорд╛рдЗрдЧ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдзреНрдпрдпрди рдХреЗ рд╕рдордп, рд╣рдореЗрдВ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ :) рдирддреАрдЬрддрди, рдбреАрдЖрдИрдПрдо рд╕реНрдХрд╛рдИрд▓рд╛рд░реЛрд╡, рдЬреЛ рдПрдордПрд╕реАрдПрдЪ рдкреЛрд░реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдХреЛ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рдпрд╣ рдкреВрд░реА рд╡рд┐рдзрд┐ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ред

 #define kMachPortConfigd "com.apple.SystemConfiguration.configd" -(NSDictionary *)getSCdata:(NSString *)key { if(SYSTEM_VERSION_LESS_THAN(@"6.0")) { // It does not work on iOS 5.* return nil; } struct send_body {mach_msg_header_t header; int count; UInt8 *addr; CFIndex size0; int flags; NDR_record_t ndr; CFIndex size; int retB; int rcB; int f24; int f28;}; mach_port_t bootstrapport = MACH_PORT_NULL; mach_port_t configport = MACH_PORT_NULL; mach_msg_header_t *msg; mach_msg_return_t msg_return; struct send_body send_msg; // Make request CFDataRef extRepr; extRepr = CFStringCreateExternalRepresentation(NULL, (__bridge CFStringRef)(key), kCFStringEncodingUTF8, 0); // Connect to Mach MIG port of configd task_get_bootstrap_port(mach_task_self(), &bootstrapport); bootstrap_look_up2(bootstrapport, kMachPortConfigd, &configport, 0, 8LL); // Make request send_msg.count = 1; send_msg.addr = (UInt8*)CFDataGetBytePtr(extRepr); send_msg.size0 = CFDataGetLength(extRepr); send_msg.size = CFDataGetLength(extRepr); send_msg.flags = 0x1000100u; send_msg.ndr = NDR_record; // Make message header msg = &(send_msg.header); msg->msgh_bits = 0x80001513u; msg->msgh_remote_port = configport; msg->msgh_local_port = mig_get_reply_port(); msg->msgh_id = 20010; // Request server msg_return = mach_msg(msg, 3, 0x34u, 0x44u, msg->msgh_local_port, 0, 0); if(msg_return) { if (msg_return - 0x10000002u >= 2 && msg_return != 0x10000010 ) { mig_dealloc_reply_port(msg->msgh_local_port); } else { mig_put_reply_port(msg->msgh_local_port); } } else if ( msg->msgh_id != 71 && msg->msgh_id == 20110 && msg->msgh_bits <= -1 ) { if ((send_msg.flags & 0xFF000000) == 0x1000000) { CFDataRef deserializedData = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, send_msg.addr,send_msg.size0, kCFAllocatorNull); CFPropertyListRef proplist = CFPropertyListCreateWithData(kCFAllocatorDefault, deserializedData, kCFPropertyListImmutable, NULL, NULL); mig_dealloc_reply_port(msg->msgh_local_port); mach_port_deallocate(mach_task_self(), bootstrapport); mach_port_deallocate(mach_task_self(), configport); mach_msg_destroy(msg); NSDictionary *property_list = (__bridge NSDictionary*)proplist; if(proplist) CFRelease(proplist); CFRelease(deserializedData); CFRelease(extRepr); return property_list; } } mig_dealloc_reply_port(msg->msgh_local_port); mach_port_deallocate(mach_task_self(), bootstrapport); mach_port_deallocate(mach_task_self(), configport); mach_msg_destroy(msg); CFRelease(extRepr); return nil; } 


рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХреЗ рдореВрд▓реНрдп рдХреБрдВрдЬреА @ "рд╕реЗрдЯрдЕрдк: / рдиреЗрдЯрд╡рд░реНрдХ / рдЗрдВрдЯрд░рдлрд╝реЗрд╕ / en0 / AirPort" рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд┐рдд рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЕрдкрдиреЗ рджрдо рдкрд░ SystemConfiguration.framework рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдФрд░ рдЬреЗрд▓рдмреНрд░реЗрдХ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЕрд╡реИрдз рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, iOS 6 рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП 100 рд╕реЗ рдЕрдзрд┐рдХ MACH рдкреЛрд░реНрдЯ рдЦреБрд▓реЗ рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдЕрдзреНрдпрдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореГрджреНрдз рдЬрдореАрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЕрднреА рддрдХ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдорд╛рди рдХреЛрдб AppStore рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕рдВрджрд░реНрдн:

- рдПрдордПрд╕реАрдПрдЪ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧрд╛рдЗрдб

- iOS рд╣реИрдХрд░реНрд╕ рд╣реИрдВрдбрдмреБрдХ

- рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдЗрдВрдЯрд░реНрдирд▓

Source: https://habr.com/ru/post/In181936/


All Articles