| | |
| | | #import <IntentsUI/IntentsUI.h> |
| | | #import "HDLRunSceneIntent.h" //上方“设置Custom Intents”图中右边箭头指的“Class Name” |
| | | #import "HDLSiriSceneListCell.h" |
| | | #import "HDLSiriSceneModel.h" |
| | | #import "HDLSectionHeaderView.h" |
| | | #import "HDLSceneSiri.h" |
| | | #import "TopBarView.h" |
| | | #import "HDLSiriShortcutModel.h" |
| | | |
| | | |
| | | NSString * const HDLSiriSceneListCellIdentifier = @"HDLSiriSceneListCellIdentifier"; |
| | | |
| | |
| | | - (void)viewDidLoad { |
| | | [super viewDidLoad]; |
| | | [self.navigationController setNavigationBarHidden:YES animated:YES]; |
| | | self.view.backgroundColor = HEXCOLORA(0xF7F7FC,1.0); |
| | | self.view.backgroundColor = HEXCOLORA(0xF2F3F7,1.0); |
| | | [self initView]; |
| | | // Do any additional setup after loading the view. |
| | | } |
| | | |
| | | /// initView |
| | | - (void)initView{ |
| | | -(void)initLlanguage{ |
| | | NSString *languageName = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0]; |
| | | |
| | | // 简体中文 |
| | | if ([languageName rangeOfString:@"zh-Hans"].location != NSNotFound) { |
| | | //标题 |
| | | if(self.titleName == nil || [self.titleName isEqual:@""]){ |
| | | self.titleName = @"Siri快捷指令"; |
| | | } |
| | | |
| | | }else{ |
| | | //标题 |
| | | if(self.titleName == nil || [self.titleName isEqual:@""]){ |
| | | self.titleName = @"Siri Shortcuts"; |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /// initView |
| | | - (void)initView{ |
| | | [self initLlanguage]; |
| | | [self setTopBarViewWithTitle:self.titleName]; |
| | | [self initTableView]; |
| | | [self refreshSiri]; |
| | |
| | | //设置标题和返回按钮 |
| | | - (void)setTopBarViewWithTitle:(NSString *)title{ |
| | | [self.view addSubview:self.topBarView]; |
| | | self.topBarView.backgroundColor = UIColor.whiteColor; |
| | | self.topBarView.backgroundColor = HEXCOLORA(0xF7F7F7, 1.0); |
| | | self.topBarView.titleLabel.text = title; |
| | | } |
| | | //返回 |
| | |
| | | } |
| | | else { |
| | | [self.navigationController popViewControllerAnimated:YES]; |
| | | // [self.navigationController popToRootViewControllerAnimated:YES]; |
| | | } |
| | | } |
| | | |
| | | #pragma NSMutableArray |
| | | - (NSMutableArray *)dataSource { |
| | | if (!_dataSource) { |
| | | _dataSource = [NSMutableArray new]; |
| | | } |
| | | return _dataSource; |
| | | } |
| | | |
| | | #pragma mark - UITableView |
| | |
| | | return _tableView; |
| | | } |
| | | - (void)initTableView{ |
| | | self.tableView.frame = CGRectMake(0, APP_TOP_BAR_HEIGHT + 12, APP_SCREEN_WIDTH, APP_VISIBLE_HEIGHT - APP_TAB_BOTTOM_HEIGHT-12); |
| | | self.tableView.frame = CGRectMake(0, APP_TOP_BAR_HEIGHT , APP_SCREEN_WIDTH, APP_VISIBLE_HEIGHT - APP_TAB_BOTTOM_HEIGHT); |
| | | // self.tableView.backgroundColor = HEXCOLORA(0xF7F7FC,1.0); |
| | | [self.view addSubview:self.tableView]; |
| | | // [self.tableView reloadData]; |
| | | |
| | | } |
| | | #pragma mark - 让tableView的每个section的headerview随tableview一起滚动 |
| | | - (void)scrollViewDidScroll:(UIScrollView *)scrollView { |
| | | if (scrollView == self.tableView) |
| | | { |
| | | CGFloat sectionHeaderHeight = 65.0f; |
| | | if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) { |
| | | scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0); |
| | | } else if (scrollView.contentOffset.y>=sectionHeaderHeight) { |
| | | scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | #pragma mark - UITableViewDataSourceXW |
| | | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
| | | |
| | | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
| | | return self.dataSource.count; |
| | | } |
| | | |
| | | - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ |
| | | return 65.0f; |
| | | } |
| | | |
| | | - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ |
| | | HDLSectionHeaderView *view = [[HDLSectionHeaderView alloc]init]; |
| | | HDLSiriShortcutModel *model = self.dataSource[section]; |
| | | if(model){ |
| | | view.titleLabel.text = model.title; |
| | | view.messageLabel.text = model.content; |
| | | } |
| | | return view; |
| | | } |
| | | |
| | | - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ |
| | | return 8.0f; |
| | | } |
| | | |
| | | - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{ |
| | | return [[UIView alloc]init]; |
| | | } |
| | | |
| | | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
| | | HDLSiriShortcutModel *model = self.dataSource[section]; |
| | | if(model && model.list){ |
| | | return model.list.count; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
| | |
| | | if (cell == nil) { |
| | | cell = [[HDLSiriSceneListCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:HDLSiriSceneListCellIdentifier]; |
| | | } |
| | | |
| | | HDLSiriSceneModel *model = self.dataSource[indexPath.row]; |
| | | cell.homeId = self.homeId; |
| | | HDLSiriControlModel *model = [self getModelWithNSIndexPath:indexPath]; |
| | | if(model){ |
| | | if (@available(iOS 12.0, *)) { |
| | | HDLRunSceneIntent *intent = [self getSceneIntent: model.userSceneId]; |
| | | HDLRunSceneIntent *intent = [self getSceneIntent: model.controlId]; |
| | | [cell initModel:model intent:intent]; |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | #pragma mark - UITableViewDelegate |
| | | |
| | | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { |
| | | return 72; |
| | | return 50; |
| | | } |
| | | |
| | | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
| | | [tableView deselectRowAtIndexPath:indexPath animated:YES]; |
| | | |
| | | if (@available(iOS 12.0, *)) { |
| | | HDLSiriSceneModel *model = self.dataSource[indexPath.row]; |
| | | HDLSiriControlModel *model = [self getModelWithNSIndexPath:indexPath]; |
| | | if(model){ |
| | | INVoiceShortcut *voiceShortcut = [self getSceneINVoiceShortcut:model.userSceneId]; |
| | | INVoiceShortcut *voiceShortcut = [self getSceneINVoiceShortcut:model.controlId]; |
| | | [self addOrEditVoiceShortcut:voiceShortcut model:model]; |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | /// 根据NSIndexPath 获取model |
| | | /// @param indexPath indexPath |
| | | -(HDLSiriControlModel *)getModelWithNSIndexPath:(NSIndexPath *)indexPath { |
| | | HDLSiriControlModel *model = nil; |
| | | HDLSiriShortcutModel *ssModel = self.dataSource[indexPath.section]; |
| | | if(ssModel && ssModel.list && (ssModel.list.count > indexPath.row)){ |
| | | model = ssModel.list[indexPath.row]; |
| | | } |
| | | return model; |
| | | } |
| | | |
| | | /// 添加或者编辑快捷指令 |
| | | /// @param voiceShortcut 快捷指令 |
| | | /// @param model 场景 |
| | | -(void)addOrEditVoiceShortcut:(INVoiceShortcut *)voiceShortcut model:(HDLSiriSceneModel*)model API_AVAILABLE(ios(12.0)){ |
| | | -(void)addOrEditVoiceShortcut:(INVoiceShortcut *)voiceShortcut model:(HDLSiriControlModel*)model API_AVAILABLE(ios(12.0)){ |
| | | |
| | | if(voiceShortcut==nil){ |
| | | //1.如果不存在则添加 |
| | |
| | | } |
| | | |
| | | |
| | | - (INShortcut *) getINShortcut:(HDLSiriSceneModel*)model API_AVAILABLE(ios(12.0)){ |
| | | NSString *title = model.name; |
| | | - (INShortcut *) getINShortcut:(HDLSiriControlModel*)sceneModel API_AVAILABLE(ios(12.0)){ |
| | | NSString *title = sceneModel.controlName; |
| | | HDLRunSceneIntent *intent = [[HDLRunSceneIntent alloc] init]; |
| | | intent.sceneId = model.userSceneId; |
| | | intent.suggestedInvocationPhrase = title; //在Siri语音设置时显示的建议设置唤起文字 |
| | | intent.sceneName = title; |
| | | intent.controlId = sceneModel.controlId; |
| | | intent.controlName = title; |
| | | intent.homeId = self.homeId; |
| | | intent.controlType = sceneModel.controlType; |
| | | intent.controlJSONStr = sceneModel.controlJSONStr; |
| | | intent.actionName = sceneModel.actionName; |
| | | INShortcut *shortCut = [[INShortcut alloc] initWithIntent:intent]; |
| | | return shortCut; |
| | | } |
| | | |
| | | |
| | | /// 根据场景ID或者之前配置过低快捷指令 |
| | | /// @param sceneId 场景ID |
| | | - (HDLRunSceneIntent*)getSceneIntent:(NSString *)sceneId API_AVAILABLE(ios(12.0)){ |
| | | /// @param controlId 唯一标识ID |
| | | - (HDLRunSceneIntent*)getSceneIntent:(NSString *)controlId API_AVAILABLE(ios(12.0)){ |
| | | HDLRunSceneIntent *intentFind = nil; |
| | | for (INVoiceShortcut *voiceShortcut in self.siriShortcutList) { |
| | | HDLRunSceneIntent *intent = (HDLRunSceneIntent *)voiceShortcut.shortcut.intent; |
| | | if(intent){ |
| | | if([intent.sceneId isEqualToString:sceneId]){ |
| | | if([intent.controlId isEqualToString:controlId]){ |
| | | intentFind = intent; |
| | | break; |
| | | } |
| | |
| | | } |
| | | |
| | | /// 根据场景ID或者之前配置过低快捷指令 |
| | | /// @param sceneId 场景ID |
| | | - (INVoiceShortcut*)getSceneINVoiceShortcut:(NSString *)sceneId API_AVAILABLE(ios(12.0)){ |
| | | /// @param controlId 唯一标识ID |
| | | - (INVoiceShortcut*)getSceneINVoiceShortcut:(NSString *)controlId API_AVAILABLE(ios(12.0)){ |
| | | INVoiceShortcut *voiceShortcutFind = nil; |
| | | for (INVoiceShortcut *voiceShortcut in self.siriShortcutList) { |
| | | HDLRunSceneIntent *intent = (HDLRunSceneIntent *)voiceShortcut.shortcut.intent; |
| | | if(intent){ |
| | | if([intent.sceneId isEqualToString:sceneId]){ |
| | | if([intent.controlId isEqualToString:controlId]){ |
| | | voiceShortcutFind = voiceShortcut; |
| | | break; |
| | | } |