分类: IOS技术

IOS技术

java 服务端验证苹果支付applepay账单

支付流程
前端支付完,付款成功
苹果会返回一个receipt-data,大概长这个样子{“receipt-data” : “MIIaYAYJKoZIhvcNAQcC……”}
将这个值返回给自己服务器,服务器开始验证账单
开始撸服务端代码 (部分代码来自网络)
大致原理也就是拿着receipt-data请求苹果服务器,苹果会返回给我们详细的账单信息,根据该信息判断账单是否正确
沙箱环境:https://sandbox.itunes.apple.com/verifyReceipt
正式环境:https://buy.itunes.apple.com/verifyReceipt
请求参数:receipt-data
请求方法:POST
使用HttpsURLConnection(推荐使用)

`
public static JSONObject verify(String url, String receipt) {
try {
HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
connection.setRequestMethod(“POST”);
connection.setDoOutput(true);
connection.setAllowUserInteraction(false);
PrintStream ps = new PrintStream(connection.getOutputStream());
ps.print(“{\”receipt-data\”: \”” + receipt + “\”}”);
ps.close();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String str;
StringBuffer sb = new StringBuffer();
while ((str = br.readLine()) != null) {
sb.append(str);
}
br.close();
String resultStr = sb.toString();
JSONObject result = JSONObject.parseObject(resultStr);
if (result != null && result.getInteger(“status”) == 21007) { //递归,以防漏单
return verify(“https://sandbox.itunes.apple.com/verifyReceipt”, receipt);
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

使用HttpClient

`
public static JSONObject verify(String url, String receipt) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
try {
JSONObject data = new JSONObject();
data.put(“receipt-data”, receipt);
StringEntity entity = new StringEntity(data.toJSONString());
entity.setContentEncoding(“utf-8”);
entity.setContentType(“application/json”);
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
String resultStr = EntityUtils.toString(httpEntity);
JSONObject result = JSONObject.parseObject(resultStr);
httpPost.releaseConnection();
if (result.getInteger(“status”) == 21007) {
return verify(“https://sandbox.itunes.apple.com/verifyReceipt”, receipt);
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

返回值
`
{
“status”: 0,
“environment”: “Sandbox”,
“receipt”: {
“receipt_type”: “ProductionSandbox”,
“adam_id”: 0,
“app_item_id”: 0,
“bundle_id”: “com.platomix.MicroBusinessManage”,
“application_version”: “2.0.0”,
“download_id”: 0,
“version_external_identifier”: 0,
“receipt_creation_date”: “2017-06-06 06:35:27 Etc/GMT”,
“receipt_creation_date_ms”: “1496730927000”,
“receipt_creation_date_pst”: “2017-06-05 23:35:27 America/Los_Angeles”,
“request_date”: “2017-06-06 07:13:26 Etc/GMT”,
“request_date_ms”: “1496733206549”,
“request_date_pst”: “2017-06-06 00:13:26 America/Los_Angeles”,
“original_purchase_date”: “2013-08-01 07:00:00 Etc/GMT”,
“original_purchase_date_ms”: “1375340400000”,
“original_purchase_date_pst”: “2013-08-01 00:00:00 America/Los_Angeles”,
“original_application_version”: “1.0”,
“in_app”: []
}
}

后台通过判断返回的JSON传中status的值来判断支付成功

status状态:

0 支付成功
21000 App Store不能读取你提供的JSON对象
21002 receipt-data域的数据有问题
21003 receipt无法通过验证
21004 提供的shared secret不匹配你账号中的shared secret
21005 receipt服务器当前不可用
21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务

java苹果支付

苹果支付
苹果支付
前端从苹果拿到的数据大概是这样的
后台生成订单
回调
工具类
苹果支付
注:苹果支付和微信支付、支付宝支付流程不同,微信支付、支付宝支付需调用各自统一下单接口,再将得到的参数值返回给前端。苹果支付只是在后台生成订单(订单信息需包含订单编号,金额等),将订单返回给IOS客户端,客户端直接支付,再由客户端调后台接口处理支付完的业务逻辑,并不是由苹果公司来回调

前端从苹果拿到的数据大概是这样的

1 {
2     “status”: 0,
3     “environment”: “Production”,
4     “receipt”: {
5         “receipt_type”: “Production”,
6         “adam_id”: 2341443613,
7         “app_item_id”: 2234443613,
8         “bundle_id”: “com.xxxxx.xxxxx”,
9         “application_version”: “1”,
10         “download_id”: 23456572706673,
11         “version_external_ident ifier”: 821223402,
12         “receipt_creation_date”: “2017-01-25 00:52:37 Etc/GMT”,
13         “receipt_creation_date_ms”: “3333897657000”,
14         “receipt_creation_date_pst”: “2017-01-25 17:57:37 America/Los_Angeles”,
15         “request_date”: “2017-01-26 00:57:38 Etc/GMT”,
16         “request_date_ms”: “1445897657000”,
17         “request_date_pst”: “2017-05-29 17:57:38 America/Los_Angeles”,
18         “original_purchase_date”: “2016-01-25 15:37:18 Etc/GMT”,
19         “original_purchase_ date_ms”: “145234568000”,
20         “original_purchase_date_pst”: “2016-01-25 07:37:18 America/Los_Angeles”,
21         “original_application_version”: “12”,
22         “in_app”: [
23              {
24                  “quantity”: “1”,
25                  “product_id”: “xxxxxxxxx”,
26                  “transaction_id”: “110000290198443”,
27                  “original_transaction_id”: “110000290198443”,
28                  “purchase_date”: “2017-01-26 00:23:36 Etc/GMT”,
29                  “purchase_date_ms”: “1496105856000”,
30                  “purchase_date_pst”: “2017-01-26 00:35:30 America/Los_Angeles”,
31                  “original_purchase_date”: “2017-01-26 00:57:36 Etc/GMT”,
32                  “original_purchase_date_ms”: “14347896000”,
33                  “original_purchase_date_pst”: “2017-01-25 17:57:36 America/Los_Angeles”,
34                  “is_trial_period”: “false”
35              }
36          ]
37      }
38 }

后台生成订单

此处不贴代码,每个人的订单不一样

回调

/**
* 苹果支付回调(APP调用,不是苹果官方回调)
* @param transactionId
* @param payload
* @return
* @throws Exception
*/
@RequestMapping(value=”/applepay/order/notifyCallBack”)
@ResponseBody
public AppResponse<Object> applepayOrderNotifyCallBack(String transactionId, String payload) {
AppResponse<Object> appResponse = new AppResponse<>();
Map<String, Object> map = new HashMap<>();
logger.info(“苹果支付客户端传过来的值1:” + transactionId + “,客户端传过来的值2:” + payload);
try {
String verifyResult = IosVerifyUtil.buyAppVerify(payload, 1); //1.先线上测试 发送平台验证
if (verifyResult == null) { // 苹果服务器没有返回验证结果
logger.info(“无订单信息!”);

map.put(“result”, 2);
map.put(“message”, “无订单信息”);
appResponse.setData(map);
appResponse.setMsg(“无订单信息”);
appResponse.setStatus(AppResponseCode.SUCCESS);
} else { // 苹果验证有返回结果
logger.info(“线上,苹果平台返回JSON:” + verifyResult);
JSONObject job = JSONObject.parseObject(verifyResult);
String states = job.getString(“status”);

//0 正常
//21000 App Store不能读取你提供的JSON对象
//21002 receipt-data域的数据有问题
//21003 receipt无法通过验证
//21004 提供的shared secret不匹配你账号中的shared secret
//21005 receipt服务器当前不可用
//21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
//21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
//21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务
if(“21007”.equals(states)){ //是沙盒环境,应沙盒测试,否则执行下面
verifyResult = IosVerifyUtil.buyAppVerify(payload, 0); //2.再沙盒测试 发送平台验证
logger.info(“沙盒环境,苹果平台返回JSON:” + verifyResult);
job = JSONObject.parseObject(verifyResult);
states = job.getString(“status”);
}

logger.info(“苹果平台返回值:job” + job);
if (states.equals(“0”)){ // 前端所提供的收据是有效的 验证成功
String r_receipt = job.getString(“receipt”);
JSONObject returnJson = JSONObject.parseObject(r_receipt);
String in_app = returnJson.getString(“in_app”);
JSONObject in_appJson = JSONObject.parseObject(in_app.substring(1, in_app.length() – 1));

String product_id = in_appJson.getString(“product_id”);
String transaction_id = in_appJson.getString(“transaction_id”); // 订单号

/************************************************+自己的业务逻辑开始+**********************************************************/
//如果单号一致 则开始处理逻辑
if(transactionId.equals(transaction_id)){
String[] moneys = product_id.split(“\\.”);//实际支付金额
//此处开始业务逻辑
}
/************************************************+自己的业务逻辑结束+**********************************************************/

map.put(“result”, 1);
map.put(“message”, “操作成功!”);
} else {
map.put(“message”, “receipt数据有问题”);
map.put(“result”, 0);
}
appResponse.setData(map);
appResponse.setStatus(AppResponseCode.SUCCESS);
}
} catch (Exception e) {}
return appResponse;
}

工具类

package com.fengdi.lianmeng.util;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Locale;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class IosVerifyUtil {

private static class TrustAnyTrustManager implements X509TrustManager {

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}

private static class TrustAnyHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}

private static final String url_sandbox = “https://sandbox.itunes.apple.com/verifyReceipt”;
private static final String url_verify = “https://buy.itunes.apple.com/verifyReceipt”;

/**
* 苹果服务器验证
*
* @param receipt
* 账单
* @url 要验证的地址
* @return null 或返回结果 沙盒 https://sandbox.itunes.apple.com/verifyReceipt
*
*/
public static String buyAppVerify(String receipt, int type) {
//环境判断 线上/开发环境用不同的请求链接
String url = “”;
if (type == 0) {
url = url_sandbox; //沙盒测试
} else {
url = url_verify; //线上测试
}
//String url = EnvUtils.isOnline() ?url_verify : url_sandbox;

try {
SSLContext sc = SSLContext.getInstance(“SSL”);
sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());
URL console = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
conn.setSSLSocketFactory(sc.getSocketFactory());
conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“content-type”, “text/json”);
conn.setRequestProperty(“Proxy-Connection”, “Keep-Alive”);
conn.setDoInput(true);
conn.setDoOutput(true);
BufferedOutputStream hurlBufOus = new BufferedOutputStream(conn.getOutputStream());

String str = String.format(Locale.CHINA, “{\”receipt-data\”:\”” + receipt + “\”}”);//拼成固定的格式传给平台
hurlBufOus.write(str.getBytes());
hurlBufOus.flush();

InputStream is = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = reader.readLine()) != null) {
sb.append(line);
}

return sb.toString();
} catch (Exception ex) {
System.out.println(“苹果服务器异常”);
ex.printStackTrace();
}
return null;
}

/**
* 用BASE64加密
* @param str
* @return
*/
public static String getBASE64(String str) {
byte[] b = str.getBytes();
String s = null;
if (b != null) {
s = new sun.misc.BASE64Encoder().encode(b);
}
return s;

iOS开发:城市选择器集成

一、简介
该项目集成了三种类型的城市选择器:

1、XXCityPickerView 省市区,可以分级:1省 2省-市 3省-市-区
2、SQSelectAddress 省市区乡/镇,页面跳转
3、RattanCityPicker 省市区,包含邮编地址,开放多个属性设置的接口
二、XXCityPickerView使用
1、从该项目导入【XXCityPickerView】文件包
2、 导入系统库 :libsqlite3.tbd
3、方法实现

1 #import “XXCityPickerView.h”
2
3 @interface ViewController ()<XXCityPickerViewDelegate>
4
5 @property(nonatomic,strong)XXCityPickerView *cityPicker;
6
7 @end
8
9 @implementation ViewController
10
11 – (void)viewDidLoad {
12     [super viewDidLoad];
13 }
14
15 ///方法调用
16 -(void)clickAction{
17     [self cityPicker];
18 }
19
20 – (XXCityPickerView *)cityPicker{
21     if (_cityPicker == nil){
22         // 初始化  设置类别   1省  2省-市  3省-市-区
23         _cityPicker = [[XXCityPickerView alloc]initWithComponents:3];
24         // 设置代理
25         _cityPicker.delegate = self;
26         [self.view addSubview:_cityPicker];
27     }
28     return  _cityPicker;
29 }

4、代理实现

1 // —- 【XXCityPickerViewDelegate】
2 // 取消
3 – (void)XXCityPickerViewLeftAction{
4     [self removeCityPickerView];
5 }
6 // 完成
7 – (void)XXCityPickerViewRightAction:(XXCityPickerView *)picker andCity:(NSString *)city andData:(NSMutableDictionary *)dic{
8     [self removeCityPickerView];
9     NSLog(@”������XXCityPickerView:\n city= %@   dic= %@”,city,dic);
10 }
11
12 -(void)removeCityPickerView{
13     if (_cityPicker) {
14         [_cityPicker removeFromSuperview];
15         _cityPicker = nil;
16     }
17 }

 

三、SQSelectAddress使用
1、导入【SQSelectAddress】文件包
2、调用【SQSelectAddressViewController.h】类
3、协议声明
@interface ViewController ()<SQSelectAddressViewControllerDelegate>
1
4、方法实现
pragma mark –
#pragma mark – SQSelectAddress
///页面添加
-(void)sqSelectAddressPockerView{
SQSelectAddressViewController *selectAddressVC = [[SQSelectAddressViewController alloc] init];
//签署协议
selectAddressVC.delegate = self;
selectAddressVC.animating = NO;
selectAddressVC.footerBg_color = [UIColor greenColor];
selectAddressVC.headerBg_color = [UIColor greenColor];
selectAddressVC.title_font = [UIFont systemFontOfSize:25];
selectAddressVC.titleText_color = [UIColor orangeColor];
[self presentViewController:selectAddressVC animated:YES completion:nil];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5、代理协议实现
– (void)selectAddressViewController:(SQSelectAddressViewController *)selectController selectedDetailAdreess:(NSString *)address townCode:(NSString *)townCode{
NSLog(@”����SQSelectAddress:\n地址=%@ 编码=%@”,address,townCode);
}
1
2
3
四、RattanCityPicker使用
1、导入[RattanCityPicker]文件包
2、方法实现
#import “RattanCityPicker.h”

#pragma mark –
#pragma mark – RattanCityPicker

-(void)rattanCity{
RattanCityPicker *picker=[[RattanCityPicker alloc] init];
picker.animation_dur = 0.3;
picker.toolViewBg_color =[UIColor greenColor];
picker.componentFir_font = [UIFont systemFontOfSize:16];
picker.componentStrFir_color = [UIColor redColor];;
picker.componentBgFir_color = [UIColor lightGrayColor];
picker.selectLblStr_font = [UIFont systemFontOfSize:20];
picker.selectLblStr_color = [UIColor redColor];
//点击确定按钮代码块调用
picker.sureBtnBlock = ^(){

};
//获取选择的城市的信息
[picker cityPikerGetSelectCity:^(NSMutableDictionary *dicSelectCity) {
[self setTextLbl:dicSelectCity];
NSLog(@”����RattanCityPicker:\n%@”,dicSelectCity);
}];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2

iOS选择器组件

1. 框架介绍

BRPickerView 封装的是iOS中常用的选择器组件。高度封装,只需一句代码即可完成调用,使用比较灵活支持自定义主题颜色。选择器类型主要包括:日期选择器、时间选择器、地址选择器、自定义字符串选择器。

框架地址:github.com/91renb/BRPi…

特别提示】:

  • 当前*新版本为: 2.2.1 。
  • 如果不能找到*新版本,请先执行一下 pod setup ,待更新完成后;再执行 pod search BRPickerView 进行搜索,就会看到*新版本。

2. 效果演示

查看并运行 BRPickerViewDemo.xcodeproj

框架Demo运行效果图1 框架Demo运行效果图2

3. 更新记录

  • 2018-04-27(V2.2.1):
    • 修复bug,适配iPad和横屏显示。
    • 优化代码,提高框架适应性,降低内存消耗。
  • 2018-04-03(V2.2.0):
    • 时间选择器新添加了7种显示类型(BRDatePickerMode),可根据自己项目的需求选择性使用。
    • 适配横屏,及 iPhoneX 底部安全区域。
    • 修改了*小时间和*大时间的参数名称(以前版本是传 NSString 类型, 现在传 NSDate 类型)
    • 修复比较时间大小时出现的bug。
  • 2018-03-19(V2.1.3):
    • 修改地址选择器确认选择后的回调参数。
    • 现修改如下:可通过省市区的模型获取省市区的 name(名称)、code(id)、index(索引)resultBlock:^(BRProvinceModel *province, BRCityModel *city, BRAreaModel *area) {}
    • 去掉第三方依赖库 MJExtension ,修改为手动解析地址数据源。
  • 2018-03-11(V2.1.2):
    • 重命名了Github用户名,更新项目相关的路径。(提示:pod之前的版本不受影响)
  • 2018-02-28(V2.1.1)
    • 修复某些情况下无法用bundle加载本地数据源(BRCity.plist)bug。
  • 2018-01-26(V2.1.0):
    • 给地址选择器添加了一个方法(见方法4),提供数据源参数,支持外部传入地区数据源。
    • 提示:要注意数据源格式,参考 BRCity.json。可以把 BRCity.json 文件的内容放到后台去维护,通过后台接口获取地区数据源(即 BRCity.json 文件的内容)。
  • 2018-01-25(V2.0.0)
    • 更新了地址数据源(BRCity.plist),地区信息是2018年*新*全的,与微信的地区信息完全一致。
    • 支持自定义默认选择地址(格式:@[@”浙江省”, @”杭州市”, @”西湖区”]),支持下次点击进入地址选择器时,默认地址为上次选择的结果。
    • 修改了日期选择器、地址选择器、字符串选择器的接口方法(删除了之前的方法2)。
    • 添加了地址选择器显示类型,支持3种显示:只显示省份、显示省份和城市、显示省市区。
  • 2018-01-05(V1.3.0):
    • 添加取消选择的回调方法(点击背景或取消按钮会执行 cancelBlock )
    • 合并了字符串选择器 数组数据源和plist数据源对应的方法,dataSource 参数支持两种类型:

      1> 可以直接传数组:NSArray类型;

      2> 可以传plist文件名:NSString类型,带后缀名,plist文件的内容必须是数组格式。

  • 2018-01-02(V1.2.0)
    • 添加支持自定义主题颜色的方法。
  • 2017-11-26(V1.1.0)
    • 更换第三方依赖库。

      用MJExtension 替换了 原来的YYModel,以前没有注意导入YYModel,同时又导入YYKit会导致重复导入而冲突(另外使用YYModel时,手动导入和pod导入 其中的头文件和方法名也不一样,所以很容易出错)。

  • 2017-11-16(V1.0.0)
    • 初始版本!

4. 安装

4.1. CocoaPods

  1. 在 Podfile 中添加 pod 'BRPickerView'
  2. 执行 pod install 或 pod update 。
  3. 导入头文件 #import <BRPickerView.h>

4.2. 手动导入

  1. 将与 README.md 同级目录下的 BRPickerView 文件夹拽入项目中
  2. 导入头文件 #import "BRPickerView.h"

5. 系统要求

  • iOS 8.0+
  • ARC

6. 使用

6.1. 时间选择器:BRDatePickerView

​ 查看 BRDatePickerView.h 头文件,里面提供了3个方法,可根据自己的需求选择其中的一个方法进行使用。

  1. /**
  2. * 1.显示时间选择器
  3. *
  4. * @param title 标题
  5. * @param dateType 日期显示类型
  6. * @param defaultSelValue 默认选中的时间(值为空/值格式错误时,默认就选中现在的时间)
  7. * @param resultBlock 选择结果的回调
  8. *
  9. */
  10. + (void)showDatePickerWithTitle:(NSString *)title
  11. dateType:(BRDatePickerMode)dateType
  12. defaultSelValue:(NSString *)defaultSelValue
  13. resultBlock:(BRDateResultBlock)resultBlock;
  14. /**
  15. * 2.显示时间选择器(支持 设置自动选择 和 自定义主题颜色)
  16. *
  17. * @param title 标题
  18. * @param dateType 日期显示类型
  19. * @param defaultSelValue 默认选中的时间(值为空/值格式错误时,默认就选中现在的时间)
  20. * @param minDate *小时间,可为空(请使用 NSDate+BRPickerView 分类中和显示类型格式对应的方法创建 minDate)
  21. * @param maxDate *大时间,可为空(请使用 NSDate+BRPickerView 分类中和显示类型格式对应的方法创建 maxDate)
  22. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  23. * @param themeColor 自定义主题颜色
  24. * @param resultBlock 选择结果的回调
  25. *
  26. */
  27. + (void)showDatePickerWithTitle:(NSString *)title
  28. dateType:(BRDatePickerMode)dateType
  29. defaultSelValue:(NSString *)defaultSelValue
  30. minDate:(NSDate *)minDate
  31. maxDate:(NSDate *)maxDate
  32. isAutoSelect:(BOOL)isAutoSelect
  33. themeColor:(UIColor *)themeColor
  34. resultBlock:(BRDateResultBlock)resultBlock;
  35. /**
  36. * 3.显示时间选择器(支持 设置自动选择、自定义主题颜色、取消选择的回调)
  37. *
  38. * @param title 标题
  39. * @param dateType 日期显示类型
  40. * @param defaultSelValue 默认选中的时间(值为空/值格式错误时,默认就选中现在的时间)
  41. * @param minDate *小时间,可为空(请使用 NSDate+BRPickerView 分类中和显示类型格式对应的方法创建 minDate)
  42. * @param maxDate *大时间,可为空(请使用 NSDate+BRPickerView 分类中和显示类型格式对应的方法创建 maxDate)
  43. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  44. * @param themeColor 自定义主题颜色
  45. * @param resultBlock 选择结果的回调
  46. * @param cancelBlock 取消选择的回调
  47. *
  48. */
  49. + (void)showDatePickerWithTitle:(NSString *)title
  50. dateType:(BRDatePickerMode)dateType
  51. defaultSelValue:(NSString *)defaultSelValue
  52. minDate:(NSDate *)minDate
  53. maxDate:(NSDate *)maxDate
  54. isAutoSelect:(BOOL)isAutoSelect
  55. themeColor:(UIColor *)themeColor
  56. resultBlock:(BRDateResultBlock)resultBlock
  57. cancelBlock:(BRDateCancelBlock)cancelBlock;
  58. 复制代码
  • 使用示例(参考Demo):
  1. NSDate *minDate = [NSDate br_setYear:1990 month:3 day:12];
  2. NSDate *maxDate = [NSDate date];
  3. [BRDatePickerView showDatePickerWithTitle:@“出生日期” dateType:BRDatePickerModeYMD defaultSelValue:weakSelf.birthdayTF.text minDate:minDate maxDate:maxDate isAutoSelect:YES themeColor:nil resultBlock:^(NSString *selectValue) {
  4. weakSelf.birthdayTF.text = selectValue;
  5. } cancelBlock:^{
  6. NSLog(@“点击了背景或取消按钮”);
  7. }];
  8. 复制代码
  • 时间选择器的显示类型:
  1. /// 弹出日期类型
  2. typedef NS_ENUM(NSInteger, BRDatePickerMode) {
  3. // — 以下4种是系统自带的样式 —
  4. // UIDatePickerModeTime
  5. BRDatePickerModeTime, // HH:mm
  6. // UIDatePickerModeDate
  7. BRDatePickerModeDate, // yyyy-MM-dd
  8. // UIDatePickerModeDateAndTime
  9. BRDatePickerModeDateAndTime, // yyyy-MM-dd HH:mm
  10. // UIDatePickerModeCountDownTimer
  11. BRDatePickerModeCountDownTimer, // HH:mm
  12. // — 以下7种是自定义样式 —
  13. // 年月日时分
  14. BRDatePickerModeYMDHM, // yyyy-MM-dd HH:mm
  15. // 月日时分
  16. BRDatePickerModeMDHM, // MM-dd HH:mm
  17. // 年月日
  18. BRDatePickerModeYMD, // yyyy-MM-dd
  19. // 年月
  20. BRDatePickerModeYM, // yyyy-MM
  21. // 年
  22. BRDatePickerModeY, // yyyy
  23. // 月日
  24. BRDatePickerModeMD, // MM-dd
  25. // 时分
  26. BRDatePickerModeHM // HH:mm
  27. };
  28. 复制代码
  • 时间选择器显示类型的效果图:

以下4种样式是使用 UIDatePicker 类 进行封装的,支持循环滚动

样式1:BRDatePickerModeTime 样式2:BRDatePickerModeDate
样式3:BRDatePickerModeDateAndTime 样式4:BRDatePickerModeCountDownTimer

以下7种样式是使用 UIPickerView 类 进行封装的。

样式5: BRDatePickerModeYMDHM 样式6: BRDatePickerModeMDHM
样式7: BRDatePickerModeYMD 样式8: BRDatePickerModeYM
样式9: BRDatePickerModeY 样式10: BRDatePickerModeMD
样式11: BRDatePickerModeHM

6.2. 地址选择器:BRAddressPickerView

​ 查看 BRAddressPickerView.h 头文件,里面提供了4个方法,可根据自己的需求选择其中的一个方法进行使用。

  1. /**
  2. * 1.显示地址选择器
  3. *
  4. * @param defaultSelectedArr 默认选中的值(传数组,如:@[@”浙江省”, @”杭州市”, @”西湖区”])
  5. * @param resultBlock 选择后的回调
  6. *
  7. */
  8. + (void)showAddressPickerWithDefaultSelected:(NSArray *)defaultSelectedArr
  9. resultBlock:(BRAddressResultBlock)resultBlock;
  10. /**
  11. * 2.显示地址选择器(支持 设置自动选择 和 自定义主题颜色)
  12. *
  13. * @param defaultSelectedArr 默认选中的值(传数组,如:@[@”浙江省”, @”杭州市”, @”西湖区”])
  14. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  15. * @param themeColor 自定义主题颜色
  16. * @param resultBlock 选择后的回调
  17. *
  18. */
  19. + (void)showAddressPickerWithDefaultSelected:(NSArray *)defaultSelectedArr
  20. isAutoSelect:(BOOL)isAutoSelect
  21. themeColor:(UIColor *)themeColor
  22. resultBlock:(BRAddressResultBlock)resultBlock;
  23. /**
  24. * 3.显示地址选择器(支持 设置选择器类型、设置自动选择、自定义主题颜色、取消选择的回调)
  25. *
  26. * @param showType 地址选择器显示类型
  27. * @param defaultSelectedArr 默认选中的值(传数组,如:@[@”浙江省”, @”杭州市”, @”西湖区”])
  28. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  29. * @param themeColor 自定义主题颜色
  30. * @param resultBlock 选择后的回调
  31. * @param cancelBlock 取消选择的回调
  32. *
  33. */
  34. + (void)showAddressPickerWithShowType:(BRAddressPickerMode)showType
  35. defaultSelected:(NSArray *)defaultSelectedArr
  36. isAutoSelect:(BOOL)isAutoSelect
  37. themeColor:(UIColor *)themeColor
  38. resultBlock:(BRAddressResultBlock)resultBlock
  39. cancelBlock:(BRAddressCancelBlock)cancelBlock;
  40. /**
  41. * 4.显示地址选择器(支持 设置选择器类型、传入地区数据源、设置自动选择、自定义主题颜色、取消选择的回调)
  42. *
  43. * @param showType 地址选择器显示类型
  44. * @param dataSource 地区数据源
  45. * @param defaultSelectedArr 默认选中的值(传数组,如:@[@”浙江省”, @”杭州市”, @”西湖区”])
  46. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  47. * @param themeColor 自定义主题颜色
  48. * @param resultBlock 选择后的回调
  49. * @param cancelBlock 取消选择的回调
  50. *
  51. */
  52. + (void)showAddressPickerWithShowType:(BRAddressPickerMode)showType
  53. dataSource:(NSArray *)dataSource
  54. defaultSelected:(NSArray *)defaultSelectedArr
  55. isAutoSelect:(BOOL)isAutoSelect
  56. themeColor:(UIColor *)themeColor
  57. resultBlock:(BRAddressResultBlock)resultBlock
  58. cancelBlock:(BRAddressCancelBlock)cancelBlock;
  59. 复制代码
  • 使用示例(参考Demo):
  1. // 【转换】:以@” “子字符串为基准将字符串分离成数组,如:@”浙江省 杭州市 西湖区” ——》@[@”浙江省”, @”杭州市”, @”西湖区”]
  2. NSArray *defaultSelArr = [weakSelf.addressTF.text componentsSeparatedByString:@” “];
  3. [BRAddressPickerView showAddressPickerWithShowType:BRAddressPickerModeArea defaultSelected:defaultSelArr isAutoSelect:YES themeColor:nil resultBlock:^(BRProvinceModel *province, BRCityModel *city, BRAreaModel *area) {
  4. weakSelf.addressTF.text = [NSString stringWithFormat:@“%@ %@ %@”, province.name, city.name, area.name];
  5. } cancelBlock:^{
  6. NSLog(@“点击了背景视图或取消按钮”);
  7. }];
  8. 复制代码
  • 地址选择器的3种显示类型(showType 的3个枚举值):
样式1:BRAddressPickerModeProvince 样式2:BRAddressPickerModeCity
样式3:BRAddressPickerModeArea

6.3. 自定义字符串选择器:BRStringPickerView

​ 查看 BRStringPickerView.h 头文件,里面提供了3个方法,可根据自己的需求选择其中的一个方法进行使用。

  1. /**
  2. * 1.显示自定义字符串选择器
  3. *
  4. * @param title 标题
  5. * @param dataSource 数据源(1.直接传数组:NSArray类型;2.可以传plist文件名:NSString类型,带后缀名,plist文件内容要是数组格式)
  6. * @param defaultSelValue 默认选中的行(单列传字符串,多列传一维数组)
  7. * @param resultBlock 选择后的回调
  8. *
  9. */
  10. + (void)showStringPickerWithTitle:(NSString *)title
  11. dataSource:(id)dataSource
  12. defaultSelValue:(id)defaultSelValue
  13. resultBlock:(BRStringResultBlock)resultBlock;
  14. /**
  15. * 2.显示自定义字符串选择器(支持 设置自动选择 和 自定义主题颜色)
  16. *
  17. * @param title 标题
  18. * @param dataSource 数据源(1.直接传数组:NSArray类型;2.可以传plist文件名:NSString类型,带后缀名,plist文件内容要是数组格式)
  19. * @param defaultSelValue 默认选中的行(单列传字符串,多列传一维数组)
  20. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  21. * @param themeColor 自定义主题颜色
  22. * @param resultBlock 选择后的回调
  23. *
  24. */
  25. + (void)showStringPickerWithTitle:(NSString *)title
  26. dataSource:(id)dataSource
  27. defaultSelValue:(id)defaultSelValue
  28. isAutoSelect:(BOOL)isAutoSelect
  29. themeColor:(UIColor *)themeColor
  30. resultBlock:(BRStringResultBlock)resultBlock;
  31. /**
  32. * 3.显示自定义字符串选择器(支持 设置自动选择、自定义主题颜色、取消选择的回调)
  33. *
  34. * @param title 标题
  35. * @param dataSource 数据源(1.直接传数组:NSArray类型;2.可以传plist文件名:NSString类型,带后缀名,plist文件内容要是数组格式)
  36. * @param defaultSelValue 默认选中的行(单列传字符串,多列传一维数组)
  37. * @param isAutoSelect 是否自动选择,即选择完(滚动完)执行结果回调,传选择的结果值
  38. * @param themeColor 自定义主题颜色
  39. * @param resultBlock 选择后的回调
  40. * @param cancelBlock 取消选择的回调
  41. *
  42. */
  43. + (void)showStringPickerWithTitle:(NSString *)title
  44. dataSource:(id)dataSource
  45. defaultSelValue:(id)defaultSelValue
  46. isAutoSelect:(BOOL)isAutoSelect
  47. themeColor:(UIColor *)themeColor
  48. resultBlock:(BRStringResultBlock)resultBlock
  49. cancelBlock:(BRStringCancelBlock)cancelBlock;
  50. 复制代码
  • 使用示例(参考Demo):
  1. // 自定义单列字符串
  2. //NSArray *dataSource = @[@”大专以下”, @”大专”, @”本科”, @”硕士”, @”博士”, @”博士后”];
  3. NSString *dataSource = @“testData1.plist”; // 可以将数据源(上面的数组)放到plist文件中
  4. [BRStringPickerView showStringPickerWithTitle:@“学历” dataSource:dataSource defaultSelValue:weakSelf.educationTF.text isAutoSelect:YES themeColor:nil resultBlock:^(id selectValue) {
  5. weakSelf.educationTF.text = selectValue;
  6. } cancelBlock:^{
  7. NSLog(@“点击了背景视图或取消按钮”);
  8. }];
  9. // 自定义多列字符串
  10. NSArray *dataSource = @[@[@“第1周”, @“第2周”, @“第3周”, @“第4周”, @“第5周”, @“第6周”, @“第7周”], @[@“第1天”, @“第2天”, @“第3天”, @“第4天”, @“第5天”, @“第6天”, @“第7天”]];
  11. //NSString *dataSource = @”testData3.plist”; // 可以将数据源(上面的数组)放到plist文件中
  12. NSArray *defaultSelArr = [weakSelf.otherTF.text componentsSeparatedByString:@“,”];
  13. [BRStringPickerView showStringPickerWithTitle:@“自定义多列字符串” dataSource:dataSource defaultSelValue:defaultSelArr isAutoSelect:YES themeColor:RGB_HEX(0xff7998, 1.0f) resultBlock:^(id selectValue) {
  14. weakSelf.otherTF.text = [NSString stringWithFormat:@“%@,%@”, selectValue[0], selectValue[1]];
  15. } cancelBlock:^{
  16. NSLog(@“点击了背景视图或取消按钮”);
  17. }];
  18. 复制代码
  • 字符串选择器效果图:
单列字符串选择器(默认主题色样式) 双列字符串选择器(自定义主题色样式)
3列字符串选择器(自定义主题色样式) 4列字符串选择器(自定义主题色样式)

7. 许可证

BRPickerView 使用 MIT 许可证,详情见 LICENSE 文件。

iOS 自带的邮件客户端经常无缘无故出现红点

在收件箱里面全部已读弄了好几次都消除不了

10 条回复    2021-04-07 20:42:48 +08:00
SandyLee
    1

SandyLee   4 天前 via Android

换成 spark 可以解决
Hack3rHan
    2

Hack3rHan   4 天前   ❤️ 1

你用了 QQ 邮箱吧,QQ 邮箱里面来自腾讯的部分系统邮件,会收到通知但显示不了,比如超级会员续费通知等。
freeair
    3

freeair   4 天前

@Hack3rHan #2 竟然有这么奇葩的事情?
madmen
    4

madmen   4 天前

换来换去,*后还是换回了自带的。。。
qiaga
    5

qiaga   3 天前

@madmen #4 iOS 自带邮箱蜜汁推送
movq
    6

movq   3 天前 via iPhone

自带邮箱的推送在 apple watch 上的通知不会振动怎么办
derek80
    7

derek80   3 天前 via iPhone

收 outlook 的邮件偶尔也会这样。
Dvel
    8

Dvel   3 天前

2 楼说的 QQ 邮箱的问题在 spark 里也有。
Mail010
    9

Mail010   3 天前 via iPhone

好奇 ios 端的几个邮件应用是不是都这样…
实测 outlook 经常有推送提醒但无红点,然后已读或者删除之后才出现红点,用 qq 邮箱偶尔也有这种情况。没开后台刷新。
tomari
    10

tomari   2 天前

如果用的是 outlook,有时候还会出现一个邮件发两次的问题(只是发件箱里有 2 个,但是实际发了一个)
换了 spark 之后好用很多

win10 电脑连接 airpods 断联!

系统是 win10 ltbs 。为了方便 自己买了一个黑苹果免驱的 博通的蓝牙 4.0 芯片。但是 win10,下总是断联。听一会就没有声音了 需要手动选择别的音频源 然后在选择耳机 才可以 我现在有点怀疑自己我是不是系统版本出问题了 有人遇到这样的情况吗? airpods 和 airpods pro 都是一样

11 条回复    2021-03-29 11:06:47 +08:00
darkingtime
    1

darkingtime   16 天前

1903 连 airpods pro 没有问题,不是黑苹果
inertia
    2

inertia   16 天前

把 airpods 完全重置一下看看,之前也有类似的问题,重置之后就好了。
iyg429
    3

iyg429   16 天前 via iPhone

@inertia 完全重置的重新连接一次的意思吗?
ronnie9211
    4

ronnie9211   16 天前

@iyg429 https://support.apple.com/zh-cn/HT209463
lizytalk
    5

lizytalk   15 天前

我也是这样,没救的,重置 airpods 之后也还是这样
iyg429
    6

iyg429   15 天前

@lizytalk #5 你现在怎么处理的?
iyg429
    7

iyg429   15 天前

@iyg429 #6 我准备把我的系统升级一下 升级到*新版 我看到别人的系统 *新版 连 airpods 的电量都可以看的到
luhe
    8

luhe   14 天前

我的 AX201 连 Airpods 还挺稳定来着
lizytalk
    9

lizytalk   14 天前

@iyg429 不用 AirPods,换有线耳机… 不过我是本来就有一个 Sony 的头戴式耳机,只是因为有时候觉得 AirPods 更轻便才想在台式机用 AirPods 。既然用不了就不用了…
zhangkaix
    10

zhangkaix   12 天前

Airpods1,2,pro,这三款耳机我都在我的 Windows 笔记本上连接过,都不稳定,pro 款相对好一点,但也会偶尔断联。
我是在宿舍用的,当时觉得可能宿舍设备太多有干扰,但我放假回家试也是一样会断。
建议楼主有钱就再买个无线耳机专门给 Windows 用,,或者老老实实用有线耳机

zhangkaix
    11

zhangkaix   12 天前

我测试过华为的 Freebuds 3,OPPO 的 w51,红米的 Airdots,SONY 的 WH-1000XM3,WH-900H
当然这些全部都是我各个室友的耳机(狗头)
全部都很稳定
所以建议楼主有钱就再买个专门的无线耳机给 Windows 用,,或者老实用有线耳机
真无线 TWS 推荐三星 Glaxy Buds+ ,我准备买这个,音质续航无敌(纯推荐哈)

求助 iPhone 6 iOS 10.2 已越狱,重置锁屏密码重试次数有救吗?

iPhone 6 Plus,iOS 10.2,已越狱并安装 safestrat, sshd,但是 Wi-Fi 没开,没有受信任的电脑,密码就那些但是不记得是哪个了,再试两次就彻底锁了,想问下还有办法重置锁屏密码重试次数吗( 4 位数字)?

我记得有插件比如 Timepasscode Pro 之类的可以无视锁屏密码重试次数,cyinject 也有代码可以直接绕过 SpringBoard 密码,但是关键是 Wi-Fi 没开,想用 tcprely.py 通过 USB 连接到 iPhone 的 SSH,结果这大爷用充电线插到笔记本上连电都不肯冲,非得让我先解锁。啊啊啊啊啊我是真的没办法了啊,求教大佬们,我的手机还有救吗?(有资料,所以不能 DFU 刷机)

我目前还有的个大方向思路是,有没有什么越狱工具或者是硬件漏洞利用工具,可以修改文件系统的那种,我就可以把 cydia 插件扔到 MobileSubstrate 目录底下就行了,或者有没有什么工具提供了重置密码重试次数的小 tweak ?还记得 iPhone4 的时候有个 java 小工具可以在 DFU 底下直接用 SSH 读 iPhone 的文件系统的,忘记了名字也不知道能不能在 iPhone6 上用(我实在是好几年不玩 iPhone 了,求大佬指条路)

2 条回复    2021-03-29 18:49:13 +08:00
7v9TEc53
    1

7v9TEc53   12 天前

iOS 11.4.1 才有的解锁才能 USB 充电功能,为什么你 10.2 就用上了

建议想办法用 usb 链接 ssh

实在不行线刷保留数据升级到*新 iOS 然后 checkra1n 越狱

Whisper01
    2

Whisper01   11 天前

6 好像有绕过锁屏密码的软件

求教: iOS14 支持读取机械硬盘吗?

我记得 iOS14 是可以读取识别固态硬盘的(比如三星 T5 ),求问同样可以支持机械硬盘吗
*近想买个硬盘,钱包不够无奈选择了 2T 的西数机械硬盘
求问现在 iOS14 可以识别读取机械硬盘了吗,有没有老哥懂得
PS:有 Lighting 转 USB 的 OTG 转接线
17 条回复    2021-03-30 00:19:28 +08:00
bootloaders
    1

bootloaders   12 天前

iPad Pro 可以完美读机械硬盘,没有在 iPhone 上试过。iPadOS 和 iOS 是一个东西,应该 iPhone 上也可以吧。
learningman
    2

learningman   12 天前 via Android

供电可能不够吧,需要买那种独立供电的。
maizero
    3

maizero   12 天前

供电不足,会提示用电太大,带不起来。
一定要用,单独用 usb 给它供电。
另外不建议这样用,太不稳定了,容易挂。
AndyZhuAZ
    4

AndyZhuAZ   12 天前

可以,需要用单独供电的硬盘盒
zhangkaix
    5

zhangkaix   12 天前

@bootloaders 老哥你的机械硬盘是哪个牌子的
zhangkaix
    6

zhangkaix   12 天前

@maizero 我准备拿我室友的同款硬盘测试一波先
heh524866
    7

heh524866   12 天前

*好别用 ios 没有弹出硬盘的选项,热插拔机械硬盘很容易坏,你可以买 M2 固态组个移动硬盘。
zhangkaix
    8

zhangkaix   12 天前

@heh524866 好的老哥,我懂了,我还是老老实实在电脑上用吧,iOS 就不折腾了
现在我手头的相机 SD 卡和 U 盘都可以正常在 iOS 上用,倒数据还是用这俩吧,就不折腾啦
感谢答疑
maizero
    9

maizero   12 天前   ❤️ 1

真的不建议这样用。
机械硬盘供电不足的情况下,表面上看起来没什么,实际上暗藏隐患。
很多人觉得奇怪,机械移动硬盘插电脑用得好端端的,怎么突然就挂了?
其实不是突然,是长期 USB 供电不足导致的隐患。
bootloaders
    10

bootloaders   12 天前

@zhangkaix 西数。iPad Pro 的 USBC 口供电可能和 iPhone 的 lightning 不一样吧。没有在 iPhone 上试过。

zhaidoudou123
    11

zhaidoudou123   12 天前

对 iPhone 来说供电不够,iPad Pro 应该没问题
但是 iOS 就没有推出硬盘的选项,我每次固态硬盘拔的都胆战心惊
MisakaTian
    12

MisakaTian   12 天前

我建议再掏 200,随便用啥组一个轻 Nas 外挂上去
Mysqto
    13

Mysqto   12 天前

要用带供电的线 官方就这个 https://www.apple.com.cn/shop/product/MK0W2FE/A
chitanda
    14

chitanda   11 天前

@zhaidoudou123 我好像看到一个说法,iOS 不需要推出硬盘是因为随时都是处于安全模式
zhaidoudou123
    15

zhaidoudou123   11 天前

@chitanda #14 我不太清楚,那是不是说后台复制文件是被严格禁止的?反正我是觉得没有推出不太合理
agagega
    16

agagega   11 天前

@chitanda 我有次把一个 u 盘复制粘贴到自身的时候拔掉了,然后数据全部没了
7gugu
    17

7gugu   11 天前

可以直接使用,没有问题的

2021 年了, macbook 的中英文输入切换仍然不够流畅

手上有一台 macbook air m1,中文键盘( caps 键的位置是中 /英),当我快速打字需要中英文频繁切换时就会出现中英文切换失败的情况。只有多次(一般是 2-4 次)按输入法切换键才能够切换成功。

为了这个问题,专门去到天才吧进行检查,*后结果是键盘没有问题,天才吧维修员也没有给出有用的建议。自己回来后还专门切换到了搜狗输入法,发现情况依旧.
自己之前也有个 16 款的 mbp,操作系统从 mojave 一直用到了 big sur,这个问题一直存在。
虽然只是一个小小的 bug (姑且称之为 bug ?),但是实在是太影响体验了。请问各位是否有遇到此问题,以及是如何解决的。

54 条回复    2021-04-09 10:13:31 +08:00
liprais
    1

liprais   3 天前 via iPhone

看一下键盘的响应呗
inhd
    2

inhd   3 天前

自带 caps 切换中文,从未出现过 LZ 说的情况

如果是第三方我会将 Shift 禁用,只保留中文输入

cnryan
    3

cnryan   3 天前

我也是,从 Catalina 到 Big Sur 自带的输入法切换中英文经常失败,换用搜狗输入法用 Shift 切换就正常了。
darkingtime
    4

darkingtime   3 天前

跟 win 比确实是这样,在 mac 上写论文切大小写中英文速度都不快
Bolvvv
    5

Bolvvv   3 天前

是指 mac 的键盘响应设置吗?官方看到了这个: https://support.apple.com/zh-cn/guide/mac-help/mchlp2264/mac 不知道能不能够对输入法切换灵敏度有所改善。
york2132
    6

york2132   3 天前 via iPhone

M1,*新系统,今天多次备忘录系统键盘中英文切换失效了,按多少次都没用,需要关掉软件才能回来,体验很差
ftu
    7

ftu   3 天前

在我的印象中 Mac 对文字输入工作者的负加分挺多的。

Office 慢、有时打字卡、甚至有时 Safari 输入文字还没按空格呢直接变英文上屏了……(*条是硬伤,倒不是觉得 Mac 性能差,类似简单的 launchpad 会卡,这种不可思议而已)

Awes0me
    8

Awes0me   3 天前

关闭 touch bar 选词
yivvv
    9

yivvv   3 天前

我想你可以试着关掉 Automatically switch to a document’s input source 看看
1002xin
    10

1002xin   3 天前

自带输入法,Command + Space 切换中英文,很流畅
Bolvvv
    11

Bolvvv   3 天前

@Awes0me 目前在用的是 m1 的 air,没有 touch bar 欸
Bolvvv
    12

Bolvvv   3 天前

@yivvv 已经关闭过了,而且我的场景是在同一个应用下切换会失败,比如 vscode 写代码添加注释时就需要中英文切换,经常会失效。
Bolvvv
    13

Bolvvv   3 天前

@1002xin 因为习惯问题,一直使用 caps 进行切换。另外一个原因是频繁切换输入法的话一个按键效率会高一些。
york2132
    14

york2132   3 天前 via iPhone

@york2132 对了,我是美式英文键盘,自带输入法切换在 fn,也是用着用着就切换不了甚至需要重启
forvtest
    15

forvtest   3 天前

其实 Windows 自带的输入法也有同样的问题,时间久了需要好久才能切换,我怀疑是不是中文的特殊性?
finnlewis
    16

finnlewis   3 天前 via iPhone

我是 win10 英切中有时候要切几次,catalina 切没问题
HankLu
    17

HankLu   3 天前

windows 不香吗
kwoktung
    18

kwoktung   3 天前 via Android

我也有这个问题
anyforever
    19

anyforever   3 天前

我想把自带的用 caps 进行切换,改成用 shift,没找到哪里可以设置。。。在 win 上习惯了用 shift 切换。。。
darkingtime
    20

darkingtime   3 天前

@anyforever 直接搜狗,caps 大小写 shift 中英文一切回到 win 的体验,在 win 上习惯改到 mac 上原生输入法切中英文对大量文字类不友好,不知道之前各位 Mac 用户都怎么习惯的。。
ericwoflskin
    21

ericwoflskin   3 天前

没遇到,反而是 windows 经常要按好几次 shift 才能切换
sidkang
    22

sidkang   3 天前

目前用的第三方软件来操作切换输入法,一样有问题,其实就是苹果一直以来切换 CJVK 输入法 API 的 bug,有概率发生图标显示成功,但实际上没有变动的情况。只能继续默默等修复了,目前在用 AppleScript 操作右上 menu bar icon 来切换,稍有 0.3s 左右的延迟(估计),但起码也算保证成功了。
HAYABUSA
    23

HAYABUSA   3 天前

@darkingtime 用着用着就习惯了,我 Mac 和 Windows 都习惯。脑内自动切换。

@HankLu Windows 并不香。其实得看个人需求吧。

ttgo
    24

ttgo   3 天前 via iPhone

原生快捷键从没出现过切换失败。
但第三方快捷键,有一定概率失败,这个问题从很多很多年前就有了,从未被解决…
ttgo
    25

ttgo   3 天前 via iPhone

@sidkang 这个问题至少存在小 10 年了
anyforever
    26

anyforever   3 天前

@darkingtime 搜狗还是算了。还不如用原来配好的鼠须管。只是发现原生自带的五笔用着也不错了,所以体验了一段时间了。就是这个切换不太习惯
nine
    27

nine   3 天前

没出现过你这个问题

我的问题是切换输入法很卡,*近找到了解决方法—重启。

wclebb
    28

wclebb   3 天前

caps lock 确实存在偶尔失效。
表现在于长时间用输入法时,会按一次没反应,要再按几次才能切换。

好像已经存在好几年的 Bug 了。

treblex
    29

treblex   3 天前

rime 的切换很流畅,之前因为这个问题用过一段时间,但是因为键位不一样…经常按错,需要适应一下
RyougiShiki
    30

RyougiShiki   3 天前

没有这个问题,跟按 ABC 一样灵敏,无法感同身受,19 款 15 寸。
Outshine
    31

Outshine   3 天前

用过 14 年款 MacBook 和 2018 款,自带的输入法中英切换都是长按 中英切换 键(中 -> 英需要 2s,英 -> 中按一下就行)
wishyy
    32

wishyy   3 天前

mac 下有一个类似 win+空格切换输入法的组合键。输入法只留两个,一个中文一个纯英文,用输入法切换代替中 /英切换,比按 shift 方便多了
d0ub1e
    33

d0ub1e   3 天前

港版 MacBook Pro 2018,美式键盘,切换流畅,莫得任何问题。
Harry1993
    34

Harry1993   3 天前   ❤️ 2

我只有兩個輸入法,所以把 System Preferences -> Keyboard -> Shortcuts -> Input Sources -> Select the previous input source 設置成了 Ctrl + Space,中英切換百分百成功
Korto
    35

Korto   3 天前

MacBook Pro 2020 intel 切换流畅无问题。
xieshaohu
    36

xieshaohu   3 天前

18 款的 MBP,中文键盘布局,用中 /英切换,很顺溜。
bao3
    37

bao3   3 天前

从未出现过楼主的情况。。。。。自带输入法,capslock 切换,顺滑。
espaul64
    38

espaul64   3 天前 via iPhone

这东西有时需要长按才行,Mac 自带输入法*恶心的是 Safari 地址框输入时会掉字,Catalina 和 Big Sur 都有?
hpeng
    39

hpeng   3 天前 via iPhone

确实很烦,所以,我现在注释也用英文了
cubecube
    40

cubecube   3 天前

切换慢,跟不上手速的现象是客观存在的。目前只保留搜狗,使用 shift 能缓解
楼上很多说无影响的 v 友应该是无体感而已。很多人对 macos 鼠标飘也无体感
johnzcp
    41

johnzcp   3 天前

同款 MacBook, 同款问题
hanksun
    42

hanksun   3 天前 via iPhone

M1 Air 左下角 Fn 地球图标那个键切换输入法频繁失灵…
DICK23
    43

DICK23   3 天前

CapsLock 切换中英文经常失败都需要多按几次
tsening
    44

tsening   2 天前

我的切换中英满流畅的,但我的问题是,有的时候,比如打开浏览器,然后输入,这个操作如果很快的话,输入的码顺序会乱掉,比如我输入 nihc,可能就会变成 inhc 这样
hush3
    45

hush3   2 天前

开始我也以为是失效了 后来发现应该出现这种情况一般都是在快速切换中英文时 刚敲完一个键迅速按下 caps 紧接着又按下一个键 就会导致没切换。 解决办法就是切换的时候 按下 caps 稍微停顿一下再输入 就可以了。
lizardll
    46

lizardll   2 天前

win10 也一样……要停一秒钟再输入
iSecret
    47

iSecret   2 天前

CapsLock 长按这个问题我去过天才吧问过,说是 feature 。
slimxfir2
    48

slimxfir2   2 天前 via iPhone

搜狗 禁掉默认的输入法
aotuman233
    49

aotuman233   2 天前   ❤️ 1

用 karabiner-elements ( https://karabiner-elements.pqrs.org ),在 complex modification 菜单内左下角 add rule –> import more rules from internet,搜索 caps_lock,会有一个“caps_lock 切换中英文,长按锁定大写,短按恢复小写”的规则。
导入之后就完事了,原理应该是把 capslock 绑定为 control+空格。
nomemo
    50

nomemo   2 天前

说得跟 win10 切换很流畅一样,3700x 的 cpu 够可以了吧,切起来也是顿
Jaosn
    51

Jaosn   2 天前

等等,这个问题在 Windows 10 上不也一样会出现吗?
elphet
    52

elphet   2 天前

我对这个问题深有感触,我猜测是由于在一个键位上绑了两个功能导致的。CAP 键 [短按] 切输入法, [长按] 切大小写,导致 [短按] 的时候会期待一次 [长按] ,造成一定的延迟。
但是在它 [期待] 的过程中按下其它键,这个 [短按] 事件会消失,这就很让人费解了!
faninx
    53

faninx   2 天前

我还是习惯 Control+Space 切换
nexo
    54

nexo   1 天前

流程的 yep 亲测

macOS App Store 的微信能打开小程序了,是我村网通?

之前是官网版本才能打开小程序,App Store 版本没有小程序。今天才发现商店版本也可以打开了。但是商店里更新说明一直都没有说明过。我记得很清楚,只有官网版的更新说明里明确说明过可以打开小程序。

14 条回复    2021-04-08 16:28:35 +08:00
wunonglin
    1

wunonglin   2 天前

是的。
xaoflysho
    2

xaoflysho   2 天前

@wunonglin 大概是 3.0 版本加上的?
wunonglin
    3

wunonglin   2 天前

@xaoflysho #2 是的
xaoflysho
    4

xaoflysho   2 天前

@wunonglin 更新描述里没写,我以为没有呢,之前不上还以为是被苹果卡了
Xusually
    5

Xusually   2 天前


“但是商店里更新说明一直都没有说明过。我记得很清楚,只有官网版的更新说明里明确说明过可以打开小程序。”
???

xaoflysho
    6

xaoflysho   2 天前

@Xusually 小程序呀,不是朋友圈
xaoflysho
    7

xaoflysho   2 天前

@Xusually 大部分人的关注点都在朋友圈上了,小程序悄咪咪的上了
oIMOo
    8

oIMOo   2 天前

@Xusually 更新内容确实没有小程序啊,没明白你这个问号是在问什么。
你圈起来的高亮是朋友圈,不是小程序。
Xusually
    9

Xusually   2 天前

@xaoflysho 抱歉看错。。小程序我印象中是 3.0 之前一个小版本就支持的
Xusually
    10

Xusually   2 天前

@oIMOo 我看错,以为说朋友圈。

xaoflysho
    11

xaoflysho   2 天前

@Xusually 我的印象里,当时 App Store 版本小程序被割了,官网版本很早就有了,但是还是习惯于用商店里的,一直没有小程序,直到刚才才发现
mcluyu
    12

mcluyu   2 天前

3.0.1 商店一直更新安装失败,有没有刚好知道怎么搞的
breaker911
    13

breaker911   2 天前   ❤️ 1

@mcluyu 删了本地的再安装就好了 BUG SIR 版本特色
zzw1998
    14

zzw1998   2 天前 via iPhone

@xaoflysho 很久以前的 2.x 版本就有小程序了

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速