2016-05-15 6 views
2

Я выполнил инструкции с этого сайта, http://moduscreate.com/writing-a-cordova-plugin-in-swift-for-ios/, для создания моих собственных плагинов cordova для платформы iOS. Во-первых, я установил плагина и создал новый плагин. Это мой plugin.xml:Написание плагина Cordova/Ionic Swift

<?xml version='1.0' encoding='utf-8'?> 
<plugin id="com-moduscreate-plugins-echoswift" version="0.0.1" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android"> 
<name>ModusEchoSwift</name> 
<js-module name="ModusEchoSwift" src="www/ModusEchoSwift.js"> 
    <clobbers target="modusechoswift" /> 
</js-module> 
<platform name="ios"> 
    <config-file target="config.xml" parent="/*"> 
     <feature name="ModusEchoSwift"> 
      <param name="ios-package" value="ModusEchoSwift" /> 
     </feature> 
    </config-file> 
    <source-file src="src/ios/ModusEchoSwift.swift" /> 
</platform> 
</plugin> 

Вот мой JS файл для плагина, т.е. ModusEchoSwift.js:

var exec = require('cordova/exec'); 
exports.echo = function(arg0, success, error) { 
    exec(success, error, "ModusEchoSwift", "echo", [arg0]); 
}; 
exports.echojs = function(arg0, success, error) { 
    if (arg0 && typeof(arg0) === 'string' && arg0.length > 0) { 
     success(arg0); 
    } else { 
     error('Empty message!'); 
    } 
}; 

И это мой родной Swift класс, т.е. ModusEchoSwift.swift:

@objc(ModusEchoSwift) class ModusEchoSwift : CDVPlugin { 
func echo(command: CDVInvokedUrlCommand) { 
    var pluginResult = CDVPluginResult(
     status: CDVCommandStatus_ERROR 
    ) 

    let msg = command.arguments[0] as? String ?? "" 

    if msg.characters.count > 0 { 
     /* UIAlertController is iOS 8 or newer only. */ 
     let toastController: UIAlertController = 
      UIAlertController(
       title: "", 
       message: msg, 
       preferredStyle: .Alert 
      ) 

     self.viewController?.presentViewController(
      toastController, 
      animated: true, 
      completion: nil 
     ) 

     let duration = Double(NSEC_PER_SEC) * 3.0 
     dispatch_after(
      dispatch_time(
       DISPATCH_TIME_NOW, 
       Int64(duration) 
      ), 
      dispatch_get_main_queue(), 
      { 
       toastController.dismissViewControllerAnimated(
        true, 
        completion: nil 
       ) 
      } 
     ) 

     pluginResult = CDVPluginResult(
      status: CDVCommandStatus_OK, 
      messageAsString: msg 
     ) 
    } 

    self.commandDelegate!.sendPluginResult(
     pluginResult, 
     callbackId: command.callbackId 
    ) 
    } 
} 

Это файлы в моем плагине. Теперь я пытаюсь показать простое предупреждение с помощью этого плагина в моем ионном проекте. У меня есть простой index.html прямо сейчас, где я хочу отобразить предупреждение, вот оно:

<ion-pane> 
    <ion-header-bar class="bar-stable"> 
    <h1 class="title">Ionic Blank Starter</h1> 
    </ion-header-bar> 
    <ion-content> 
    <div ng-controller="myController"> 
     Hello {{user}} 
     </div> 
    </ion-content> 
</ion-pane> 

А вот мой контроллер:

.controller('myController', function($scope){ 
console.log("Ok"); 
$scope.user = "kAy"; 
ModusEchoSwift.echo('Plugin Ready!', function(msg) { 
    console.log("Success"); 
    }, 
    function(err) { 
    console.log("Error"); 
    } 
); 

})

Вот в этом контроллер, я все время получаю ошибку, что ModusEchoSwift не определен, чего я не понимаю! Может ли кто-нибудь сказать мне, как использовать функцию моего плагина в моем существующем ионном проекте?

