iOS App版本更新

版本更新的方式:
可选更新:弹框时有取消和更新两个按钮,用户可以选择取消按钮(增加新的功能,改善用户的体验等,这种更新不会影响软件的正常的使用)
强制更新:弹框时只有一个更新按钮,用户没得选择,必须更新(系统重大漏洞,严重影响用户正常使用等必须强制用户更新,不更新就不能使用该软件)
解决方案:
方案一:
调用服务器接口获取App的版本号,如果服务器的版本号大于当前App的版本号,那么则弹框提示更新,否则就不提示
1
方案二:
获取App Store 上的应用的版本号,如果App Store 上的版本号大于当前App的版本号,那么则弹框提示更新,否则就不提示
1
两种方案比较:
方式二是调用App Store对应的接口,由于App Store服务器在外国,可能请求比较慢或者连接失败,网络不稳定;再者这种方式不能确定该版本是否是强制更新类型的;还有该方式只能用于iOS, 这让Android怎么办?这种方式唯一的优点就是可以App审核通过后,用户能在*时间进行更新

方式一是调用自己应用的服务器,网速稳定,比较灵活,可以在接口中任意定义字段如*新版本号、是否强制更新isForceUpdate 等参数;因App Store 审核需要2-3天时间,不能及时知道什么时候审核通过,可能会出现审核通过了,开发人员还不知道,这段时间获取应用的版本信息接口可能版本号还是老的,这段时间还不能更新,没有达到*时间就能更新的效果

方法一:获取自己服务器版本号检查
1. 通过网络请求获取服务器上的版本号;
2. 获取当前应用版本号;
3. 将版本号转换为整形进行比较;
4. 如果有版本更新则跳转到app store上下载。

方法二:获取app store上架版本号检查
1. 通过网络同步请求获取app store上对应APP ID的应用信息;
2. 提取信息上的*新版本号和下载地址;
3. 获取当前应用版本号;
4. 将版本号转换成双精度型进行比较;
5. 对于有两个点的版本号的*后一个点不处理。

iTunes Search API 查询应用程序信息,包括作者,版本,app 介绍页面地址等信息
iTunes Search API

获取App Store中的应用信息接口
方式一:通过APPId查询: https://itunes.apple.com/lookup?id=xxx
方式二:通过bundleId查询: http://itunes.apple.com/lookup?bundleId=xxx

App有两个版本号,一个是Version,另一个是Build,对应于Info.plist的字段名分别为CFBundleShortVersionString,CFBundleVersion。 AppSotre默认取的是Version即CFBundleShortVersionString

方式二代码示例:
#import “AppDelegate.h”
#import <AFNetworking.h>
@interface AppDelegate () <UIAlertViewDelegate>

@property (strong, nonatomic) NSString *trackViewUrl;
@end

@implementation AppDelegate
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
NSString *APPID = @”123456789″;
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@”https://itunes.apple.com/lookup” parameters:@{@”id”: APPID} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responseObject) {
/*
results:[
{
trackViewUrl = “https://itunes.apple.com/us/app/xxx/id123456789?mt=8&uo=4”;
version = “1.7.4”
}
]*/
NSLog(@”%@”, responseObject);
NSArray *results = responseObject[@”results”];
NSString *version = [[results objectAtIndex:0] objectForKey:@”version”];
self.trackViewUrl = [[results objectAtIndex:0] objectForKey:@”trackViewUrl”];

NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
float shortVersion = [infoDict[@”CFBundleShortVersionString”] floatValue];

if ([version floatValue] > shortVersion) {
NSString * title = [NSString stringWithFormat:@”检查更新: %@”, @”应用名称”];
NSString * message = [NSString stringWithFormat:@”发现新版本(%@), 是否升级 ?”, version];

UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@”取消” otherButtonTitles:@”升级”, nil];
[alertView show];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

}];

self.window.rootViewController = [[UIViewController alloc] init];
[self.window makeKeyAndVisible];
return YES;
}

– (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) {
NSURL *trackViewUrl = [NSURL URLWithString:self.trackViewUrl];
UIApplication *application = [UIApplication sharedApplication];
if ([application canOpenURL:trackViewUrl]) {
[application openURL:trackViewUrl];
}
}
}

方式一的代码和方式二差不多,只不过是请求自己应用的服务器接口,然后解析

第三方实现
第三方实现的思路一般都是上面的思路,只不过对上述代码进行封装了,比如如果将appId作为参数或者直接获取应用的bundleId,对于UIAlertView的title,message,buttonTitle作为参数提取出来,提供更简洁的方法来使用。

https://github.com/emotality/ATAppUpdate 只需要一行代码就能集成版本更新

