n3wbie
n3wbie

Reputation: 1126

Using GTM v5 TAGCustomFunction in Swift

I'm integrating GTM v5 (GTM + Firebase) in a Swift project, and I want to be able to call some methods when tags are triggered. However, it doesn't seem to work with Swift, although similar implementations in Objective C and Android projects did work.

Here's the class conforming to the TAGCustomFunction protocol :

import Foundation
import GoogleTagManager

final class Tags: NSObject, TAGCustomFunction {

    func execute(withParameters parameters: [AnyHashable : Any]!) -> NSObject! {
        print("YEAH ! IT WORKS !")
        return nil
    }
}

Everything is working well, even though I see these kind of logs:

GoogleTagManager info: Processing logged event: applicationStart with parameters: (null)

But the log I'm printing is not showing…

I'm sure about the configuration of the container since this one is correctly loaded, and I use the exact same container for my Objective C project, in which it works perfectly.

Upvotes: 2

Views: 1856

Answers (2)

Roger
Roger

Reputation: 573

I think TAGCustomFunction needs to have class/method @objc annotations, and the class-level @objc annotation needs to specify the class name, i.e.

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
    }
}

Upvotes: 5

n3wbie
n3wbie

Reputation: 1126

After reading this SO post, I suddenly remembered that a Swift project could embed some objective C classes. The solution to my problem was ridiculously easy to set up once I realized that, eventhough I've never had to do it before.

I created a new Cocoa Touch Class like the following :

  • Here is the .m :

    #import "MyCustomTagClass.h"
    #import "MySwiftClass-Swift.h"
    
    @implementation MyCustomTagClass
    
    - (NSObject*)executeWithParameters:(NSDictionary*)parameters {
        [MySwiftClass myMethod];
    }
    
    @end
    
  • And here is the .h :

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

Note that I import a header for my Swift class, which is automatically generated by Xcode. Just add -Swift.h after the name of your class to import it, just as I did in the .m example above. Last, but not least, update your Swift class with @objc annotations at class and method declaration lines :

import Foundation

@objc class MySwiftClass: NSObject {

   //...

   @objc static func myMethod() {
        // do something...
    }
}

I hope this helped !

Upvotes: 3

Related Questions