
ããã©ããã®èªè
ã®çãããããã«ã¡ã¯ïŒ
ãã®äžé£ã®èšäºã§ã¯ãiOSçšã®WhatsAppããã°ããç°¡åã«äœæããæ¹æ³ã説æããŸãã 䟿å®äžãèšäºã2ã€ã®éšåã«åããŠããŸãã
- ãããžã§ã¯ãã®äœæãã·ã³ãã«ãªUIãã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãµãŒãã¹ãžã®ãã€ã³ã
- çŸããUIãäœæãããããªãšãªãŒãã£ãªã®åŒã³åºããè¿œå ããåçãšããã¥ã¡ã³ãã転éããŸã
æ®å¿µãªããã4å人ã®ãŠãŒã¶ãŒãåéãã19人ã®Instagramã®ãµãŒãã¹ã販売ããæ¹æ³ã«é¢ããããã¥ã¢ã«ã¯ãæ¬æ£ã®ã©ããã§å€±ãããŸããã 誰ããèå³ããããªããç§ã¯åœŒãèŠã€ããããšããŸãã
ç«ã®äžã§èå³ãæã£ãŠãã ããã
ãããžã§ã¯ãäœæ
Xcodeãéããæ°ãããããžã§ã¯ããäœæããŸãã

ç§ãã¡ã¯ãã·ã³ã°ã«ãã¥ãŒã¢ããªã±ãŒã·ã§ã³ãåºç€ãšããŠåããŸãã

ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ããŒã¿ãå
¥åããã次ãžããã¯ãªãã¯ããŸãã æãæ§ãããªã¬ã¬ãªã¢ãéžæããŸããã

ãããžã§ã¯ãã®æºåãã§ããŸããã

ããããããã¯äœã§ããïŒ ãã¡ã€ã«ãã°ã«ãŒãã«åå²ãããªããŠæãããããšã§ãããïŒ ãããä¿®æ£ããŸãããã

ããã¯è¯ãã§ãïŒ ç¬èªã®æ¹æ³ã§ãã¡ã€ã«ã䞊ã¹æ¿ããããšãã§ããŸããããã®ã¬ã€ãã§ã¯äžèšã®ã¢ãã«ã«åºå·ããŸãã ã¡ãªã¿ã«ãæ°ããã°ã«ãŒããäœæããããã®ããŒã®çµã¿åããã¯ãCommand + Alt + Nã§ãã
ã·ã³ãã«ãªUI
ãããŸã§ã®éãç§ã¯èªåã§æ°ããNKLoginViewControllerã¯ã©ã¹ãäœæãããããInterface Builderã§UIViewControllerãªããžã§ã¯ãã«ãã€ã³ãããããšãèš±å¯ããŸããã ãã®View Controllerã¯ããŠãŒã¶ãŒãæåã«ç®ã«ãããã®ã§ãã ããã¯è«ççã§ã-ç»é²ãªãã§ãã£ããã¯ã§ããŸããïŒ

åŒãç¶ã楜ãã¿ãªãããã¢ãŠãã¬ãããªã©ã®ããã¹ããã£ãŒã«ããšããã°ã€ã³ãã¿ã³ã®ã¢ã¯ã·ã§ã³ãNKLoginViewControllerã«ãã蟌ã¿ãŸããã IBãªããžã§ã¯ãã.mãã¡ã€ã«ã«ãã蟌ãã§ãå€éšããã¢ã¯ã»ã¹ã§ããªãããã«ããã®ãè¯ããšæããŸãã ããã«ãã³ãŒãããã©ã°ãã«åå²ãããŠãããšããæ°ã«å
¥ã£ãŠããŸãã

ã³ã³ãããŒã©ãŒã®ãã1ã€ïŒIBã®è¡šçŸãšæ°ããã¯ã©ã¹ã®äž¡æ¹ïŒãäœæããŸã-ãã£ããã®ãªã¹ãã§ãã æšæºã³ãŒãUITableViewControllerã䜿çšããŸããããã§ã¯ãä»ã®ãšããè¶
èªç¶çãªæ©èœã¯å¿
èŠãããŸããã

