iOS Apple Pay应用内配置扩展:init调用后viewDidLoad未触发
解决Apple Pay In-App Provisioning授权扩展viewDidLoad未执行的问题
核心问题分析
你的授权扩展主类虽遵守了PKIssuerProvisioningExtensionAuthorizationProviding协议,但未实现协议要求的关键方法,同时视图控制器未正确提供可显示的视图,导致Wallet加载扩展时无法完成视图初始化流程,viewDidLoad因此不会触发。
具体修复步骤
1. 实现协议必要方法
PKIssuerProvisioningExtensionAuthorizationProviding协议要求必须实现startAuthorizationWithPresentationCompletion:方法,系统通过该方法触发授权流程并获取要显示的视图。在主类中添加该方法:
- (void)startAuthorizationWithPresentationCompletion:(void (^)(UIViewController * _Nullable))presentationCompletion { NSLog(@"startAuthorizationWithPresentationCompletion"); // 将当前控制器传入回调,让Wallet显示你的视图 presentationCompletion(self); }
2. 确保视图控制器有可加载的视图
如果未使用xib/storyboard,需手动创建视图避免视图为nil:
- (instancetype)init { NSLog(@"--- init"); self = [super init]; if (self) { // 手动创建视图并设置背景色,确保视图可显示 self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.view.backgroundColor = [UIColor whiteColor]; } return self; }
如果使用xib,需确保xib文件名与控制器类名一致,或在Info.plist的NSExtension字典下添加NSExtensionNibName指定xib文件。
3. 检查Info.plist配置
确认NSExtensionPrincipalClass的类名正确,若使用模块需写成$(PRODUCT_MODULE_NAME).IssuerProvisioningViewController,避免类找不到的情况。
4. 验证权限和环境
确保开发者账号已开通Apple Pay支付卡配置权限,测试设备的iOS 16.4.1版本支持该扩展能力,且使用包含com.apple.developer.payment-pass-provisioning权限的测试配置文件。
修复后的完整主类实现示例
#import "IssuerProvisioningViewController.h" #import <PassKit/PassKit.h> @interface IssuerProvisioningViewController ()<PKIssuerProvisioningExtensionAuthorizationProviding> @end @implementation IssuerProvisioningViewController @synthesize completionHandler; - (instancetype)init { NSLog(@"--- init"); self = [super init]; if (self) { self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.view.backgroundColor = [UIColor whiteColor]; } return self; } - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { NSLog(@"--- initWithNibName nibNameOrNil"); self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; return self; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"viewDidLoad"); // 在这里添加你的授权UI逻辑,比如登录表单、验证控件等 } - (void)startAuthorizationWithPresentationCompletion:(void (^)(UIViewController * _Nullable))presentationCompletion { NSLog(@"startAuthorizationWithPresentationCompletion"); presentationCompletion(self); } @end
内容的提问来源于stack exchange,提问作者user9546646
相关产品推荐
相关产品推荐

