9***@qq.com
9***@qq.com
  • 发布:2018-11-11 17:11
  • 更新:2018-11-11 21:36
  • 阅读:1176

【已经解决】【报Bug】Native.js调用iOS原生通讯录界面(ContactsUI)时,选中联系人,真机无法获取到回调值。

分类:Native.js

用Native.js提供的api调用iOS原生通讯录界面(ContactsUI),选中联系人,在模拟器上运行可以在代理方法中拿到联系人信息;但是在真机上代理方法不会被执行,也就无法拿到联系人信息。

实现代码如下:
<script type="text/javascript" charset="utf-8">
mui.init();
mui.plusReady(function(){
function visitContacts(){
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");
name = familyName+givenName;
//电话号码
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");
}
console.log("姓名:"+name+" 手机号码:"+phoneNo);
mui.toast("姓名:"+name+" 手机号码:"+phoneNo);
}
});
//给通讯录控制器contactPickerVC设置代理
plus.ios.invoke(contactPickerVC, "setDelegate:", delegate);
//获取当前UIWebView视图
var currentWebview = plus.ios.currentWebview();
//根据当前UIWebView视图获取当前控制器
var currentVC = viewControllerByView(currentWebview);
//由当前控制器present到通讯录控制器
plus.ios.invoke(currentVC, "presentViewController:animated:completion:", contactPickerVC, true, null);
}

         /**  
         * 供iOS系统调用  
         * 根据view获取到当前控制器  
         * @param {Object} view  
         */  
        function viewControllerByView(view){  
            if (plus.os.name != "iOS") {  
                return null;  
            }  
            //UIViewController类对象  
            var UIViewController = plus.ios.invoke("UIViewController", "class");  
            while(view){  
                var responder = plus.ios.invoke(view, "nextResponder");  
                if (plus.ios.invoke(responder, "isKindOfClass:", UIViewController)) {  
                    return responder;  
                }  
                view = plus.ios.invoke(view, "superview");  
            }  
            return null;  
        }  

        mui("button")[0].addEventListener("tap", function(){  
            visitContacts();  
        });  
    });  

</script>

重现步骤:
我已将源码上传到附件中,请按如下步骤重现:
1、用iPhone真机运行源码
2、点击“访问通讯录”:
3、从通讯列表中选择一个联系人
[结果]:
返回到“调用通讯录”界面,但是没有打印出任何联系人信息
[期望]:
获取到选择的联系人信息:
日志打印出:姓名:* 手机号码:*****
toast弹出:姓名:* 手机号码:*****
IDE运行环境说明:
[HBuilder]
[IDE版本号]
HBuilder 9.1.19.201808300739
[mac版本号]
10.13.6

App运行环境说明:
[iOS版本号]
12.0
[手机型号]
iPhone 6s plus

附件:
[安装包]由于安装包是AD测试版,只有我自己的手机可以安装,所以把工程文件打包给你们,请查阅,谢谢!
联系方式
QQ:961383696

2018-11-11 17:11 负责人:无 分享
已邀请:
9***@qq.com

9***@qq.com (作者)

非逼我用插件来写吗?

9***@qq.com

9***@qq.com (作者)

换了一种方式用AddressBookUI(官方已经废弃,但还可以用)解决了,实现的是【- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;】这个代理方法,代理方法本该返回peoplePicker的地方返回的竟然是ContactsUI里CNContact的实例对象,本该返回person的地方竟然是undefined(给iOS原生API完全对不上),及惊奇有欣喜,总算可以拿到联系人信息了(而且只有真机可以拿到,在模拟器上不行,哈哈)。附上源码!

该问题目前已经被锁定, 无法添加新回复