NKChatListTableViewController.mã³ãŒããå°ãå€æŽããŠãå°ãªããšãäœããããŒãã«ã«è¡šç€ºãããããã«ããŸãã
æŒããŠïŒ- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 20; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; cell.textLabel.text = @"Vasiliy Pupkin"; return cell; }
次ã«ãããã²ãŒã·ã§ã³ã«ã€ããŠèããŠã¿ãŸãããã ã¢ããªã±ãŒã·ã§ã³å
šäœã1ã€ã®UINavigationControllerã«çµ±åãããç¶æ³ã«å¿ããŠã³ã³ãããŒã©ãŒãããã·ã¥ããã³å¶åŸ¡ããŸãã ã¢ããªã±ãŒã·ã§ã³ãUINavigationControllerã«çµ±åããŸãïŒ éæ³ã®æéãå§ããŸãããïŒ

ãã°ã€ã³ãã¥ãŒã³ã³ãããŒã©ãŒãããã£ãããªã¹ãããŒãã«ãã¥ãŒã³ã³ãããŒã©ãŒã«ã³ã³ãããŒã©ãŒãšã»ã°ãšã®ååãè¿œå ããŸãã ãSegueToChatListããšåŒã³ãŸãããã ããããã¢ããªã±ãŒã·ã§ã³ã®å€èŠ³ã§ãã

Login View Controllerã®ã³ãŒããå°ãèŠãŠã¿ãŸãããã ãŠãŒã¶ãŒã«ããŒããŒããåãå€ãæ©äŒãäžããŸãã ãããè¡ãã«ã¯ãã³ã³ãããŒã©ãŒãããã¹ããã£ãŒã«ãã®ããªã²ãŒãã«ããŸãã

ãŸããã³ã³ãããŒã©ãŒã³ãŒãèªäœã¯æ¬¡ã®ããã«ä¿®æ£ãããŸãã
NKLoginViewController.h #import <UIKit/UIKit.h> // @interface NKLoginViewController : UIViewController <UITextFieldDelegate> @end
NKLoginViewController.m #import "NKLoginViewController.h" @interface NKLoginViewController () @property (weak, nonatomic) IBOutlet UITextField *emailTextField; @property (weak, nonatomic) IBOutlet UITextField *passwordTextField; - (IBAction)loginTouched:(UIButton *)sender; @end @implementation NKLoginViewController #pragma mark - UITextFieldDelegate - // , "Done" - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } #pragma mark - Button methods - // "". - (IBAction)loginTouched:(UIButton *)sender { [self performSegueWithIdentifier:@"SegueToChatList" sender:self]; }
ãšããããããã°ã€ã³ã³ã³ãããŒã©ãŒäžã®ãã¹ãŠã®èŠçŽ ã転éããŸããããã¯ã·ã³ãã«ãªUIã§ãã ããŒããŒãã衚瀺ããããšãã«ã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãã€ã³ã¿ã©ã¯ãã£ãã«äžã«ç§»åããæ¹æ³ã«ã€ããŠã¯ã次ã®ããŒãã§èª¬æããŸãã
ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã§ã«çªã£èŸŒãã§ããŸãïŒ

æåŸã®3çªç®ã®ã³ã³ãããŒã©ãŒãäœæããŸãã åã®ã³ã³ãããŒã©ãŒã®ã»ã«ãã¯ãªãã¯ããããšã§ãããã«å
¥ããŸãã ã³ã³ãããŒã©ãŒèªäœã¯ãããŒã¿ãœãŒã¹ãã³ã³ãããŒã©ãŒã«å²ãåœãŠãããŠããUITableViewãããã¹ããã£ãŒã«ããããã³[éä¿¡]ãã¿ã³ã§æ§æãããŠããŸãã ãã®ç»é¢ã¯çŽæçã ãšæããŸãã

