Welcome to inneractive

An Open Letter to Ansca and Inneractive.

I have been for the most part happy with Inneractive as a provider. I started out with great fill rates and while my games are not that popular and near the end of their shelf life, the few pennies I make a day are much better than I ever got with inMobi.

I have been very happy that inneractive has Orly here to support us. Its good for a vendor to take that kind of responsibility with their customer base. Following Orly’s advice I’m in the process of shifting away from banner ads to full screen ads.

But there is a major problem. Inneractive’s “Skip” only works occasionally. I cannot release an app that leaves players and users stuck on the ad.

Thankfully KenRogoway came up with a nifty go between, but it does not work with Storyboard. It works with Director, but I see no ads on Storyboard. I see the ads tally up at inneractive from it, but nothing on my display.

Inneractive was supposed to help make our revenue better, but it can’t if we can’t use it.

In addition, inneractive’s fill rates have plummeted to inmobi levels and doesn’t seem to be a viable solution.

Please address this with some expedience.

Thank you.
Rob Miracle
[import]uid: 19626 topic_id: 19981 reply_id: 83060[/import]

+10000 to what robmiracle said.

Ansca has been very busy integrating some great new features like Game Center support and native media and web display objects, and that’s going to provide tools for users to make awesome apps with.

For most of us, ads are how our apps are supported. The bottom line is that if we don’t have a solid, reliable way of maintaining control over how ads are presented in our apps then there is NO way that Corona will continue to be used for professional or indie development outside of well funded studios or contracted work. Even for those with substantial enough games and apps who can charge $0.99, $1.99, or more, free ad-enabled versions are a crucial marketing strategy. On Android, where users are used to free stuff, ads are practically the only way to generate any money.
[import]uid: 120 topic_id: 19981 reply_id: 83061[/import]

@robmiracle,

I’ll see if I can modify my cInneractive module to work with Storyboard.

I totally agree with your “Open Letter to Ansca”.

I know Ansca is very busy adding a lot of cool features, as seen in the daily build notes and Jonathan Beebe’s blogs. However, the support for Inneractive has languished over the past month; both from Ansca and from Inneractive.

Ken [import]uid: 16734 topic_id: 19981 reply_id: 83062[/import]

@robmiracle,

The version below works with storyboards

Ken

[lua]---------------------------------------------------------------------------------------
– Inneractive wrapper class

– File name: cInneractive.lua

– Usage:
– inneractive = require(“cInneractive”)
– APP_ID = “MY_Inneractive_App_ID” – use your app id here
– inneractive.Init( APP_ID )
– inneractive.Show() – no parameters required, will call Hide in 5 seconds
– or:
– inneractive.Show{
– cnt_text=“You can skip in”,
– skip_time=10,
– skip_text=“Tap to skip Advertisments”
– }

– If you have called Show(), but need to explicitly close the ad, you can do this to
– clean everything up:

– inneractive.Hide()


module(…, package.seeall)

local ads = require “ads”

local isSimulator = system.getInfo( “environment” ) == “simulator”
local fontScaleX = display.contentWidth/1024
local fontScaleY = display.contentHeight/768
– Objects needed here for cleanup
local adInfo = {}

– Forward references
local adSkipListener, adSkipGobbler
local adCallback

local banner_width, banner_height

function testNetworkConnection()
local netConn = require(‘socket’).connect(‘www.apple.com’, 80)
if netConn == nil then
return false
end
netConn:close()
return true
end

– *******************************************************************************************
– Init()

– Initialize the Ad system
– Parameters:
– appId Your Inneractive app ID
– onAdDisplayed Event callback called when
– ad is displayed
– *******************************************************************************************
function Init( appId, onAdDisplayed )
if ( isSimulator ) then
adInfo.theAdShowCallback = onAdDisplayed
print( “ads.init() cannot be called in the simulator” )
else
adInfo.theAdShowCallback = nil – Use their callback via the ads system
ads.init( “inneractive”, appId, onAdDisplayed )
end

