哈喽,大家好,感谢您来阅读我的文章,作为iOS开发者,集成各类支付是家常便饭之事,今天我来给大家推荐几个不常见的微信支付问题。
最近,在项目的反馈版块中,收到了这么一位APP用户的反馈,他在使用我们家的APP时,使用微信支付,支付完成后,账户信息得不到更新,需要重启APP才能更新。从后面了解中所得知,用户手中装的微信APP版本号是 7.0.3的(经过了九九八十一难,我拿到了用户使用的手机,并将其手机用于项目调试)。
在控制台中,我发现了这么一条信息,在调取WXAPI时就会打印出来。
canOpenURL: failed for URL: "weixinULAPI://" - error: The operation couldn’t be completed. (OSStatus error -10814.)
当时有点懵逼。这个是多么熟悉,有多么可恨的报错。这个在刚介入微信支付时就能出现。只需在项目中把各种配置配起来,就可以消除的了,我反反复复对之前的配置进行检测,发现并没有问题。
很是奇怪咯。~~~~
这个时候,我使用微信支付,不管成功与否,确实不会触发回调。(在个人手机操作时,流程都是正常的)
查阅了各种资料。发现也没查出个所以然来。
最后我只能下手,向WXAPI文档下手了。
/*! @brief 处理旧版微信通过URL启动App时传递的数据
*
* 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。
* @param url微信启动第三方应用时传递过来的URL
* @param delegate WXApiDelegate对象,用来接收微信触发的消息。
* @return 成功返回YES,失败返回NO。
*/
+ (BOOL)handleOpenURL:(NSURL *)url delegate:(nullable id<WXApiDelegate>)delegate;
/*! @brief 处理微信通过Universal Link启动App时传递的数据
*
* 需要在 application:continueUserActivity:restorationHandler:中调用。
* @param userActivity微信启动第三方应用时系统API传递过来的userActivity
* @param delegate WXApiDelegate对象,用来接收微信触发的消息。
* @return 成功返回YES,失败返回NO。
*/
+ (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity delegate:(nullable id<WXApiDelegate>)delegate;
看到以上两个API,脑海中突然灵光一闪,关于SDK接口问题。其实这里最大的问题不是接口,而是自身微信版本问题。
在上面第一条信息中,我们可以得知。
旧版微信通过URL Schemes传递数据的
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
return [WXApi handleOpenURL:url delegate:self];
}
新版微信是通过UniversalLink来传递数据的。
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}
把这两个接口适配好。就可以收到微信回调的。
即使能收到微信回调。但是控制台中还是会继续打印出 canOpenURL: failed for URL: "weixinULAPI://" - error: The operation couldn’t be completed. (OSStatus error -10814.) 从功能上暂时没有发现什么异常。
个人分析,可能是高版本的SDK调用低版本的微信时,由于内部兼容所导致的。并不影响使用。
如何有道友知道是什么原因所导致的。可以在下方评论区中留言。
随便提一下:在iOS13 开始会出现这么一个文件SceneDelegate(Xcode11开始,创建项目时,会把之前的APPdelegate给细分化)。
在有这种项目文件的项目中,UniversalLink 和 URL Schemes 回调都会在这个文件API方法中回调。
iOS 13 UniversalLink 回调方法。
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity API_AVAILABLE(ios(13.0)){
}
iOS 13 URL Schemes
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts API_AVAILABLE(ios(13.0)){
}
随手记录,不喜勿喷。