以äžã®NKChatViewController.mã³ãŒãïŒ
æŒããŠïŒ #import "NKChatViewController.h" @interface NKChatViewController () @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (weak, nonatomic) IBOutlet UITextField *messageTextField; - (IBAction)sendTouched:(UIButton *)sender; @end @implementation NKChatViewController #pragma mark - View Controller life cycle - - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // , [_messageTextField becomeFirstResponder]; } #pragma mark - UITableViewDataSource - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 20; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.textLabel.text = @" "; cell.detailTextLabel.text = @", ?"; return cell; } #pragma mark - Button methods - - (IBAction)sendTouched:(UIButton *)sender { } @end
ã¡ãã»ã³ãžã£ãŒçšã®ã·ã³ãã«ãªUIã®æºåãã§ããŸããã 楜ããéšåã«å°éãã-ã¢ããªã±ãŒã·ã§ã³ã®è©°ã蟌ã¿ïŒ
ã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãµãŒãã¹ãžã®ãªã³ã¯
ã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãµãŒãã¹ãšããŠãC2CallããããŸãã ãã¡ããããµãŒããŒåŽã®èšè¿°ã劚ãããã®ã¯ãããŸãããã24æé以äžãããå ŽåããããŸãã
ããªããããªããã°ãªããªãã®ã¯ãc2call.comã«ç»é²ãã100ãã«ã§ã¢ã«ãŠã³ãã賌å
¥ããããšã§ãã æ®å¿µãªãããäœèšèªAPIã«ããç»é²ã¯ç¡æçã§ã¯æ©èœããŸããã ããããããã®èšäºãèªããšãã«äœããå€ããã§ãããã ããããæ¯æã®æ¯æãã®ä»£ããã«ãC2Callã¯ç§ãã100ãã«ãåŒãåºããç§ã®ããšãå¿ããŠããããã§ããã ãã以äžãéã¯ååŽãããŸããã§ããã 補åã賌å
¥ããããæ¯æã®ãµãã¹ã¯ãªãã·ã§ã³ã§éè©Šããããããšããå§ãããŸããã ç§ã¯ã¡ããã©å¹žéã ãšæããŸãã
ç»é²åŸãã¢ã«ãŠã³ãã賌å
¥ãããµãŒãã¹ã«ã¢ããªã±ãŒã·ã§ã³ãç»é²ããŸã-ããã¯ããªãç°¡åãªã¿ã¹ã¯ã§ã-SDKãããŠã³ããŒãããŸãã ã¢ãŒã«ã€ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯æ¹æ³ã®äŸãããã€ããããŸãã 次ã®2ã€ã®ãªããžã§ã¯ããå¿
èŠã§ãã

ãããããããžã§ã¯ãã«è»¢éããŸãã