+0

Вы включили файл cordova.js в свой HTML? – Gandhi

+0

У меня есть, я не думаю, что проблема –

+0

Является ли ваш плагин включенным в папку плагинов платформы iOS? Также в вашей папке плагинов проекта ваша пользовательская запись плагина доступна в файле ios.json? – Gandhi

ответ

0

Я автор блога, за которым вы следите, я проверил весь ваш код, который вы разместили, и все выглядит правильно. Возможно, вы еще не добавили плагин заголовка мостов в проект приложения Cordova, о котором я упоминаю в своем сообщении (приведенный ниже).

Вкратце я думаю, вам нужно добавить плагин, на который ссылается ниже, что поможет справиться с требуемым заголовком Objective C to Swift. Также проверьте, у вас есть плагин Modus и мостовую один установлен правильно, выполнив

cordova plugin ls 

В основной папке своего приложения проекта (один с config.xml в нем). Это должно возвращать как ModusEchoSwift, так и подключаемый заголовок заголовка в своем выходе, если оба они правильно установлены в проекте приложения.

плагин Кордова, что мы работаем над реализуется в Swift, но родные части приложения Кордовы IOS написаны в Objective-C по-прежнему. Как правило, это не код, который должен быть связан с , так как автомат Cordova CLI генерирует его для нас вместе с проектом Xcode для его компиляции и сборки.

При использовании Swift написать плагин, однако, мы должны изменить настройки Xcode проекта в Кордовы приложения, чтобы позволить нашему Swift кода плагина для доступа, который Кордова возражает, что он нуждается в том, что написано в Objective-C. Для этого мы используем мостовой файл заголовка.

Модифицированный заголовочный файл представляет собой заголовок Objective-C, содержащий импорт для каждого заголовка Objective-C, который мы хотим получить в нашем коде Swift. В нашем случае нам нужен доступ к некоторым объектам Cordova : CDVPlugin, CDVInvokedUrlCommand и CDVPluginResult для примера .Это означает, что наше преодоление заголовок просто должно содержать:

#import <Cordova/CDV.h> 

как наш плагин не будет использовать любые другие ссылки Objective-C. CDV.h содержит декларации для всех этих элементов и является частью каждого приложения Кордовы, которое генерирует CLI.

Наш заголовок шунтирующего должен жить в папке платформы/ИОС/в нашем приложении Кордовы (например, для нашего TestApp что мы будем строить рядом это будет платформа/ИОС/TestApp). Он также нуждается в для ссылки в файле проекта Xcode, так что Xcode знает, что это заголовок моста и что проект приложения Objective-C также содержит код Swift при компиляции и связывании приложения.

В Кордове папка платформ в идеале должна быть артефактом сборки - , сгенерированным полностью путем выполнения команд CLI Кордовы. Мы не должны быть редактирования или добавления файлов вручную в этой папке. Тем не менее, мы теперь находим , которые нам нужно сделать, чтобы вставить требуемый мост в проект Xcode. К счастью, CLI Cordova поддерживает hooks, которые позволяют нам запускать скрипты до или после выполнения определенных команд CLI , чтобы справиться с такими ситуациями.

Крюк-скрипты могут быть скопированы и распространены с помощью плагинов, что делает их легкодоступными и добавляемыми к проектам. Пользователь GitHub Alexis Kofman написал удобный плагин, который устанавливает скрипт hook для автоматического создания нужного заголовочного заголовка, и мы должны сконфигурировать проект Xcode на . Его плагин можно найти here, и мы будем использовать его, когда настраиваем тестовое приложение Cordova для запуска нашего Swift-плагина.

Для получения дополнительной информации о смешивании Objective C и Swift в том же проекта, мы рекомендуем со ссылкой на Apple documentation по этому вопросу.

На доследовании, похоже, вы не добавляли мостовой плагин заголовка в тестовом приложении перед добавлением платформы IOS или Swift плагина, этот порядок событий необходимо, чтобы получить мостовую заголовок плагина скрипт ловушки для огонь в нужное время.

