iOS 自动提示宏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 自动提示宏相关的知识,希望对你有一定的参考价值。

参考技术A 当我们使用KVO监听属性的时候, 属性必须要写对,但是这个属性没有提示

所以我们想要写一个自动的提示宏来保证这个属性可以写对

首先我们写这个宏之前先要学习一下 逗号表达式 ->只取逗号最右边的值

但是上面的写法会报警告 Expression result unused ,意思是说 有个结果没有用到 ,但不影响结果
消除警告我们可以这样写 前面添加 void ,表示我不用你

所以这个宏我们可以这样写:
由于逗号表达式,所以这个宏,返回的只是逗号后面的内容keyPath, 逗号前面的内容可以随便写
而逗号前面的我们怎么写都不影响返回值, 但是为了可以使我们写 frame时有自动提示,所以逗号前面我们最好写 objc.keyPath 这样宏就有了自动联想功能

这样我们就可以这样使用了 keyPath(redView, frame);

这样返回的就是 frame 文本, 但是我们需要的是 @"frame"的OC字符串

这里再介绍一点: 宏里面的#号和##号的作用

在宏里面, #的作用:给右边的标识符加上双引号""

所以我们按照下面这样写:

则打印: NSLog(@"%s",keyPath(redView, frame)); 结果为: "frame"

然而我们需要的是@"frame"这样的格式...
我们的操作还没有完,所以我们只需要将C语言的字符串转成OC字符串即可

所以最终我们的宏写成这样:

所以开头我们的KVO监听属性就可以这样写了

iOS自动检测版本更新

虽然苹果官方是不允许应用自动检测更新,提示用户下载,因为苹果会提示你有多少个软件需要更新,但是有的时候提示用户一下有新版还是很有必要的。

 

首先说一下原理:

每个上架的苹果应用程序,都会有一个应用程序的ID,根据这个ID我们就可以获取到当前程序的最新版本号,然后和自己的版本号作比较,如果一样的话就是最新版,反之就不是新版,就可以提示用户来手动下载最新版的程序。因为有ID所以就可以定位到这个APP,点击下载即可。

 

源码:

一般建议检测更新的代码放到主页控制器里。

首先还要导入一个头文件用来打开AppStore下载更新

//AppStore
#import <StoreKit/StoreKit.h>

接着还有代理

SKStoreProductViewControllerDelegate

然后开始检测更新

//检测版本,版本更新
    NSError *error;
    NSString *urlStr = @"http://itunes.apple.com/lookup?id=上架AppID";
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSDictionary *appInfoDict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
    if (error)
    {
        return;
    }
    NSArray *resultArray = [appInfoDict objectForKey:@"results"];
    if (![resultArray count])
    {
        return;
    }
    
    NSDictionary *infoDict = [resultArray objectAtIndex:0];
    //获取服务器上应用的最新版本号
    NSArray* arr=[infoDict[@"version"] componentsSeparatedByString:@"."];
    NSInteger updateVersion=0;
    for (int i=0; i<arr.count; i++)
    {
        if(i==0)
        {
            updateVersion+=[arr[i] integerValue]*1000;
        }
        else if (i==1)
        {
            updateVersion+=[arr[i] integerValue]*100;
        }
        else if (i==2)
        {
            updateVersion+=[arr[i] integerValue]*10;
        }
        else if (i==3)
        {
            updateVersion+=[arr[i] integerValue]*1;
        }
    }
    NSString *trackName = infoDict[@"trackName"];
    _trackViewUrl = infoDict[@"trackViewUrl"];
//获取当前设备中应用的版本号
    NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
    NSArray* arr2=[[infoDic objectForKey:@"CFBundleShortVersionString"] componentsSeparatedByString:@"."];
    NSInteger currentVersion=0;
    
    for (int i=0; i<arr2.count; i++)
    {
        if(i==0)
        {
            currentVersion+=[arr2[i] integerValue]*1000;
        }
        else if (i==1)
        {
            currentVersion+=[arr2[i] integerValue]*100;
        }
        else if (i==2)
        {
            currentVersion+=[arr2[i] integerValue]*10;
        }
        else if (i==3)
        {
            currentVersion+=[arr2[i] integerValue]*1;
        }
    }
    
    //判断两个版本是否相同
    if (currentVersion < updateVersion)
    {
        NSString *titleStr = [NSString stringWithFormat:@"检查更新:%@", trackName];
        NSString *messageStr = [NSString stringWithFormat:@"发现新版本%@,是否更新", infoDict[@"version"]];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:titleStr message:messageStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"升级", nil];
     //为了区分其他弹出框而已 alert.tag
= 1112427256; [alert show]; }

 

接着就是用户更不更的问题了

 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    
    if (alertView.tag == 1112427256)
    {
        if (buttonIndex == 1)
        {
            //点击”升级“按钮,就从打开app store上应用的详情页面
            SKStoreProductViewController *storeProductVC = [[SKStoreProductViewController alloc] init];
            storeProductVC.delegate = self;
            NSDictionary *dict = [NSDictionary dictionaryWithObject:@"上架AppID" forKey:SKStoreProductParameterITunesItemIdentifier];
            [storeProductVC loadProductWithParameters:dict completionBlock:^(BOOL result, NSError *error)
             {
                 if (result)
                 {
                     [self presentViewController:storeProductVC animated:YES completion:nil];
                 }
             }];
        }
    }
}

还有就是用户打开AppStore但是没有下载就返回回来的状况

- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController
{
    [viewController dismissViewControllerAnimated:YES completion:nil];
}

OK到这里就结束了。这样的话就可以检测App是不是最新版了,而且用户也能实时看到,最关键的是苹果审核还能通过。

 




以上是关于iOS 自动提示宏的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中实现类似安卓自动消失提示框

使用自动填充和清除匹配相邻列 - 宏中的错误提示

EXCEL VBA 自动发送邮件功能异常

求教4.3德鲁伊宏,提示星的插件。

iOS开发中,MBProgressHUD提示自动换行

iOS自动检测版本更新