实现逻辑是根据Bundle Identifier 去查找应用信息的

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
ATAppUpdater *updater = [ATAppUpdater sharedUpdater];
updater.alertTitle = @”版本升级”;
updater.alertMessage = @”*新版本位为:%@ “;
updater.alertCancelButtonTitle = @”暂不更新”;
updater.alertUpdateButtonTitle = @”马上更新”;
[updater showUpdateWithConfirmation];

return YES;
}

iOS检查版本更新,以及获取不到版本信息问题

-(void)versionURL{

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//耗时的操作—获取某个应用在AppStore上的信息,更改id就行

//检测版本信息 一定要注意 首先查看自己的应用销售范围是 哪里? 如果是只有一个中国 请选择1方法,否则选择 方法 2

、、、、1. NSString *stringApp = [NSString stringWithContentsOfURL:[NSURL URLWithString:@”https://itunes.apple.com/cn/lookup?id=。。”]

encoding:NSUTF8StringEncoding error:nil];

、、、、2.NSString *stringApp = [NSString stringWithContentsOfURL:[NSURL URLWithString:@”https://itunes.apple.com/lookup?id=。。”]

encoding:NSUTF8StringEncoding error:nil];

 

if (stringApp!=nil || stringApp.length>0)

{

NSData *data = [stringApp dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

//获得上线版本号

NSString *version = [[[dic objectForKey:@”results”]firstObject]objectForKey:@”version”];

//获得当前版本

NSString *currentVersion = [[[NSBundle mainBundle]infoDictionary]objectForKey:@”CFBundleShortVersionString”];

int currentVersionnum = [[currentVersion stringByReplacingOccurrencesOfString:@”.” withString:@””] intValue];

int lastVersionnum = [[version stringByReplacingOccurrencesOfString:@”.” withString:@””] intValue];

dispatch_async(dispatch_get_main_queue(), ^{

//更新界面

if (lastVersionnum > currentVersionnum) {

//自定义的更新提示弹框

}else{

//已是*高版本

NSLog(@”已经是*高版本”);

}

});

}

});

}

//点击跳转到appstore

-(void) nowNewBtnClick:(UIButton *)btn{

NSURL *url = [NSURL URLWithString:@”App在appstore的URL”];

[[UIApplication sharedApplication]openURL:url];

}

 

iPhone X面部ID解锁

/**

* 指纹/面部ID登录验证

*/

– (void)loadAuthentication

{
//1.判断iOS8及以后的版本

if([UIDevice currentDevice].systemVersion.doubleValue >= 8.0){

 

LAContext *context = [LAContext new];

 

context.localizedFallbackTitle = @””;

 

if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]){

 

//4.在可以使用的前提下就会调用

//localizedReason本地原因alert显示

 

NSString *localizedReason = @”指纹登录”;

 

if (@available(iOS 11.0, *)) {
if (context.biometryType == LABiometryTypeTouchID) {

 

 

}else if (context.biometryType == LABiometryTypeFaceID){
localizedReason = @”人脸识别”;

 

}

 

}

 

[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:localizedReason reply:^(BOOL success, NSError * _Nullable error) {

 

if(success)

{
NSLog(@”指纹认证成功”);

 

dispatch_async(dispatch_get_main_queue(), ^{

 

//验证成功的操作

});

}

else

{
//                weakSelf.helper.isAppCurrentLoginState = NO;

 

NSLog(@”指纹认证失败,%@”,error.description);

 

NSLog(@”%ld”, (long)error.code); // 错误码 error.code

 

switch (error.code)

{
case LAErrorAuthenticationFailed: // Authentication was not successful, because user failed to provide valid credentials

{
NSLog(@”授权失败”); // -1 连续三次指纹识别错误

 

dispatch_async(dispatch_get_main_queue(), ^{

 

[MyToast showWithText:@”指纹验证失败!”];

 

});

 

}

break;

case LAErrorUserCancel: // Authentication was canceled by user (e.g. tapped Cancel button)

{
NSLog(@”用户取消验证Touch ID”); // -2 在TouchID对话框中点击了取消按钮

 

dispatch_async(dispatch_get_main_queue(), ^{

 

});

 

}

break;

case LAErrorUserFallback: // Authentication was canceled, because the user tapped the fallback button (Enter Password)

{
NSLog(@”用户选择输入密码,切换主线程处理”); // -3 在TouchID对话框中点击了输入密码按钮

 

}

break;

case LAErrorSystemCancel: // Authentication was canceled by system (e.g. another application went to foreground)

{
NSLog(@”取消授权,如其他应用切入,用户自主”); // -4 TouchID对话框被系统取消,例如按下Home或者电源键

}

break;

case LAErrorPasscodeNotSet: // Authentication could not start, because passcode is not set on the device.

 

{
NSLog(@”设备系统未设置密码”); // -5

 

}

break;

case LAErrorTouchIDNotAvailable: // Authentication could not start, because Touch ID is not available on the device

{
NSLog(@”设备未设置Touch ID”); // -6

}

break;

case LAErrorTouchIDNotEnrolled: // Authentication could not start, because Touch ID has no enrolled fingers

{
NSLog(@”用户未录入指纹”); // -7

}

break;

 

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0

case LAErrorTouchIDLockout: //Authentication was not successful, because there were too many failed Touch ID attempts and Touch ID is now locked. Passcode is required to unlock Touch ID, e.g. evaluating LAPolicyDeviceOwnerAuthenticationWithBiometrics will ask for passcode as a prerequisite 用户连续多次进行Touch ID验证失败,Touch ID被锁,需要用户输入密码解锁,先Touch ID验证密码

{
NSLog(@”Touch ID被锁,需要用户输入密码解锁”); // -8 连续五次指纹识别错误,TouchID功能被锁定,下一次需要输入系统密码

 

dispatch_async(dispatch_get_main_queue(), ^{

 

 

[self openTouchIDPAssword];

});

}

break;

case LAErrorAppCancel: // Authentication was canceled by application (e.g. invalidate was called while authentication was in progress) 如突然来了电话,电话应用进入前台,APP被挂起啦”);

{
NSLog(@”用户不能控制情况下APP被挂起”); // -9

}

break;

case LAErrorInvalidContext: // LAContext passed to this call has been previously invalidated.

{
NSLog(@”LAContext传递给这个调用之前已经失效”); // -10

 

}

break;

#else

#endif

default:

{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{

NSLog(@”其他情况,切换主线程处理”);

}];

break;

}

}

}

}];

}else{
NSLog(@”请确保(5S以上机型),TouchID未打开”);

 

dispatch_async(dispatch_get_main_queue(), ^{

 

[self openTouchIDPAssword];

 

});

}

 

}else{
NSLog(@”设备不支持指纹”);

 

dispatch_async(dispatch_get_main_queue(), ^{

 

[self openTouchIDPAssword];

});

 

}

}