次ã®ãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªããããžã§ã¯ãã«è¿œå ããŸãã
ãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªã®æããããªã¹ãAVFoundation.framework
Accounts.framework
AdSupport.framework
AddressBook.framework
AddressBookUI.framework
AssetsLibrary.framework
AudioToolbox.framework
CFNetwork.framework
CoreAudio.framework
Coredata.framework
Corefoundation.framework
CoreLocation.framework
Coremedia.framework
CoreTelephony.framework
CoreText.framework
CoreVideo.framework
MapKit.framework
MediaPlayer.framework
MessageUI.framework
MobileCoreServices.framework
OpenGLES.framework
QuartzCore.framework
QuickLook.framework
Security.framework
StoreKit.framework
SystemConfiguration.framework
iAd.framework
libsqlite3.dylib
libz.dylib
ãããŠããã«ãèšå®ã«ä»¥äžãèšè¿°ããŸãã
HEADER_SEARCH_PATHS = / usr / include / libxml2
OTHER_LDFLAGS = -lxml2 -lstdc ++
ARCHS = armv7
VALID_ARCHS = armv7
ããã§ã¯ãApp Delegateãå°ãå€æŽããŸãããã
NKAppDelegate.h #import <UIKit/UIKit.h> #import <SocialCommunication/SocialCommunication.h> @interface NKAppDelegate : C2CallAppDelegate <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end
NKAppDelegate.m @implementation NKAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.affiliateid = @"6B9DF5671444320162B"; self.secret = @"2fd9cd18aa4d957a4030c0455101646d"; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end
C2Callã®èŠçŽ ããµãã¯ã©ã¹åããããŒã¿ã«ã€ããŠåœŒã«äŒããŸããã ãµãŒãã¹ã®ç®¡çããã«ã§ã¢ãã£ãªãšã€ãIDãšã·ãŒã¯ã¬ããã確èªã§ããŸãã
ãã¬ãŒã ã¯ãŒã¯ã®ã»ããã¢ãããå®äºããããããã䜿çšããŸãã
ãã£ããããžãã¯å
šäœãã«ãã»ã«åããNKChatãšããNSObjectã®ãµãã¯ã©ã¹ãäœæããŸãã NKChat.mã³ãŒãã®ããããã®ãªã¹ããæäŸããããã説æããã®ã¯æ£ãããšæããŸãã
NKChat.m #import "NKChat.h" #import <SocialCommunication/SocialCommunication.h> @implementation NKChat #pragma mark - Singleton pattern - // 1 + (instancetype)sharedManager { static NKChat *sharedChat = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedChat = [self new]; }); return sharedChat; } #pragma mark - Accessors - // 2 - (NSArray *)chatHistory { return [self fetchChatHistory]; } #pragma mark - General methods - // 3 - (void)login:(NSString *)email password:(NSString *)password success:(void(^)())successBlock failure:(void(^)())failureBlock { NSDictionary *dictionary = @{@"EMail":email, @"Password":password}; [[C2CallPhone currentPhone] registerUser:dictionary withCompletionHandler:^(BOOL success, NSString *result) { if (success) { [[C2CallPhone currentPhone] startC2CallPhone]; successBlock(); } else { failureBlock(); } }]; } // 4 - (void)logout { [(C2CallAppDelegate *)[UIApplication sharedApplication].delegate logoutUser]; } // 5 - (void)sendMessage:(NSString *)message toUser:(NSString *)userId { [[C2CallPhone currentPhone] submitMessage:message toUser:userId]; } // 6 - (NSArray *)fetchChatHistory { // Managed Object NSFetchRequest *request = [[SCDataManager instance] fetchRequestForChatHistory:YES]; NSFetchedResultsController *controller = [[SCDataManager instance] fetchedResultsControllerWithFetchRequest:request sectionNameKeyPath:nil cacheName:nil]; NSError *error; [controller performFetch:&error]; // NSMutableArray *result = [NSMutableArray array]; for (NSManagedObject *chat in controller.fetchedObjects) { // NSArray *chatKeys = @[@"contact", @"lastTimestamp", @"missedEvents"]; NSMutableDictionary *inChat = [[chat dictionaryWithValuesForKeys:chatKeys] mutableCopy]; // NSMutableDictionary *dublicate = nil; for (NSMutableDictionary *dict in result) { if ([dict[@"contact"] isEqualToString:inChat[@"contact"]]) { dublicate = dict; break; } } // NSMutableArray *messages = (dublicate) ? dublicate[@"messages"] : [NSMutableArray array]; for (NSManagedObject *chatEvent in [chat valueForKey:@"chatHistory"]) { NSArray *chatEventKeys = [[[chatEvent entity] attributesByName] allKeys]; NSMutableDictionary *inChatEvent = [[chatEvent dictionaryWithValuesForKeys:chatEventKeys] mutableCopy]; // NSLog(@"%@",inChatEvent); inChatEvent[@"ManagedObject"] = chatEvent; [messages addObject:inChatEvent]; } [messages sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"timevalue" ascending:YES]]]; if (dublicate) { dublicate[@"messages"] = messages; [dublicate[@"ManagedObjects"] addObject:chat]; dublicate[@"missedEvents"] = @([dublicate[@"missedEvents"] intValue] + [inChat[@"missedEvents"] intValue]); if (!dublicate[@"name"]) dublicate[@"name"] = inChat[@"name"]; } else { inChat[@"messages"] = messages; inChat[@"ManagedObjects"] = [NSMutableArray arrayWithObject:chat]; } // if (!dublicate) [result addObject:inChat]; } // [result sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"lastTimestamp" ascending:NO]]]; // return [result copy]; } @end
é çªã«è¡ããŸãããïŒ
- æšæºãã³ãã¬ãŒãã¯ã·ã³ã°ã«ãã³ã§ãã ç°åžžã¯ãããŸããã ãã£ãããæ
åœãããªããžã§ã¯ãã1ã€ãããŸã-ããå¿
èŠãããŸããã
- å¿
èŠãªåœ¢åŒã§ãã£ããå±¥æŽã®é
åãè¿ãã¢ã¯ã»ãµã¡ãœããã
- ç»é²ããã³ãã°ã€ã³ã®æ¹æ³ã C2Callæ©èœã¯ãåãããŒã¿ã§åããŠãã°ã€ã³ãããšãã«ãã°ã€ã³ããããšã§ãã åãããŒã¿ã§2åãã°ã€ã³ãããšãåã«ãã°ã€ã³ããŸãã æ®å¿µãªããããã®æ¹æ³ã¯ç¡æã®ãµãã¹ã¯ã©ã€ããŒã«ã¯å©çšã§ããŸããã C2Callãããã€ãã£ãç»é²ãŠã£ã³ããŠãè¿œå ããŠä¿åããããšã§ããã®ã¡ãœãããåé¿ã§ããŸãã
- ãã°ã¢ãŠãã®æ¹æ³ã å®ããŠéœæ°ãªã
- ã¡ãã»ãŒãžãéä¿¡ããæ¹æ³ãéåžžã«ç°¡åã§ãã
- ãã£ããã®å±¥æŽãç®çã®åœ¢åŒã§è¿ããã²ã©ããŠæªããããŒãã«ã¯ãã¹ã¡ãœããã C2Callã䜿çšããŠééã§ãããã¹ãŠã®ç³ã¯æ¬¡ã®ãšããã§ãã æåã«ãããŒã¿ã¯Core Dataã«ä¿åãããŸãã 第äºã«ãé£çµ¡å
ã®ååã¯çµ¶ããç°ãªã£ãŠããŸã-ã©ã¡ããã®IDãæ¥ãŠã次ã«å§ãšåã 第äžã«ãä»ã®ãšãããã®æ¹æ³ãå¿ããŠãã ããã ãã®ãã¥ãŒããªã¢ã«ã§æ©èœããŸãã
ããŠããã¹ãŠã®æºåãæŽã£ãããã³ãŒãã®éæ³ã䜿ããŸãããïŒ
NKChatã®åæåããŸã è¡ã£ãŠããªãå Žåã¯ãNKAppDelegate.mã«è¿œå ããŸãã
NKAppDelegate.m #import "NKAppDelegate.h" @implementation NKAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.affiliateid = @"6B9DF5671444320162B"; self.secret = @"2fd9cd18aa4d957a4030c0455101646d"; [NKChat sharedManager]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end
NKLoginViewControllerã¯ã©ã¹ã®loginTouchedã¡ãœããããããã«å€æŽããŸãã NKChatãã€ã³ããŒãããããšãå¿ããªãã§ãã ããïŒ
æŒããŠïŒ - (IBAction)loginTouched:(UIButton *)sender { sender.enabled = NO; [[NKChat sharedManager] login:_emailTextField.text password:_passwordTextField.text success:^{ [self performSegueWithIdentifier:@"SegueToChatList" sender:self]; sender.enabled = YES; } failure:^{ sender.enabled = YES; }]; }
ããã§ã¯ããµãŒããŒããã®å¿çã®èªã¿èŸŒã¿äžã«ãã¿ã³ããªãã«ãããµãŒããŒã«èŠæ±ãéä¿¡ããæåããå Žåã¯æ°ããã³ã³ãããŒã©ãŒã«ç§»åããçµæã«é¢ä¿ãªããã¿ã³ããªã³ã«ããŸãã
ãã¥ãŒããªã¢ã«ã®ãã®éšåã§ã¯ãnikita @ borodutch.comãšluke@borodutch.comã®2ã€ã®ã¢ã«ãŠã³ãã䜿çšããŸãã ãããã®2ã€ã®é£çµ¡å
ã«ã¡ãã»ãŒãžãéä¿¡ããæ©èœãäžæçã«ããŒãã³ãŒãããŸãã
NKChatListTableViewController.mãå°ãå€æŽããŠãããã2ã€ã®é£çµ¡å
ã®ã¿ãéä¿¡ãããããã«ããŸãã
æŒããŠïŒ #import "NKChatListTableViewController.h" @interface NKChatListTableViewController () @end @implementation NKChatListTableViewController #pragma mark - UITableViewDataSource - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 2; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; cell.textLabel.text = (indexPath.row) ? @"nikita@borodutch.com" : @"luke@borodutch.com"; return cell; } @end
æäœã®çµæïŒ

