1. /**
    2. * nativeCommon,通过Native.js调用原生API
    3. *
    4. */
    5. // 调用方式
    6. let that = this
    7. nativeCommon.nativeCommon.contacts.getContact(function callBack(name, phoneNumber){
    8. that.address.name = name;
    9. that.address.mobile = phoneNumber.replace(/\s|-+/g,"");
    10. });
    11. const nativeCommon = {
    12. /**
    13. * 通讯录模块
    14. */
    15. contacts: {
    16. getContact: function(callBack) {
    17. switch (plus.os.name) {
    18. case "iOS":
    19. if (plus.device.model === "iPhoneSimulator") {
    20. //模拟器
    21. nativeCommon.contacts.ios.visitContacts(function(name, phoneNumber) {
    22. callBack(name, phoneNumber);
    23. });
    24. } else {
    25. //真机
    26. nativeCommon.contacts.ios.visitAddressBook(function(name, phoneNumber) {
    27. callBack(name, phoneNumber);
    28. });
    29. }
    30. break;
    31. case "Android":
    32. nativeCommon.contacts.android.visitContacts(function(name, phoneNumber) {
    33. callBack(name, phoneNumber);
    34. });
    35. break;
    36. default:
    37. break;
    38. }
    39. },
    40. ios: { //供iOS系统调用
    41. /**
    42. * 访问通讯录,将获取的联系人信息通过callBack返回
    43. * 仅限模拟器使用(Native.js 的bug)
    44. * @param {Object} callBack回调
    45. */
    46. visitContacts: function(callBack) {
    47. var contactPickerVC = plus.ios.newObject("CNContactPickerViewController");
    48. //实现代理方法【- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;】
    49. //同时生成遵守CNContactPickerDelegate协议的代理对象delegate
    50. var delegate = plus.ios.implements("CNContactPickerDelegate", {
    51. "contactPicker:didSelectContact:": function(picker, contact) {
    52. //姓名
    53. var name = "";
    54. //姓氏
    55. var familyName = contact.plusGetAttribute("familyName");
    56. //名字
    57. var givenName = contact.plusGetAttribute("givenName");
    58. name = familyName + givenName;
    59. //电话号码
    60. var phoneNo = "";
    61. var phoneNumbers = contact.plusGetAttribute("phoneNumbers");
    62. if (phoneNumbers.plusGetAttribute("count") > 0) {
    63. var phone = phoneNumbers.plusGetAttribute("firstObject");
    64. var phoneNumber = phone.plusGetAttribute("value");
    65. phoneNo = phoneNumber.plusGetAttribute("stringValue");
    66. }
    67. if (callBack) {
    68. callBack(name, phoneNo);
    69. }
    70. }
    71. });
    72. //给通讯录控制器contactPickerVC设置代理
    73. plus.ios.invoke(contactPickerVC, "setDelegate:", delegate);
    74. //获取当前UIWebView视图
    75. var currentWebview = plus.ios.currentWebview();
    76. //根据当前UIWebView视图获取当前控制器
    77. var currentVC = nativeCommon.contacts.ios.getViewControllerByView(currentWebview);
    78. //由当前控制器present到通讯录控制器
    79. plus.ios.invoke(currentVC, "presentViewController:animated:completion:", contactPickerVC, true, null);
    80. },
    81. /**
    82. * 访问通讯录,将获取的联系人信息通过callBack返回
    83. * 仅限真机使用(Native.js 的bug)
    84. * @param {Object} callBack
    85. */
    86. visitAddressBook: function(callBack) {
    87. var peoplePickerNavController = plus.ios.newObject("ABPeoplePickerNavigationController");
    88. console.log(2);
    89. //实现代理方法【- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;】
    90. //同时生成遵守ABPeoplePickerNavigationControllerDelegate协议的代理对象peoplePickerDelegate
    91. var peoplePickerDelegate = plus.ios.implements("ABPeoplePickerNavigationControllerDelegate", {
    92. "peoplePickerNavigationController:didSelectPerson:": function(peoplePicker, person) {
    93. //这里的peoplePicker竟然是CNContact实例对象,person是undefined
    94. console.log(JSON.stringify(peoplePicker));
    95. console.log(JSON.stringify(person));
    96. console.log(typeof person);
    97. //所以之前的代码不用改
    98. var contact = peoplePicker;
    99. //姓名
    100. var name = "";
    101. //姓氏
    102. var familyName = contact.plusGetAttribute("familyName");
    103. //名字
    104. var givenName = contact.plusGetAttribute("givenName");
    105. name = familyName + givenName;
    106. //电话号码
    107. var phoneNo = "";
    108. var phoneNumbers = contact.plusGetAttribute("phoneNumbers");
    109. if (phoneNumbers.plusGetAttribute("count") > 0) {
    110. var phone = phoneNumbers.plusGetAttribute("firstObject");
    111. var phoneNumber = phone.plusGetAttribute("value");
    112. phoneNo = phoneNumber.plusGetAttribute("stringValue");
    113. }
    114. if (callBack) {
    115. callBack(name, phoneNo);
    116. }
    117. }
    118. });
    119. //给通讯录控制器peoplePickerNavController设置代理
    120. plus.ios.invoke(peoplePickerNavController, "setPeoplePickerDelegate:", peoplePickerDelegate);
    121. //获取当前UIWebView视图
    122. var UIApplicationClass = plus.ios.importClass("UIApplication");
    123. var UIAppObj = UIApplicationClass.sharedApplication();
    124. var del = plus.ios.invoke(UIAppObj, "delegate");
    125. var appWindowObj = plus.ios.invoke(del, "window");
    126. var appRootController = plus.ios.invoke(appWindowObj, "rootViewController");
    127. //由当前控制器present到通讯录控制器
    128. plus.ios.invoke(appRootController, "presentViewController:animated:completion:", peoplePickerNavController, true,
    129. null);
    130. }
    131. },
    132. android: { //供android系统调用
    133. visitContacts: function(callBack) {
    134. console.log(1);
    135. plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, (book) => {
    136. var REQUESTCODE = 1000;
    137. var main = plus.android.runtimeMainActivity();
    138. var Intent = plus.android.importClass('android.content.Intent');
    139. var ContactsContract = plus.android.importClass('android.provider.ContactsContract');
    140. var intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    141. main.onActivityResult = function(requestCode, resultCode, data) {
    142. if (REQUESTCODE == requestCode) {
    143. var phoneNumber = "";
    144. var resultString = "";
    145. var context = main;
    146. plus.android.importClass(data);
    147. var contactData = data.getData();
    148. var resolver = context.getContentResolver();
    149. plus.android.importClass(resolver);
    150. var cursor = resolver.query(contactData, null, null, null, null);
    151. plus.android.importClass(cursor);
    152. cursor.moveToFirst();
    153. //姓名
    154. var givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) || "";
    155. var contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    156. var pCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds
    157. .Phone.CONTACT_ID + " = " + contactId, null, null);
    158. if (pCursor.moveToNext()) {
    159. phoneNumber = pCursor.getString(pCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    160. }
    161. if (callBack) {
    162. callBack(givenName, phoneNumber);
    163. }
    164. cursor.close();
    165. pCursor.close();
    166. }
    167. };
    168. main.startActivityForResult(intent, REQUESTCODE);
    169. })
    170. }
    171. }
    172. }
    173. }
    174. module.exports = {
    175. nativeCommon: nativeCommon
    176. }