-(void)openTouchIDPAssword{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@”未开启系统Touch ID”message:@”请现在系统设置-TouchID密码中开启”preferredStyle:UIAlertControllerStyleAlert];

 

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@”知道了” style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

 

//无开启指纹解锁

 

}];

 

[alertController addAction:cancelAction];

 

[self presentViewController:alertController animated:YES completion:nil];

}

iPhone 12面容ID解锁设置

如果您在使用iPhone面容ID功能时,感觉到解锁和验证并不是很灵敏,有时候可能需要重复几次才能成功,可以参考如下信息:

 

1.检查手机保护膜:

 

如果面容ID识别不灵敏或者无法识别,确保手机保护壳或屏幕保护膜没有遮挡iPhone或iPad上的原深感摄像头。另外,请检查是不是有任何残留物或污垢遮挡原深感摄像头。

 

iPhone 12面容ID解锁

 

2.尝试重新设置一次面容ID。

 

3.添加替用外貌:

 

面容ID会随着他们的外貌变化而不断学习。如果您的外貌看起来变化很大,则可以设置替用外貌,以便面容ID仍可以识别您。

 

要设置替用外貌,请按照以下步骤操作:前往“设置”-“面容ID与密码”。如果系统要求您输入密码,请照做。轻点“设置替用外貌”根据提示进行设置。

 

如果您同时拥有AppleWatch,值得注意的是,iOS14.5测试版中已经加入无需摘下口罩,用户可通过AppleWatch解锁iPhone的功能。目前iOS14.5已经进入第七个测试版,相信正式版也距离不远了,届时AppleWatch用户可以留意下这个功能,及时更新正式版系统。

ios app icon 透明度打包失败的问题

*近上架打包上传到itunes connect的时候,经常会出现下面icon透明度的问题

提示:无效的App Store图标。 ‘xxx’中资源目录中的App Store图标不能是透明的,也不能包含Alpha通道。
后来又检查了一下icon,发现造成这个问题的原因是,icon确实是包含了透明度。

然后就是解决这个透明度的问题:

%title插图%num

1.用系统自带的”预览”软件打开图标;
2.菜单栏:文件——>导出
3.将alpha 的选项的勾去掉;
4.存储后,将新导出的图片重新替换一下icon,再打包上传即可.

如图:

%title插图%num

另外:app提交市场,填写app信息资料的时候,市场应用截图或者上传app的icon有时候也会有这个问题,解决办法也是如此。