NKChatListTableViewController.mã®æ¬¡ã®ã³ã³ãããŒã©ãŒã«æ
å ±ã転éããã¡ãœãããè¿œå ããŸãã
æŒããŠïŒ - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell *)sender { UIViewController *dest = segue.destinationViewController; dest.title = sender.textLabel.text; }
å¿
èŠãªãã£ããå±¥æŽãååŸããé©åãªé£çµ¡å
ã«ã¡ãã»ãŒãžãéä¿¡ããã ãã§ãïŒ ããã¯åžœåã§ããå
çã
å€ãè¯ãæ代ã®ããã«ãNKChatViewController.mã®ãªã¹ããšãã®çŽåŸã®èª¬æãæäŸããŸãã
æŒããŠïŒ #import "NKChatViewController.h" #import <SocialCommunication/SocialCommunication.h> #import "NKChat.h" @interface NKChatViewController () @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (weak, nonatomic) IBOutlet UITextField *messageTextField; - (IBAction)sendTouched:(UIButton *)sender; @end @implementation NKChatViewController { NSArray *tableData; } #pragma mark - View Controller life cycle - - (void)viewDidLoad { [super viewDidLoad]; // 1 tableData = [self getTableData]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // , [_messageTextField becomeFirstResponder]; // 2 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedMessage) name:@"kC2CallPhoneReceivedMessage" object:nil]; } #pragma mark - UITableViewDataSource - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 3 return tableData.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 4 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.textLabel.text = ([tableData[indexPath.row][@"eventType"] isEqualToString:@"MessageIn"]) ? self.title : @""; cell.detailTextLabel.text = tableData[indexPath.row][@"text"]; return cell; } #pragma mark - Button methods - - (IBAction)sendTouched:(UIButton *)sender { // 5 [[NKChat sharedManager] sendMessage:_messageTextField.text toUser:@"c45645f71465dcff18e"]; [self addMessage:_messageTextField.text]; _messageTextField.text = @""; } #pragma mark - General Methods - - (void)addMessage:(NSString *)message { // 6 NSMutableArray *mTableData = [tableData mutableCopy]; [mTableData addObject:@{@"text":message, @"eventType":@"MessageOut"}]; tableData = mTableData; [_tableView reloadData]; } - (void)receivedMessage { // 7 tableData = [self getTableData]; [_tableView reloadData]; } - (NSArray *)getTableData { // 8 for (NSDictionary *chat in [NKChat sharedManager].chatHistory) if ([chat[@"contact"] isEqualToString:self.title]) return chat[@"messages"]; return nil; } @end
é çªã«ïŒ
- ã³ã³ãããŒã©ãŒãèµ·åãããšããã«ãå¿
èŠãªããŒã¿ãå
¥åããŸã
- kC2CallPhoneReceivedMessage-ããã¯ãæ°ããã¡ãã»ãŒãžãå°çãããšããéç¥ã®ååã®å®çŸ©ã§ãã ãã®ã€ãã³ãã賌èªãã
- ãã®ãã£ããã®å±¥æŽã«ã¯ã¡ãã»ãŒãžã®ç·æ°ãšåãæ°ã®ã»ã«ãå¿
èŠã§ã
- åã»ã«ã«ã¯ãç®çã®é£çµ¡å
åãšã¡ãã»ãŒãžãäžããããŸã
- NKChatã®ã¡ãœããã䜿çšããŠã¡ãã»ãŒãžãéä¿¡ããŸãã ã¡ãã»ãŒãžãC2Callå±¥æŽã«è¿œå ããã«ã¯æéãå¿
èŠãªãããã¡ãã»ãŒãžãããŒã«ã«ã³ã³ãããŒã©ãŒããŒã¿ã«è¿œå ããŸãã éä¿¡ãã£ãŒã«ããã¯ãªã¢ãã
- ããŒã«ã«ã³ã³ãããŒã©ããŒã¿ã«ã¡ãã»ãŒãžãè¿œå ããæ¹æ³ã çŽæçã ãšæã
- ã¡ãã»ãŒãžãåä¿¡ããããã³ã³ãããŒã©ãŒã®å±¥æŽããªããŒãããããŒãã«ã®ããŒã¿ã匷å¶çã«æŽæ°ããå¿
èŠããããŸã
- å±¥æŽå
šäœã調ã¹ãŠãå¿
èŠãªé£çµ¡å
ã®å±¥æŽãè¿ãã ãã§ã
ããã«åŸããããã®ããããŸãïŒå€§ããªGIFïŒïŒ

