代码之家  ›  专栏  ›  技术社区  ›  n3wbie

在Swift中使用GTM v5 TAGCustomFunction

  •  2
  • n3wbie  · 技术社区  · 9 年前

    我正在一个Swift项目中集成GTM v5(GTM+Firebase),我希望能够在触发标记时调用一些方法。然而,尽管Objective C和Android项目中的类似实现确实有效,但它似乎不适用于Swift。

    这是符合 TAGCustomFunction 协议:

    import Foundation
    import GoogleTagManager
    
    final class Tags: NSObject, TAGCustomFunction {
    
        func execute(withParameters parameters: [AnyHashable : Any]!) -> NSObject! {
            print("YEAH ! IT WORKS !")
            return nil
        }
    }
    

    一切都很顺利,尽管我看到了这些日志:

    GoogleTagManager信息:处理记录的事件:applicationStart,参数为:(null)

    但我打印的日志没有显示出来

    我对容器的配置很确定,因为这个容器已经正确加载,并且我在Objective C项目中使用了完全相同的容器,在这个项目中它工作得很好。

    2 回复  |  直到 5 年前
        1
  •  5
  •   PDK    5 年前

    我想 TAGCustomFunction 需要有类/方法 @objc 注释, 班级层面 @objc 注释需要指定类名,即。

    import Foundation
    import GoogleTagManager
    
    @objc(Tags)
    final class Tags: NSObject, TAGCustomFunction {
    
        @objc func execute(withParameters parameters: [AnyHashable : Any]!) -> NSObject! {
            print("YEAH ! IT WORKS !")
            return nil
        }
    }
    
        2
  •  3
  •   Community Mohan Dere    8 年前

    阅读后 this SO post ,我突然想起Swift项目可以嵌入一些目标C类。 一旦我意识到这一点,我的问题的解决方案就变得非常容易,尽管我以前从未这么做过。

    我创建了一个新的 可可触摸类 如下所示:

    • 这是.m:

      #import "MyCustomTagClass.h"
      #import "MySwiftClass-Swift.h"
      
      @implementation MyCustomTagClass
      
      - (NSObject*)executeWithParameters:(NSDictionary*)parameters {
          [MySwiftClass myMethod];
      }
      
      @end
      
    • 这里是.h:

       #import <Foundation/Foundation.h>
       #import <GoogleTagManager/TAGCustomFunction.h>
      
       @interface MyCustomTagClass : NSObject <TAGCustomFunction>
      
       - (NSObject*)executeWithParameters:(NSDictionary*)parameters;
      
       @end
      

    请注意,我为我的Swift类导入了一个标头,它是由Xcode自动生成的。只需添加 -斯威夫特 在要导入的类的名称之后,就像我在上面的.m示例中所做的那样。 最后,但并非最不重要的是,使用 @objc 类和方法声明行的注释:

    import Foundation
    
    @objc class MySwiftClass: NSObject {
    
       //...
    
       @objc static func myMethod() {
            // do something...
        }
    }
    

    我希望这有帮助!