iPhone12隔空投送功能怎么开启和关闭

iPhone12隔空投送功能是专门为用户提供资料传输的一个功能,仅限于iPhone用户之间使用。

 

很多刚使用iPhone12的用户对于隔空投送的功能的开启和关闭不是很熟悉,下面为大家具体讲解iPhone12隔空投送功能开启和关闭方法。

 

iPhone12隔空投送功能禁用方法:

 

1、点击打开【设置】。

 

2、点击【通用】。

 

3、点击【隔空投送】。

 

iPhone12隔空投送功能

 

4、可以看到当前并未关闭隔空投泛游送功能。

 

5、点击选择【接收关闭】即可关闭或开启此功能。

 

iPhone12隔空投送功能

上传AppStore时图像不能包含 alpha通道和透明度两种解决办法

因为这个每次找美工,有点麻烦,自己百度一下挺简单的以后在也不用求人了,哈哈哈!

 

1、用自带浏览器打开  文件—>导出—>保存时能看到是否有透明度。

 

2、用PS打开点击 图像—>模式—>索引颜色—>弹出来的框框里面就有一个透明度的选择,去掉对勾保存就好了。

Apple Watch怎么设置蜂窝网络

您可以在首次设置AppleWatch时激活蜂窝移动网络。设置期间,请找到用于设置蜂窝移动网络的选项,然后按照屏幕上的步骤操作。您也可以稍后在AppleWatch应用中设置蜂窝移动网络:

 

·在iPhone上,打开AppleWatch应用。

 

·轻点“我的手表”标签,然后轻点“蜂窝移动网络”。

 

·轻点“设置蜂窝移动网络”。

 

·按照适合您所用运营商的说明操作。您可能需要联系运营商来寻求协助。

 

Apple Watch怎么设置蜂窝网络

 

连接到蜂窝移动网络

 

支持蜂窝移动网络的AppleWatch会自动切换到*省电的可用无线网络:它可以连接到附近的iPhone、Wi-Fi网络或是蜂窝移动网络。当您的手表连接到蜂窝移动网络时,它会使用LTE网络。不能使用LTE时,如果运营商支持UMTS,您的手表会尝试连接到UMTS。

 

Apple Watch怎么设置蜂窝网络

App跟踪透明度是什么意思

就在今天,苹果发布了iOS14.5/iPadOS14.5,正式带来“App跟踪透明度”功能。该功能可让用户选择是否允许App跟踪您在其他公司的App和网站上的活动,以便用于广告投放或与数据代理商共享。

 

在iOS14.5、iPadOS14.5和AppletvOS14.5中,App必须先请求权限,然后才能跟踪您在其他公司的App和网站上的活动。当App收集能够识别您身份或您设备的信息,并且将这类信息与归第三方所有的App、网站和其他位置上收集的同等信息相关联,从而用于定向广告投放或广告效果评估,或者与数据代理商共享这类收集的信息时,即发生了跟踪。

 

如果App要求跟踪您的活动:

 

App跟踪透明度是什么意思 App跟踪透明度是干嘛的

 

当您将设备升级到*新的iOS14.5版本,看到希望跟踪您活动的请求时,您可以轻点“允许”或“要求App不跟踪”。无论您是否允许App跟踪您的活动,都仍然可以使用对应App的全部功能。

 

App开发者可以自定所示信息的部分内容,向您说明App为什么要求跟踪您的活动。您还可以在AppStore上访问对应App的产品页面,以详细了解App开发者如何使用您的数据。

 

App跟踪透明度是什么意思 App跟踪透明度是干嘛的

 

如果您选取“要求App不跟踪”,对应的App开发者便无法访问系统广告标识符(IDFA),这个标识符通常用于跟踪。此外,对应的App也不能使用能识别您身份或您设备的其他信息(例如您的电子邮件地址)来跟踪您的活动。

 

管理活动跟踪权限:

 

您可以随时改变主意,为App授予或撤销活动跟踪权限:

 

1.前往“隐私”设置,查看已请求跟踪您活动的App列表。在iPhone、iPad或iPodtouch上,请前往“设置”-“隐私”-“跟踪”。

 

2.轻点来为特定App关闭或打开跟踪权限。

 

App跟踪透明度是什么意思 App跟踪透明度是干嘛的

 

如果您在隐私设置中关闭“允许App请求跟踪”,您将不再收到App希望跟踪您活动的提示。在关闭这项设置后,每当有App请求跟踪权限时,系统都会默认按照您轻点“要求App不跟踪”来处理。您还可以选择要求之前您允许的所有App停止跟踪您的活动。您也可以选择仅允许之前授予权限的App继续跟踪您的活动。