– These banner sizes are from Inneractive for the iPhone/iPad. If
– you have different devices you can add a check based on sysModel
if ( display.contentWidth > 480 ) then
banner_width = 766
banner_height = 66
else
banner_width = 320
banner_height = 53
end

end

– *******************************************************************************************
– Hide()

– Removes the ad and all of the display objects we created for the ad.
– *******************************************************************************************
function Hide()
if ( isSimulator ) then
print( “ads.hide() cannot be called in the simulator” )
else
– Hide the ad
ads.hide()
end

if ( adInfo.timer ) then
timer.cancel( adInfo.timer )
adInfo.timer = nil
end

– Now cleanup our objects
if ( adInfo.text ) then
– We don’t really need to do this here since the group remove will handle it, but
– since we are already cleaning up the event listeners we might as well remove it.
adInfo.text:removeSelf()
adInfo.text = nil
end
if ( adInfo.backImage ) then
adInfo.backImage:removeEventListener( “tap”, adSkipListener )
adInfo.backImage:removeEventListener( “touch”, adSkipListener )
– We don’t really need to do this here since the group remove will handle it, but
– since we are already cleaning up the event listeners we might as well remove it.
adInfo.backImage:removeSelf()
adInfo.backImage = nil
end

if ( adInfo.group ) then
adInfo.group:removeSelf()
adInfo.group = nil
end

– if callback exists then call it
if ( adCallback ~= nil ) then
adCallback()
adCallback = nil
end

end

– local function to gobble all tap/touch events for the background
function adSkipListener( event )
if ( adInfo.skip_time == 0 ) then
timer.performWithDelay( 50, Hide, 1 )
end
return true
end

– local function to display the default ad
local function displayDefaultAd( adFilename, x, y, width, height )
if ( adFilename ~= nil ) then
local adImage = display.newImageRect( adFilename, width, height )
adImage:setReferencePoint( display.TopLeftReferencePoint )
adImage.x = x
adImage.y = y
adInfo.group:insert( adImage )
end
end

– *******************************************************************************************
– Show( params )

– Parameters:
– params.x [Optional] background x position (Default is 0)
– params.y [Optional] background y position (Default is 0)
– params.w [Optional] background width (Default is display.contentWidth)
– params.h [Optional] background height (Default is display.contentHeight)
– params.color [Optional] background color (Default is { 255,255,255,255 } )
– params.interval [Optional] interval to refresh ads (Default is 60)
– params.skip_text [Optional] Text to show user they can skip the ad (Default is “Tap to Skip”)
– params.skip_font [Optional] Font used for skip_text (Default is native.systemFont)
– params.skip_time [Optional] Time (in seconds) before the Skip is active (Default is 5)
– params.cnt_text [Optional] Text to show user during the countdown (Default is “Skip in”)
– params.callback [Optional] Callback function that gets called once skip_text is pressed (Default is nil)
– params.default_ad [Optional] Ad to use when no network connection is found (Default is nil)

– NOTES:
– If params.skip_time is 0 then the skip_text will be used as is. However, if
– skip_time is > 0 then the seconds remaining will be appending to the cnt_text
– *******************************************************************************************
function Show( params )
– we have no required parameters so we need to handle passing in nothing
if ( params == nil ) then
params = {}
end

local back_x = params.x or 0
local back_y = params.y or 0
local back_w = params.w or display.contentWidth
local back_h = params.h or display.contentHeight
local ad_interval = params.interval or 60
local cnt_text = params.cnt_text or “Skip in”
local skip_text = params.skip_text or “Tap to Skip”
local skip_font = params.skip_font or native.systemFont
local skip_time = params.skip_time or 5
local back_color = { 255, 255, 255, 255 }
adCallback = params.callback or nil
local default_ad = params.default_ad or nil

if ( params.color ) then
for i=1,#params.color do
back_color[i] = params.color[i]
end
end