следующий порядок команд получает вас к рабочему приложения из ничего, я просто бежал это на моей локальной машине тройной проверки:

cordova create mytest 
cd mytest 
cordova plugin add cordova-plugin-add-swift-support --save 
cordova platform add ios --save 
cordova plugin add https://github.com/ModusCreateOrg/cordova-swift-plugin-example 
cordova build ios 
cordova emulate ios 
  • Пусть старт эмулятора.
  • Подключитесь к эмулятору, используя удаленный отладчик Safari.
  • Открыть JS консоль

В JS консоли:

modusechoswift.echo('hello', undefined); 

Наблюдайте родной «тост» с «привет» сообщение появляется из плагина в тренажере затем исчезают вскоре после этого. Скриншот прилагается.enter image description here

+0

Спасибо большое! Я пытался сделать это в кордове, и, похоже, он работает нормально. Но я хочу попробовать это в ионной форме, и я следовал тому же методу для ионной платформы, которая, похоже, не работает в ионной форме! –

+0

Какие-нибудь плагины работают так, как вы пытаетесь использовать их с ионикой? Проблема может быть более общей, но я очень мало знаю об Ионе. –

+0

Другие плагины cordova, такие как cordova-plugin-камера, plug-in-plug-pluger, похоже, работают с ионными. И мой проект выполнен в ионной форме, поэтому мне нужно заставить этот плагин cordova работать в ионном режиме. –

0

Обычно ошибка «плагин не определен» означает, что вам необходимо открыть плагин ModusCreate через Angular service (Ionic построен на AngularJS). Сама Кордова не использует Angular, поэтому это работает, но Ionic этого не делает. Есть несколько способов сделать сервис - я бы посмотрел на ngCordova для примера. ngCordova, скорее всего, как кордова-плагин-камера уже подвергается воздействию углов.

Как только вы это сделали, вам нужно будет ввести эту услугу в ваш контроллер (почти так же, как и $ scope уже впрыскивается). После этого вам должно быть хорошо идти. Надеюсь, это поможет.

+0

Я подумал, что плагины cordova не работают в ионной платформе, но работают плагины ngCordova. Так можете ли вы ссылаться на некоторые ссылки на учебники или объяснять, как я могу сделать этот плагин cordova работать в ионном? –

+0

См. Ссылки, которые я опубликовал для примеров. Основная идея, однако, заключается в том, что вы создаете новый модуль: например, angular.module ('modusCreateServiceModule', []) (скобки означают, что вы создаете новый). Затем вы заходите на сервисную фабрику: например. angular.module ([...]). factory ('$ ModusCreateSwift', [зависимости идут здесь, затем функция, определяющая, что такое «эхо» (определение функции)]). Это нетривиальная задача, поэтому я ссылаюсь на страницу ngCordova и Angular services. – JCooper

1

вызова контроллер «modusechoswift» не «ModusEchoSwift» и убедитесь, что платформа готова

$ionicPlatform.ready(function() { 
    modusechoswift.echo('Plugin Ready!', function(msg) { 
     console.log("Success"); 
    }, 
    function(err) { 
     console.log("Error"); 
    } 
); 
}); 
2

Это делает правильно работать с ионной v2.2.1 & Cordova v6.5.0, при условии, что действия, описанные в Саймона blog post следуют, и с одним небольшим изменением: Добавьте эту строку кода в App.component.ts файл ниже импорта:

declare let modusechoswift; 

в файле Bridging-header.h в Ioni Приложение c было в разделе «Другие источники» в моем случае. Сообщение Саймона относится к другому месту, которое изначально меня отпустило, но это было не проблема. Фактически, перемещение этого заголовочного файла в любом месте моего проекта Xcode не оказало никакого эффекта. Я предполагаю, что XCode не волнует, где находится файл, пока он присутствует.

Смежные вопросы