iOS系统下使用Viber分享非英文多语言内容失败问题咨询
iOS Viber URL Scheme 非英文内容分享失败问题排查与解决
排查思路
- 校验
NSURL初始化结果:直接打印[NSURL URLWithString:viberScheme]的返回值,若返回nil,说明URL构造不符合规范,这是非英文分享失败的最常见原因 - 验证Viber Scheme入参要求:Viber的forward接口text参数要求传入URL编码后的字符串,非ASCII字符必须经过百分号编码才能被正确识别
- 排查系统跳转权限:iOS 9及以上版本要求在Info.plist的
LSApplicationQueriesSchemes白名单中添加viber,否则即使URL正确也会跳转失败 - 对比字符编码差异:英文属于ASCII字符,无需编码即可直接放入URL;缅甸语属于Unicode非ASCII字符,未编码直接放入URL会导致URL解析失败
根因说明
当前问题核心是缅甸语文本未做URL百分号编码,直接拼接进Scheme字符串后,[NSURL URLWithString:]无法识别非ASCII字符,返回nil导致跳转逻辑未执行,英文内容因为属于ASCII字符集所以不受影响。
具体解决方案
对分享文本先做百分号编码后再拼接Scheme,修正后的代码如下:
// 原始待分享缅甸语文本 NSString *shareText = @"မဂ်လာပါဂိမ်းကစားကြမယ်"; // 对文本做URL百分号编码,使用查询参数允许的字符集 NSString *encodedText = [shareText stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 拼接完整Viber跳转Scheme NSString *viberScheme = [NSString stringWithFormat:@"viber://forward?text=%@", encodedText]; NSURL *viberUrl = [NSURL URLWithString:viberScheme]; // 校验URL有效性、Viber安装状态后再执行跳转 if (viberUrl && [[UIApplication sharedApplication] canOpenURL:viberUrl]) { [[UIApplication sharedApplication] openURL:viberUrl options:@{} completionHandler:nil]; }
补充注意事项
- 必须在Info.plist中添加如下配置,否则跳转校验会失败:
<key>LSApplicationQueriesSchemes</key> <array> <string>viber</string> </array>
- 若编码后仍出现乱码,可尝试替换字符集为
[NSCharacterSet alphanumericCharacterSet]做强制编码,避免特殊字符漏编码 - iOS 10及以上版本可通过
openURL的completionHandler回调判断跳转是否成功,方便问题定位
内容的提问来源于stack exchange,提问作者zhou
相关产品推荐
相关产品推荐