– our group to draw to
adInfo.group = display.newGroup()

– save off values we will need later
adInfo.cnt_text = cnt_text
adInfo.skip_text = skip_text
adInfo.skip_time = skip_time
adInfo.timer = nil

– Center the ad in the background rect
local ad_x = back_x + math.round( 0.5*( back_w - banner_width ) )
local ad_y = back_y + math.round( 0.5*( back_h - banner_height ) )

adInfo.backImage = display.newRect( back_x, back_y, back_w, back_h )
adInfo.backImage:setFillColor( back_color[1], back_color[2], back_color[3], back_color[4] )

adInfo.group:insert( adInfo.backImage )
adInfo.backImage:addEventListener( “tap”, adSkipListener )
adInfo.backImage:addEventListener( “touch”, adSkipListener )

if ( isSimulator ) then
if ( default_ad == nil ) then
– These will get cleaned up when the adInfo.group is cleaned up
local dummy_ad = display.newRoundedRect( 0, 0, banner_width, banner_height, 8 )
dummy_ad:setFillColor( 0, 0, 0 )
dummy_ad:setReferencePoint( display.TopLeftReferencePoint )
dummy_ad.x = ad_x
dummy_ad.y = ad_y
adInfo.group:insert( dummy_ad )

local dummy_text = display.newText( “Dummy Ad”, 0, 0, native.systemFont, math.round( 32*fontScaleY ) )
dummy_text:setTextColor( 255, 255, 255 )
dummy_text:setReferencePoint( display.CenterReferencePoint )
dummy_text.x = display.contentCenterX
dummy_text.y = display.contentCenterY
adInfo.group:insert( dummy_text )
else
displayDefaultAd( default_ad, ad_x, ad_y, banner_width, banner_height )
end
end

local textToUse
if ( skip_time > 0 ) then
textToUse = string.format( “%s %d”, cnt_text, skip_time )
else
textToUse = skip_text
end

adInfo.text = display.newText( textToUse, 0, 0, skip_font, math.round( 32*fontScaleY ) )
adInfo.text:setTextColor( 0, 0, 0 )
adInfo.text:setReferencePoint( display.BottomCenterReferencePoint )
adInfo.text.x = display.contentCenterX
adInfo.text.y = display.contentHeight - 4

adInfo.group:insert( adInfo.text )

if ( isSimulator ) then
print( “ads.show() not supported in the simulator” )
if ( theAdShowCallback ) then
– Since we aren’t using the actual ad system,
– so fake it with a callback
theAdShowCallback()
end
else
– if network then display ad else display default ad (if supplied)
if ( testNetworkConnection() ) then
ads.show( “banner”, { x=ad_x, y=ad_y, interval=ad_interval } )
else
displayDefaultAd( default_ad, ad_x, ad_y, banner_width, banner_height )
end
end

local function updateText( event )
adInfo.skip_time = adInfo.skip_time - 1
if ( adInfo.skip_time > 0 ) then
adInfo.text.text = string.format( “%s %d”, adInfo.cnt_text, adInfo.skip_time )
else
adInfo.text.text = adInfo.skip_text
end
end

if ( skip_time > 0 ) then
– Since we are using skip_time in seconds, that means we can use
– skip_time for the number of times to perform this timer event
adInfo.timer = timer.performWithDelay( 1000, updateText, skip_time )
end
end

– *******************************************************************************************
– ShowBanner( params )

– Parameters:
– params.x [Optional] background x position (Default is 0)
– params.y [Optional] background y position (Default is 0)
– params.interval [Optional] interval to refresh ads (Default is 60)
– params.default_ad [Optional] Ad to use when no network connection is found (Default is nil)

– *******************************************************************************************
function ShowBanner( params )
local adX = params.x or 0
local adY = params.y or 0
local adInterval = params.interval or 60
local default_ad = params.default_ad or nil