ãããã«
ãã®ã¬ã€ãã®æåã®éšåã®æåŸã«å°éããŠããã ãããããšãããããŸãã ããã«ã2ã3æ¥ã®ç©ºãæ¥ãçŸããã®ã§ã第2éšãæžããŸãã æåã®éšåã®ãœãŒã¹ã³ãŒãã¯
ãã¡ãã§ãã
2çªç®ã®éšåã§ã¯ãUIã«é¢ããããã€ãã®ããªã±ãŒããªè³ªåã解決ããããã€ãã®C2Callãã°ïŒããšãã°ãã¡ãã»ãŒãžã®ããæåŸã®GIFã«è¡šç€ºããããã°ïŒããã€ãã¹ããã¢ããªã±ãŒã·ã§ã³ã«æ©èœãè¿œå ããããã€ãã®ç«ãå¹³ææã¡ããŸãã
ãã¥ãŒããªã¢ã«ã«ã€ããŠè³ªåãããå Žåã¯ãã³ã¡ã³ãã§æ°è»œã«è³ªåããŠãã ããããã¹ãŠãçãããŸãã
èšäºã«ã¿ã€ããã¹ã誀ããèŠã€ãã£ãå Žåã¯ãããã©ã»ã³ã¿ãŒã«ãé£çµ¡ãã ããã
ãããã