9***@qq.com
9***@qq.com
  • 发布:2020-12-06 22:56
  • 更新:2022-08-17 16:32
  • 阅读:651

【报Bug】NJS有bug: iOS系统通讯录模块的代理方法不会被执行!

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 10.15.5

HBuilderX类型: 正式

HBuilderX版本号: 2.9.11

手机系统: iOS

手机系统版本号: IOS 14

手机厂商: 苹果

手机机型: iPhone12

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

//1、ABPeoplePickerNavigationControllerDelegate 的 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person; 方法:

            var peoplePickerNavController = plus.ios.newObject("ABPeoplePickerNavigationController");  
            //实现代理方法【- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;】  
            //同时生成遵守ABPeoplePickerNavigationControllerDelegate协议的代理对象peoplePickerDelegate  
            var peoplePickerDelegate = plus.ios.implements("ABPeoplePickerNavigationControllerDelegate", {  
                "peoplePickerNavigationController:didSelectPerson:":function(peoplePicker, person){  
                    //这里的peoplePicker竟然是CNContact实例对象,person是undefined  
                    console.log(JSON.stringify(peoplePicker));  
                    console.log(JSON.stringify(person));  
                    console.log(typeof person);  

                    //所以之前的代码不用改  
                    var contact = peoplePicker;  
                    //姓名/公司  
                    var name = "";  
                    //姓氏  
                    var familyName = contact.plusGetAttribute("familyName");  
                    //名字  
                    var givenName = contact.plusGetAttribute("givenName");  
                    //公司  
                    var organizationName = contact.plusGetAttribute("organizationName");  
                    name = familyName+givenName;  
                    if (name.length <= 0) {  
                        name = organizationName;  
                    }  
                    //电话号码  
                    var phoneNo = "";  
                    var phoneNumbers = contact.plusGetAttribute("phoneNumbers");  
                    if (phoneNumbers.plusGetAttribute("count") > 0) {  
                        var phone = phoneNumbers.plusGetAttribute("firstObject");  
                        var phoneNumber = phone.plusGetAttribute("value");  
                        phoneNo = phoneNumber.plusGetAttribute("stringValue");  
                    }  
                    if (callBack) {  
                        callBack(name, phoneNo);  
                    }  
                }  
            });  
            //给通讯录控制器peoplePickerNavController设置代理  
            plus.ios.invoke(peoplePickerNavController, "setPeoplePickerDelegate:", peoplePickerDelegate);  
            /*  
            //获取当前UIWebView视图  
            var currentWebview = plus.ios.currentWebview();  
            //根据当前UIWebView视图获取当前控制器  
            var currentVC = nativeCommon.contacts.ios.getViewControllerByView(currentWebview);  
            //由当前控制器present到通讯录控制器  
            plus.ios.invoke(currentVC, "presentViewController:animated:completion:", peoplePickerNavController, true, null);  
            */  
            //获取跟控制器  
            var rootVc = nativeCommon.contacts.ios.getRootViewController();  
            //由跟控制器present到通讯录控制器  
            plus.ios.invoke(rootVc, "presentViewController:animated:completion:", peoplePickerNavController, true, function(){  
                if (finishedLoad) {finishedLoad();}  
            });  

//2、CNContactPickerDelegate 的 - (void)contactPicker:(CNContactPickerViewController )picker didSelectContact:(CNContact )contact;方法:

            var contactPickerVC = plus.ios.newObject("CNContactPickerViewController");  
            //实现代理方法【- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;】  
            //同时生成遵守CNContactPickerDelegate协议的代理对象delegate  
            var delegate = plus.ios.implements("CNContactPickerDelegate", {  
                "contactPicker:didSelectContact:":function(picker, contact){  
                    console.log(JSON.stringify(picker));  
                    console.log(JSON.stringify(contact));  
                    //姓名/公司  
                    var name = "";  
                    //姓氏  
                    var familyName = contact.plusGetAttribute("familyName");  
                    //名字  
                    var givenName = contact.plusGetAttribute("givenName");  
                    //公司  
                    var organizationName = contact.plusGetAttribute("organizationName");  
                    name = familyName+givenName;  
                    if (name.length <= 0) {  
                        name = organizationName;  
                    }  
                    //电话号码  
                    var phoneNo = "";  
                    var phoneNumbers = contact.plusGetAttribute("phoneNumbers");  
                    if (phoneNumbers.plusGetAttribute("count") > 0) {  
                        var phone = phoneNumbers.plusGetAttribute("firstObject");  
                        var phoneNumber = phone.plusGetAttribute("value");  
                        phoneNo = phoneNumber.plusGetAttribute("stringValue");  
                    }  
                    if(callBack){  
                        callBack(name, phoneNo);  
                    }  
                }  
            });  
            //给通讯录控制器contactPickerVC设置代理  
            plus.ios.invoke(contactPickerVC, "setDelegate:", delegate);  
            /*  
            //获取当前UIWebView视图  
            var currentWebview = plus.ios.currentWebview();  
            //根据当前UIWebView视图获取当前控制器  
            var currentVC = nativeCommon.contacts.ios.getViewControllerByView(currentWebview);  
            //由当前控制器present到通讯录控制器  
            plus.ios.invoke(currentVC, "presentViewController:animated:completion:", contactPickerVC, true, null);  
            */  
            //获取跟控制器  
            var rootVc = nativeCommon.contacts.ios.getRootViewController();  
            //由跟控制器present到通讯录控制器  
            plus.ios.invoke(rootVc, "presentViewController:animated:completion:", contactPickerVC, true, function(){  
                if (finishedLoad) {finishedLoad();}  
            });  

操作步骤:

请iOS开发人员复现

预期结果:

应该执行代理方法

实际结果:

没有执行代理方法

bug描述:

访问iOS原生通讯录界面,选取联系人的代理方法不会执行!
1、ABPeoplePickerNavigationControllerDelegate 的 - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController )peoplePicker didSelectPerson:(ABRecordRef)person; 方法
2、CNContactPickerDelegate 的 - (void)contactPicker:(CNContactPickerViewController
)picker didSelectContact:(CNContact *)contact;方法
都不会执行

2020-12-06 22:56 负责人:无 分享
已邀请:
DCloud_iOS_XHY

DCloud_iOS_XHY

l***@yuan-mai.com

l***@yuan-mai.com

请问解决了吗?遇到了同样的问题

FullStack

FullStack - 【插件开发】【专治疑难杂症】【ios上架、马甲包、白包、过审、已成功上架过几百个】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=22130】【非诚勿扰】QQ:543610866

要回复问题请先登录注册