– our group to draw to
adInfo.group = display.newGroup()

if ( isSimulator ) then
print( “ads.show() cannot be called in the simulator” )
if ( default_ad ~= nil ) then
displayDefaultAd( default_ad, adX, adY, banner_width, banner_height )
end
else
– if network then display ad else display default ad (if supplied)
if ( testNetworkConnection() ) then
ads.show( “banner”, { x=adX, y=adY, interval=adInterval } )
else
displayDefaultAd( default_ad, adX, adY, banner_width, banner_height )
end
end
end[/lua] [import]uid: 16734 topic_id: 19981 reply_id: 83064[/import]

Putting the code in now…

[import]uid: 19626 topic_id: 19981 reply_id: 83066[/import]

Putting the code in now…

EDIT:

I still just get a white screen.
[import]uid: 19626 topic_id: 19981 reply_id: 83067[/import]

@robmiracle,

What does your call to Show() look like (parameters?)

Mine looks like this:

[lua] IA = require( “cInneractive” )

function scene:enterScene( event )
IA.Show()
end[/lua] [import]uid: 16734 topic_id: 19981 reply_id: 83068[/import]

group:insert(inneractive.Show(“fullscreen”, {x = 0, y = 0, interval=30}))

or

inneractive.Show(“fullscreen”, {x = 0, y = 0, interval=30})

depending on if I’m monkeying around with trying to return a display group to insert into storyboard’s “group”

I was going to try leaving the params off next.
EDIT: changed it to:

inneractive.Show()

still white screened.
[import]uid: 19626 topic_id: 19981 reply_id: 83069[/import]

@robmiracle,

The Show() function does NOT return a display option. It just displays a FULL screen ad.

Also, the Show() function does NOT have any parameter to specify “fullscreen” or “banner”. If you want fullscreen ads you call Show() with whatever parameters.

If you want a banner ad you call ShowBanner() with whatever parameters you want.

[edit] is your “inneractive” variable set like this:

inneractive = require( “cInneractive” )

And is your call to Show() the last thing in your enterScene() function? [import]uid: 16734 topic_id: 19981 reply_id: 83070[/import]

i renamed the library to inneractive.lua so I’m

inneractive = require(“inneractive”)

This stuff works in my director based game…

my entire enterScene:

function scene:enterScene( event )  
 local group = self.view  
  
 -- assign touch event to background to monitor page swiping  
 background.touch = onPageSwipe  
 background:addEventListener( "touch", background )  
 storyboard.pageViews = storyboard.pageViews + 1  
 print("pageviews", storyboard.pageViews)  
 if (storyboard.pageViews % storyboard.showAfter) == 0 then  
 inneractive.Show()  
 end  
end  

I know your Show function did not return a display object, but I’ve seen Storyboard hide things behind its “group” before. So I was experimenting with getting your display group returned, but it didn’t work.

EDIT: renamed to cinneractive.lua, no change.
[import]uid: 19626 topic_id: 19981 reply_id: 83071[/import]

@rob,

Can you try this:

[lua]function scene:enterScene( event )
local group = self.view

– assign touch event to background to monitor page swiping
background.touch = onPageSwipe
background:addEventListener( “touch”, background )
storyboard.pageViews = storyboard.pageViews + 1
print(“pageviews”, storyboard.pageViews)
inneractive.Show()
end[/lua]

I just want to make sure it is actually calling my Show() function.

[edit] What happens if you run it in the simulator? You won’t get real ads, but I have code to show dummy ads. Just want to make sure you can see the text when it is running in the simulator. [import]uid: 16734 topic_id: 19981 reply_id: 83073[/import]

 if (storyboard.pageViews % storyboard.showAfter) == 0 then  
 inneractive.Show()  
 end  

That block of code is to make sure I only get ads every X number of screens.

In the simulator, I get your fake ad and I get the count down timer and then a Tap to Continue . On device I get the count down timer and the Tap to continue. In face here are screen shots:

and


I’ll try your suggestion though I’m very certain your Show call s being called. I just don’t see any ads. I see them register at inneractive though.

[import]uid: 19626 topic_id: 19981 reply_id: 83236[/import]

@robmiracle,

Yes, I knew it was to display them every ‘n’ frames, but you said you didn’t see anything other than a white screen. You didn’t say you were getting my count down, or the Tap to Continue.

Luciane had a similar issue where it ran, but she never saw ads on the device. Below is what her issue was, but that doesn’t mean it is your issue. Just trying to narrow things down.


“Problem solved. Thank you all who tried to help.
I knew it would be something silly in the end. The computer used to do the build had not been upgraded to the version of Corona that supports inneractive.”

I suspect you are not connected via wifi, or there is some lag pulling the ad image down. You can easily determine if it is a network issue, by adding your own “default” ad. If the network test fails, it will display the image you provide instead. This is useful for debugging the network issues. [import]uid: 16734 topic_id: 19981 reply_id: 83243[/import]

I’m running build 726. I’m about 3 daily’s behind.

If I call ad.show() directly I get inneractive’s ads, just the skip doesn’t work most of the time.

I’m on WiFi.

[import]uid: 19626 topic_id: 19981 reply_id: 83246[/import]

@robmiracle,

Can you make a minimal app that shows this and send it to me? I’ll debug it and figure out why it doesn’t work for your situation.

Ken@HomebrewSoftware.com [import]uid: 16734 topic_id: 19981 reply_id: 83248[/import]

Sample project inbound. [import]uid: 19626 topic_id: 19981 reply_id: 83254[/import]

For people following this thread, Rob’s sample worked here. I am working with him to figure out what may be different about his set up. [import]uid: 16734 topic_id: 19981 reply_id: 83260[/import]

Thanks for sorting this all out KenRogoway…

Just a quick note: I was getting hide() called 3 times when I tapped the screen, once I was able to skip. I just removed the line adInfo.backImage:addEventListener( “touch”, adSkipListener ) as below…

  
 adInfo.backImage:addEventListener( "tap", adSkipListener )  
 --adInfo.backImage:addEventListener( "touch", adSkipListener )  
  

… and now it seems to be working correctly.
Have I done something wrong here KenRogoway? [import]uid: 58388 topic_id: 19981 reply_id: 83292[/import]

Hey Rob and everyone,

I am hearing you load and clear and though I may not be responding to every thread here right away - I read all of them and pass the issues to our support team.
Let me address some of your concerns:

  1. Fill rate - as you may know January is always the lowest month in the year for advertising and marketing. As all the advertising budget was spent in 2011 for all the companies - January is the month when companies work on new advertising and marketing budget and running very little campaigns. Hence the fill rate every where has dropped. In February and on - you will be able to see the regular fill rates that we usually offer and great blitz campaigns with high CPC.

  2. It is great to see how the community here is helping one another and I believe that this is the asset of Corona. However, in order to assist you better with tech/support issues PLEASE email them to me orly[at]inner-active[dot]com.
    This way - I have control over the bugs/issues and their status.

  3. Black bars on Android apps - we have been looking into this issue for a while. There is an ad-network for Android that is not sending us the banners in the correct size and we are working to resolve their integration with us.

This forum is great and we learn a lot and keep getting better. We all want to supply you guys with the best ads and high FR and eCPM and we can do this with your help.

Notify me when you see adult content (with exact specifics like device, time, IP, URL). Let me know of bugs and issues during the integration and I can assure you that I will do the best to assist you all :slight_smile:

Thank you for the understanding
Orly
[import]uid: 109623 topic_id: 19981 reply_id: 83313[/import]

@hudson,

It’s fine to take that out. I was just making sure to catch both tap and touch events in case you had something behind the full screen ad background that also listened for touch events. [import]uid: 16734 topic_id: 19981 reply_id: 83367[/import]