Latest commit

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rapns Build Status

Easy to use library for Apple's Push Notification Service with Rails 3.

Features

  • Works with Rails 3 and Ruby 1.9.
  • Uses a daemon process to keep open a persistent connection to the Push Notification Service, as recommended by Apple.
  • Uses the enhanced binary format (Figure 5-2) so that delivery errors can be reported.
  • Airbrake (Hoptoad) integration.
  • Support for dictionary alert properties (Table 3-2).

Getting Started

Add rapns to your Gemfile:

gem 'rapns'

Generate the migration, rapns.yml and migrate:

rails g rapns
rake db:migrate

Generating Certificates

  1. Open up Keychain Access and select the Certificates category in the sidebar.

  2. Expand the disclosure arrow next to the iOS Push Services certificate you want to export.

  3. Select both the certificate and private key.

  4. Right click and select Export 2 items....

  5. Save the file as cert.p12, make sure the File Format is Personal Information Exchange (p12).

  6. If you decide to set a password for your exported certificate, please read the Configuration section below.

  7. Convert the certificate to a .pem, where <environment> should be development or production, depending on the certificate you exported.

    openssl pkcs12 -nodes -clcerts -in cert.p12 -out <environment>.pem

  8. Move the .pem file into your Rails application under config/rapns.

Configuration

Environment configuration lives in config/rapns/rapns.yml. For common setups you probably wont need to change this file.

If you want to use rapns in environments other than development or production, you will need to create an entry for it. Simply duplicate the configuration for development or production, depending on which iOS Push Certificate you wish to use.

Options:

  • host the APNs host to connect to, either gateway.sandbox.push.apple.com or gateway.sandbox.push.apple.com.
  • port the APNs port. Currently 2195 for both hosts.
  • certificate The path to your .pem certificate, config/rapns is automatically checked if a relative path is given.
  • certificate_password (default: blank) the password you used when exporting your certificate, if any.
  • airbrake_notify (default: true) Enables/disables error notifications via Airbrake.
  • poll (default: 2) Frequency in seconds to check for new notifications to deliver.
  • connections (default: 3) the number of connections to keep open to the APNs. Consider increasing this if you are sending a very large number of notifications.
  • pid_file (default: blank) the file that rapns will write its process ID to. Paths are relative to your project's RAILS_ROOT unless an absolute path is given.

Starting the rapns Daemon

cd /path/to/rails/app
bundle exec rapns <Rails environment>

Options

  • --foreground will prevent rapns from forking into a daemon.

Logging

rapns logs activity to rapns.log in your Rails log directory. This is also printed to STDOUT when running in the foreground. When running as a daemon rapns does not print to STDOUT or STDERR.

Sending a Notification

n = Rapns::Notification.new
n.device_token = "934f7a..."
n.alert = "This is the message shown on the device."
n.badge = 1
n.sound = "1.aiff"
n.expiry = 1.day.to_i
n.attributes_for_device = {"question" => nil, "answer" => 42}
n.deliver_after = 1.hour.from_now
n.save!
  • sound defaults to 1.aiff. You can either set it to a custom .aiff file, or nil for no sound.
  • expiry is the time in seconds the APNs (not rapns) will spend trying to deliver the notification to the device. The notification is discarded if it has not been delivered in this time. Default is 1 day.
  • attributes_for_device is the NSDictionary argument passed to your iOS app in either didFinishLaunchingWithOptions or didReceiveRemoteNotification.
  • deliver_after is not required, but may be set if you'd like to delay delivery of the notification to a specific time in the future.

Assigning a Hash to alert

Please refer to Apple's documentation (Tables 3-1 and 3-2).

Not yet implemented!

Delivery Failures

The APN service provides two mechanism for delivery failure notification:

Immediately, when processing a notification for delivery.

Although rapns makes such errors highly unlikely due to validation, the APNs reports processing errors immediately after being sent a notification. These errors are all centred around the well-formedness of the notification payload. Should a notification be rejected due to such an error, rapns will update the following attributes on the notification and send a notification via Airbrake/Hoptoad (if enabled):

failed flag is set to true. failed_at is set to the time of failure. error is set to Apple's code for the error. error_description is set to a (somewhat brief) description of the error.

rapns will not attempt to deliver the notification again.

Via the Feedback Service.

Not implemented yet!

Contributing to rapns

Fork as usual and go crazy!

Contributors

Thank you to the following wonderful people for contributing to rapns:

About

Easy to use library for Apple's Push Notification Service with Rails 3

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rapns Build Status

Easy to use library for Apple's Push Notification Service with Rails 3.

Features

  • Works with Rails 3 and Ruby 1.9.
  • Uses a daemon process to keep open a persistent connection to the Push Notification Service, as recommended by Apple.
  • Uses the enhanced binary format (Figure 5-2) so that delivery errors can be reported.
  • Airbrake (Hoptoad) integration.
  • Support for dictionary alert properties (Table 3-2).

Getting Started

Add rapns to your Gemfile:

gem 'rapns'

Generate the migration, rapns.yml and migrate:

rails g rapns
rake db:migrate

Generating Certificates

  1. Open up Keychain Access and select the Certificates category in the sidebar.

  2. Expand the disclosure arrow next to the iOS Push Services certificate you want to export.

  3. Select both the certificate and private key.

  4. Right click and select Export 2 items....

  5. Save the file as cert.p12, make sure the File Format is Personal Information Exchange (p12).

  6. If you decide to set a password for your exported certificate, please read the Configuration section below.

  7. Convert the certificate to a .pem, where <environment> should be development or production, depending on the certificate you exported.

    openssl pkcs12 -nodes -clcerts -in cert.p12 -out <environment>.pem

  8. Move the .pem file into your Rails application under config/rapns.

Configuration

Environment configuration lives in config/rapns/rapns.yml. For common setups you probably wont need to change this file.

If you want to use rapns in environments other than development or production, you will need to create an entry for it. Simply duplicate the configuration for development or production, depending on which iOS Push Certificate you wish to use.

Options:

  • host the APNs host to connect to, either gateway.sandbox.push.apple.com or gateway.sandbox.push.apple.com.
  • port the APNs port. Currently 2195 for both hosts.
  • certificate The path to your .pem certificate, config/rapns is automatically checked if a relative path is given.
  • certificate_password (default: blank) the password you used when exporting your certificate, if any.
  • airbrake_notify (default: true) Enables/disables error notifications via Airbrake.
  • poll (default: 2) Frequency in seconds to check for new notifications to deliver.
  • connections (default: 3) the number of connections to keep open to the APNs. Consider increasing this if you are sending a very large number of notifications.
  • pid_file (default: blank) the file that rapns will write its process ID to. Paths are relative to your project's RAILS_ROOT unless an absolute path is given.

Starting the rapns Daemon

cd /path/to/rails/app
bundle exec rapns <Rails environment>

Options

  • --foreground will prevent rapns from forking into a daemon.

Logging

rapns logs activity to rapns.log in your Rails log directory. This is also printed to STDOUT when running in the foreground. When running as a daemon rapns does not print to STDOUT or STDERR.

Sending a Notification

n = Rapns::Notification.new
n.device_token = "934f7a..."
n.alert = "This is the message shown on the device."
n.badge = 1
n.sound = "1.aiff"
n.expiry = 1.day.to_i
n.attributes_for_device = {"question" => nil, "answer" => 42}
n.deliver_after = 1.hour.from_now
n.save!
  • sound defaults to 1.aiff. You can either set it to a custom .aiff file, or nil for no sound.
  • expiry is the time in seconds the APNs (not rapns) will spend trying to deliver the notification to the device. The notification is discarded if it has not been delivered in this time. Default is 1 day.
  • attributes_for_device is the NSDictionary argument passed to your iOS app in either didFinishLaunchingWithOptions or didReceiveRemoteNotification.
  • deliver_after is not required, but may be set if you'd like to delay delivery of the notification to a specific time in the future.

Assigning a Hash to alert

Please refer to Apple's documentation (Tables 3-1 and 3-2).

Not yet implemented!

Delivery Failures

The APN service provides two mechanism for delivery failure notification:

Immediately, when processing a notification for delivery.

Although rapns makes such errors highly unlikely due to validation, the APNs reports processing errors immediately after being sent a notification. These errors are all centred around the well-formedness of the notification payload. Should a notification be rejected due to such an error, rapns will update the following attributes on the notification and send a notification via Airbrake/Hoptoad (if enabled):

failed flag is set to true. failed_at is set to the time of failure. error is set to Apple's code for the error. error_description is set to a (somewhat brief) description of the error.

rapns will not attempt to deliver the notification again.

Via the Feedback Service.

Not implemented yet!

Contributing to rapns

Fork as usual and go crazy!

Contributors

Thank you to the following wonderful people for contributing to rapns:

About

Easy to use library for Apple's Push Notification Service with Rails 3

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rapns Build Status

Easy to use library for Apple's Push Notification Service with Rails 3.

Features

  • Works with Rails 3 and Ruby 1.9.
  • Uses a daemon process to keep open a persistent connection to the Push Notification Service, as recommended by Apple.
  • Uses the enhanced binary format (Figure 5-2) so that delivery errors can be reported.
  • Airbrake (Hoptoad) integration.
  • Support for dictionary alert properties (Table 3-2).

Getting Started

Add rapns to your Gemfile:

gem 'rapns'

Generate the migration, rapns.yml and migrate:

rails g rapns
rake db:migrate

Generating Certificates

  1. Open up Keychain Access and select the Certificates category in the sidebar.

  2. Expand the disclosure arrow next to the iOS Push Services certificate you want to export.

  3. Select both the certificate and private key.

  4. Right click and select Export 2 items....

  5. Save the file as cert.p12, make sure the File Format is Personal Information Exchange (p12).

  6. If you decide to set a password for your exported certificate, please read the Configuration section below.

  7. Convert the certificate to a .pem, where <environment> should be development or production, depending on the certificate you exported.

    openssl pkcs12 -nodes -clcerts -in cert.p12 -out <environment>.pem

  8. Move the .pem file into your Rails application under config/rapns.

Configuration

Environment configuration lives in config/rapns/rapns.yml. For common setups you probably wont need to change this file.

If you want to use rapns in environments other than development or production, you will need to create an entry for it. Simply duplicate the configuration for development or production, depending on which iOS Push Certificate you wish to use.

Options:

  • host the APNs host to connect to, either gateway.sandbox.push.apple.com or gateway.sandbox.push.apple.com.
  • port the APNs port. Currently 2195 for both hosts.
  • certificate The path to your .pem certificate, config/rapns is automatically checked if a relative path is given.
  • certificate_password (default: blank) the password you used when exporting your certificate, if any.
  • airbrake_notify (default: true) Enables/disables error notifications via Airbrake.
  • poll (default: 2) Frequency in seconds to check for new notifications to deliver.
  • connections (default: 3) the number of connections to keep open to the APNs. Consider increasing this if you are sending a very large number of notifications.
  • pid_file (default: blank) the file that rapns will write its process ID to. Paths are relative to your project's RAILS_ROOT unless an absolute path is given.

Starting the rapns Daemon

cd /path/to/rails/app
bundle exec rapns <Rails environment>

Options

  • --foreground will prevent rapns from forking into a daemon.

Logging

rapns logs activity to rapns.log in your Rails log directory. This is also printed to STDOUT when running in the foreground. When running as a daemon rapns does not print to STDOUT or STDERR.

Sending a Notification

n = Rapns::Notification.new
n.device_token = "934f7a..."
n.alert = "This is the message shown on the device."
n.badge = 1
n.sound = "1.aiff"
n.expiry = 1.day.to_i
n.attributes_for_device = {"question" => nil, "answer" => 42}
n.deliver_after = 1.hour.from_now
n.save!
  • sound defaults to 1.aiff. You can either set it to a custom .aiff file, or nil for no sound.
  • expiry is the time in seconds the APNs (not rapns) will spend trying to deliver the notification to the device. The notification is discarded if it has not been delivered in this time. Default is 1 day.
  • attributes_for_device is the NSDictionary argument passed to your iOS app in either didFinishLaunchingWithOptions or didReceiveRemoteNotification.
  • deliver_after is not required, but may be set if you'd like to delay delivery of the notification to a specific time in the future.

Assigning a Hash to alert

Please refer to Apple's documentation (Tables 3-1 and 3-2).

Not yet implemented!

Delivery Failures

The APN service provides two mechanism for delivery failure notification:

Immediately, when processing a notification for delivery.

Although rapns makes such errors highly unlikely due to validation, the APNs reports processing errors immediately after being sent a notification. These errors are all centred around the well-formedness of the notification payload. Should a notification be rejected due to such an error, rapns will update the following attributes on the notification and send a notification via Airbrake/Hoptoad (if enabled):

failed flag is set to true. failed_at is set to the time of failure. error is set to Apple's code for the error. error_description is set to a (somewhat brief) description of the error.

rapns will not attempt to deliver the notification again.

Via the Feedback Service.

Not implemented yet!

Contributing to rapns

Fork as usual and go crazy!

Contributors

Thank you to the following wonderful people for contributing to rapns:

About

Easy to use library for Apple's Push Notification Service with Rails 3

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rapns Build Status

Easy to use library for Apple's Push Notification Service with Rails 3.

Features

  • Works with Rails 3 and Ruby 1.9.
  • Uses a daemon process to keep open a persistent connection to the Push Notification Service, as recommended by Apple.
  • Uses the enhanced binary format (Figure 5-2) so that delivery errors can be reported.
  • Airbrake (Hoptoad) integration.
  • Support for dictionary alert properties (Table 3-2).

Getting Started

Add rapns to your Gemfile:

gem 'rapns'

Generate the migration, rapns.yml and migrate:

rails g rapns
rake db:migrate

Generating Certificates

  1. Open up Keychain Access and select the Certificates category in the sidebar.

  2. Expand the disclosure arrow next to the iOS Push Services certificate you want to export.

  3. Select both the certificate and private key.

  4. Right click and select Export 2 items....

  5. Save the file as cert.p12, make sure the File Format is Personal Information Exchange (p12).

  6. If you decide to set a password for your exported certificate, please read the Configuration section below.

  7. Convert the certificate to a .pem, where <environment> should be development or production, depending on the certificate you exported.

    openssl pkcs12 -nodes -clcerts -in cert.p12 -out <environment>.pem

  8. Move the .pem file into your Rails application under config/rapns.

Configuration

Environment configuration lives in config/rapns/rapns.yml. For common setups you probably wont need to change this file.

If you want to use rapns in environments other than development or production, you will need to create an entry for it. Simply duplicate the configuration for development or production, depending on which iOS Push Certificate you wish to use.

Options:

  • host the APNs host to connect to, either gateway.sandbox.push.apple.com or gateway.sandbox.push.apple.com.
  • port the APNs port. Currently 2195 for both hosts.
  • certificate The path to your .pem certificate, config/rapns is automatically checked if a relative path is given.
  • certificate_password (default: blank) the password you used when exporting your certificate, if any.
  • airbrake_notify (default: true) Enables/disables error notifications via Airbrake.
  • poll (default: 2) Frequency in seconds to check for new notifications to deliver.
  • connections (default: 3) the number of connections to keep open to the APNs. Consider increasing this if you are sending a very large number of notifications.
  • pid_file (default: blank) the file that rapns will write its process ID to. Paths are relative to your project's RAILS_ROOT unless an absolute path is given.

Starting the rapns Daemon

cd /path/to/rails/app
bundle exec rapns <Rails environment>

Options

  • --foreground will prevent rapns from forking into a daemon.

Logging

rapns logs activity to rapns.log in your Rails log directory. This is also printed to STDOUT when running in the foreground. When running as a daemon rapns does not print to STDOUT or STDERR.

Sending a Notification

n = Rapns::Notification.new
n.device_token = "934f7a..."
n.alert = "This is the message shown on the device."
n.badge = 1
n.sound = "1.aiff"
n.expiry = 1.day.to_i
n.attributes_for_device = {"question" => nil, "answer" => 42}
n.deliver_after = 1.hour.from_now
n.save!
  • sound defaults to 1.aiff. You can either set it to a custom .aiff file, or nil for no sound.
  • expiry is the time in seconds the APNs (not rapns) will spend trying to deliver the notification to the device. The notification is discarded if it has not been delivered in this time. Default is 1 day.
  • attributes_for_device is the NSDictionary argument passed to your iOS app in either didFinishLaunchingWithOptions or didReceiveRemoteNotification.
  • deliver_after is not required, but may be set if you'd like to delay delivery of the notification to a specific time in the future.

Assigning a Hash to alert

Please refer to Apple's documentation (Tables 3-1 and 3-2).

Not yet implemented!

Delivery Failures

The APN service provides two mechanism for delivery failure notification:

Immediately, when processing a notification for delivery.

Although rapns makes such errors highly unlikely due to validation, the APNs reports processing errors immediately after being sent a notification. These errors are all centred around the well-formedness of the notification payload. Should a notification be rejected due to such an error, rapns will update the following attributes on the notification and send a notification via Airbrake/Hoptoad (if enabled):

failed flag is set to true. failed_at is set to the time of failure. error is set to Apple's code for the error. error_description is set to a (somewhat brief) description of the error.

rapns will not attempt to deliver the notification again.

Via the Feedback Service.

Not implemented yet!

Contributing to rapns

Fork as usual and go crazy!

Contributors

Thank you to the following wonderful people for contributing to rapns:

About

Easy to use library for Apple's Push Notification Service with Rails 3

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rapns Build Status

Easy to use library for Apple's Push Notification Service with Rails 3.

Features

  • Works with Rails 3 and Ruby 1.9.
  • Uses a daemon process to keep open a persistent connection to the Push Notification Service, as recommended by Apple.
  • Uses the enhanced binary format (Figure 5-2) so that delivery errors can be reported.
  • Airbrake (Hoptoad) integration.
  • Support for dictionary alert properties (Table 3-2).

Getting Started

Add rapns to your Gemfile:

gem 'rapns'

Generate the migration, rapns.yml and migrate:

rails g rapns
rake db:migrate

Generating Certificates

  1. Open up Keychain Access and select the Certificates category in the sidebar.

  2. Expand the disclosure arrow next to the iOS Push Services certificate you want to export.

  3. Select both the certificate and private key.

  4. Right click and select Export 2 items....

  5. Save the file as cert.p12, make sure the File Format is Personal Information Exchange (p12).

  6. If you decide to set a password for your exported certificate, please read the Configuration section below.

  7. Convert the certificate to a .pem, where <environment> should be development or production, depending on the certificate you exported.

    openssl pkcs12 -nodes -clcerts -in cert.p12 -out <environment>.pem

  8. Move the .pem file into your Rails application under config/rapns.

Configuration

Environment configuration lives in config/rapns/rapns.yml. For common setups you probably wont need to change this file.

If you want to use rapns in environments other than development or production, you will need to create an entry for it. Simply duplicate the configuration for development or production, depending on which iOS Push Certificate you wish to use.

Options:

  • host the APNs host to connect to, either gateway.sandbox.push.apple.com or gateway.sandbox.push.apple.com.
  • port the APNs port. Currently 2195 for both hosts.
  • certificate The path to your .pem certificate, config/rapns is automatically checked if a relative path is given.
  • certificate_password (default: blank) the password you used when exporting your certificate, if any.
  • airbrake_notify (default: true) Enables/disables error notifications via Airbrake.
  • poll (default: 2) Frequency in seconds to check for new notifications to deliver.
  • connections (default: 3) the number of connections to keep open to the APNs. Consider increasing this if you are sending a very large number of notifications.
  • pid_file (default: blank) the file that rapns will write its process ID to. Paths are relative to your project's RAILS_ROOT unless an absolute path is given.

Starting the rapns Daemon

cd /path/to/rails/app
bundle exec rapns <Rails environment>

Options

  • --foreground will prevent rapns from forking into a daemon.

Logging

rapns logs activity to rapns.log in your Rails log directory. This is also printed to STDOUT when running in the foreground. When running as a daemon rapns does not print to STDOUT or STDERR.

Sending a Notification

n = Rapns::Notification.new
n.device_token = "934f7a..."
n.alert = "This is the message shown on the device."
n.badge = 1
n.sound = "1.aiff"
n.expiry = 1.day.to_i
n.attributes_for_device = {"question" => nil, "answer" => 42}
n.deliver_after = 1.hour.from_now
n.save!
  • sound defaults to 1.aiff. You can either set it to a custom .aiff file, or nil for no sound.
  • expiry is the time in seconds the APNs (not rapns) will spend trying to deliver the notification to the device. The notification is discarded if it has not been delivered in this time. Default is 1 day.
  • attributes_for_device is the NSDictionary argument passed to your iOS app in either didFinishLaunchingWithOptions or didReceiveRemoteNotification.
  • deliver_after is not required, but may be set if you'd like to delay delivery of the notification to a specific time in the future.

Assigning a Hash to alert

Please refer to Apple's documentation (Tables 3-1 and 3-2).

Not yet implemented!

Delivery Failures

The APN service provides two mechanism for delivery failure notification:

Immediately, when processing a notification for delivery.

Although rapns makes such errors highly unlikely due to validation, the APNs reports processing errors immediately after being sent a notification. These errors are all centred around the well-formedness of the notification payload. Should a notification be rejected due to such an error, rapns will update the following attributes on the notification and send a notification via Airbrake/Hoptoad (if enabled):

failed flag is set to true. failed_at is set to the time of failure. error is set to Apple's code for the error. error_description is set to a (somewhat brief) description of the error.

rapns will not attempt to deliver the notification again.

Via the Feedback Service.

Not implemented yet!

Contributing to rapns

Fork as usual and go crazy!

Contributors

Thank you to the following wonderful people for contributing to rapns:

About

Easy to use library for Apple's Push Notification Service with Rails 3

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rapns Build Status

Easy to use library for Apple's Push Notification Service with Rails 3.

Features

  • Works with Rails 3 and Ruby 1.9.
  • Uses a daemon process to keep open a persistent connection to the Push Notification Service, as recommended by Apple.
  • Uses the enhanced binary format (Figure 5-2) so that delivery errors can be reported.
  • Airbrake (Hoptoad) integration.
  • Support for dictionary alert properties (Table 3-2).

Getting Started

Add rapns to your Gemfile:

gem 'rapns'

Generate the migration, rapns.yml and migrate:

rails g rapns
rake db:migrate

Generating Certificates

  1. Open up Keychain Access and select the Certificates category in the sidebar.

  2. Expand the disclosure arrow next to the iOS Push Services certificate you want to export.

  3. Select both the certificate and private key.

  4. Right click and select Export 2 items....

  5. Save the file as cert.p12, make sure the File Format is Personal Information Exchange (p12).

  6. If you decide to set a password for your exported certificate, please read the Configuration section below.

  7. Convert the certificate to a .pem, where <environment> should be development or production, depending on the certificate you exported.

    openssl pkcs12 -nodes -clcerts -in cert.p12 -out <environment>.pem

  8. Move the .pem file into your Rails application under config/rapns.

Configuration

Environment configuration lives in config/rapns/rapns.yml. For common setups you probably wont need to change this file.

If you want to use rapns in environments other than development or production, you will need to create an entry for it. Simply duplicate the configuration for development or production, depending on which iOS Push Certificate you wish to use.

Options:

  • host the APNs host to connect to, either gateway.sandbox.push.apple.com or gateway.sandbox.push.apple.com.
  • port the APNs port. Currently 2195 for both hosts.
  • certificate The path to your .pem certificate, config/rapns is automatically checked if a relative path is given.
  • certificate_password (default: blank) the password you used when exporting your certificate, if any.
  • airbrake_notify (default: true) Enables/disables error notifications via Airbrake.
  • poll (default: 2) Frequency in seconds to check for new notifications to deliver.
  • connections (default: 3) the number of connections to keep open to the APNs. Consider increasing this if you are sending a very large number of notifications.
  • pid_file (default: blank) the file that rapns will write its process ID to. Paths are relative to your project's RAILS_ROOT unless an absolute path is given.

Starting the rapns Daemon

cd /path/to/rails/app
bundle exec rapns <Rails environment>

Options

  • --foreground will prevent rapns from forking into a daemon.

Logging

rapns logs activity to rapns.log in your Rails log directory. This is also printed to STDOUT when running in the foreground. When running as a daemon rapns does not print to STDOUT or STDERR.

Sending a Notification

n = Rapns::Notification.new
n.device_token = "934f7a..."
n.alert = "This is the message shown on the device."
n.badge = 1
n.sound = "1.aiff"
n.expiry = 1.day.to_i
n.attributes_for_device = {"question" => nil, "answer" => 42}
n.deliver_after = 1.hour.from_now
n.save!
  • sound defaults to 1.aiff. You can either set it to a custom .aiff file, or nil for no sound.
  • expiry is the time in seconds the APNs (not rapns) will spend trying to deliver the notification to the device. The notification is discarded if it has not been delivered in this time. Default is 1 day.
  • attributes_for_device is the NSDictionary argument passed to your iOS app in either didFinishLaunchingWithOptions or didReceiveRemoteNotification.
  • deliver_after is not required, but may be set if you'd like to delay delivery of the notification to a specific time in the future.

Assigning a Hash to alert

Please refer to Apple's documentation (Tables 3-1 and 3-2).

Not yet implemented!

Delivery Failures

The APN service provides two mechanism for delivery failure notification:

Immediately, when processing a notification for delivery.

Although rapns makes such errors highly unlikely due to validation, the APNs reports processing errors immediately after being sent a notification. These errors are all centred around the well-formedness of the notification payload. Should a notification be rejected due to such an error, rapns will update the following attributes on the notification and send a notification via Airbrake/Hoptoad (if enabled):

failed flag is set to true. failed_at is set to the time of failure. error is set to Apple's code for the error. error_description is set to a (somewhat brief) description of the error.

rapns will not attempt to deliver the notification again.

Via the Feedback Service.

Not implemented yet!

Contributing to rapns

Fork as usual and go crazy!

Contributors

Thank you to the following wonderful people for contributing to rapns:

About

Easy to use library for Apple's Push Notification Service with Rails 3

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rapns Build Status

Easy to use library for Apple's Push Notification Service with Rails 3.

Features

  • Works with Rails 3 and Ruby 1.9.
  • Uses a daemon process to keep open a persistent connection to the Push Notification Service, as recommended by Apple.
  • Uses the enhanced binary format (Figure 5-2) so that delivery errors can be reported.
  • Airbrake (Hoptoad) integration.
  • Support for dictionary alert properties (Table 3-2).

Getting Started

Add rapns to your Gemfile:

gem 'rapns'

Generate the migration, rapns.yml and migrate:

rails g rapns
rake db:migrate

Generating Certificates

  1. Open up Keychain Access and select the Certificates category in the sidebar.

  2. Expand the disclosure arrow next to the iOS Push Services certificate you want to export.

  3. Select both the certificate and private key.

  4. Right click and select Export 2 items....

  5. Save the file as cert.p12, make sure the File Format is Personal Information Exchange (p12).

  6. If you decide to set a password for your exported certificate, please read the Configuration section below.

  7. Convert the certificate to a .pem, where <environment> should be development or production, depending on the certificate you exported.

    openssl pkcs12 -nodes -clcerts -in cert.p12 -out <environment>.pem

  8. Move the .pem file into your Rails application under config/rapns.

Configuration

Environment configuration lives in config/rapns/rapns.yml. For common setups you probably wont need to change this file.

If you want to use rapns in environments other than development or production, you will need to create an entry for it. Simply duplicate the configuration for development or production, depending on which iOS Push Certificate you wish to use.

Options:

  • host the APNs host to connect to, either gateway.sandbox.push.apple.com or gateway.sandbox.push.apple.com.
  • port the APNs port. Currently 2195 for both hosts.
  • certificate The path to your .pem certificate, config/rapns is automatically checked if a relative path is given.
  • certificate_password (default: blank) the password you used when exporting your certificate, if any.
  • airbrake_notify (default: true) Enables/disables error notifications via Airbrake.
  • poll (default: 2) Frequency in seconds to check for new notifications to deliver.
  • connections (default: 3) the number of connections to keep open to the APNs. Consider increasing this if you are sending a very large number of notifications.
  • pid_file (default: blank) the file that rapns will write its process ID to. Paths are relative to your project's RAILS_ROOT unless an absolute path is given.

Starting the rapns Daemon

cd /path/to/rails/app
bundle exec rapns <Rails environment>

Options

  • --foreground will prevent rapns from forking into a daemon.

Logging

rapns logs activity to rapns.log in your Rails log directory. This is also printed to STDOUT when running in the foreground. When running as a daemon rapns does not print to STDOUT or STDERR.

Sending a Notification

n = Rapns::Notification.new
n.device_token = "934f7a..."
n.alert = "This is the message shown on the device."
n.badge = 1
n.sound = "1.aiff"
n.expiry = 1.day.to_i
n.attributes_for_device = {"question" => nil, "answer" => 42}
n.deliver_after = 1.hour.from_now
n.save!
  • sound defaults to 1.aiff. You can either set it to a custom .aiff file, or nil for no sound.
  • expiry is the time in seconds the APNs (not rapns) will spend trying to deliver the notification to the device. The notification is discarded if it has not been delivered in this time. Default is 1 day.
  • attributes_for_device is the NSDictionary argument passed to your iOS app in either didFinishLaunchingWithOptions or didReceiveRemoteNotification.
  • deliver_after is not required, but may be set if you'd like to delay delivery of the notification to a specific time in the future.

Assigning a Hash to alert

Please refer to Apple's documentation (Tables 3-1 and 3-2).

Not yet implemented!

Delivery Failures

The APN service provides two mechanism for delivery failure notification:

Immediately, when processing a notification for delivery.

Although rapns makes such errors highly unlikely due to validation, the APNs reports processing errors immediately after being sent a notification. These errors are all centred around the well-formedness of the notification payload. Should a notification be rejected due to such an error, rapns will update the following attributes on the notification and send a notification via Airbrake/Hoptoad (if enabled):

failed flag is set to true. failed_at is set to the time of failure. error is set to Apple's code for the error. error_description is set to a (somewhat brief) description of the error.

rapns will not attempt to deliver the notification again.

Via the Feedback Service.

Not implemented yet!

Contributing to rapns

Fork as usual and go crazy!

Contributors

Thank you to the following wonderful people for contributing to rapns:

About

Easy to use library for Apple's Push Notification Service with Rails 3

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

114 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rapns Build Status

Easy to use library for Apple's Push Notification Service with Rails 3.

Features

  • Works with Rails 3 and Ruby 1.9.
  • Uses a daemon process to keep open a persistent connection to the Push Notification Service, as recommended by Apple.
  • Uses the enhanced binary format (Figure 5-2) so that delivery errors can be reported.
  • Airbrake (Hoptoad) integration.
  • Support for dictionary alert properties (Table 3-2).

Getting Started

Add rapns to your Gemfile:

gem 'rapns'

Generate the migration, rapns.yml and migrate:

rails g rapns
rake db:migrate

Generating Certificates

  1. Open up Keychain Access and select the Certificates category in the sidebar.

  2. Expand the disclosure arrow next to the iOS Push Services certificate you want to export.

  3. Select both the certificate and private key.

  4. Right click and select Export 2 items....

  5. Save the file as cert.p12, make sure the File Format is Personal Information Exchange (p12).

  6. If you decide to set a password for your exported certificate, please read the Configuration section below.

  7. Convert the certificate to a .pem, where <environment> should be development or production, depending on the certificate you exported.

    openssl pkcs12 -nodes -clcerts -in cert.p12 -out <environment>.pem

  8. Move the .pem file into your Rails application under config/rapns.

Configuration

Environment configuration lives in config/rapns/rapns.yml. For common setups you probably wont need to change this file.

If you want to use rapns in environments other than development or production, you will need to create an entry for it. Simply duplicate the configuration for development or production, depending on which iOS Push Certificate you wish to use.

Options:

  • host the APNs host to connect to, either gateway.sandbox.push.apple.com or gateway.sandbox.push.apple.com.
  • port the APNs port. Currently 2195 for both hosts.
  • certificate The path to your .pem certificate, config/rapns is automatically checked if a relative path is given.
  • certificate_password (default: blank) the password you used when exporting your certificate, if any.
  • airbrake_notify (default: true) Enables/disables error notifications via Airbrake.
  • poll (default: 2) Frequency in seconds to check for new notifications to deliver.
  • connections (default: 3) the number of connections to keep open to the APNs. Consider increasing this if you are sending a very large number of notifications.
  • pid_file (default: blank) the file that rapns will write its process ID to. Paths are relative to your project's RAILS_ROOT unless an absolute path is given.

Starting the rapns Daemon

cd /path/to/rails/app
bundle exec rapns <Rails environment>

Options

  • --foreground will prevent rapns from forking into a daemon.

Logging

rapns logs activity to rapns.log in your Rails log directory. This is also printed to STDOUT when running in the foreground. When running as a daemon rapns does not print to STDOUT or STDERR.

Sending a Notification

n = Rapns::Notification.new
n.device_token = "934f7a..."
n.alert = "This is the message shown on the device."
n.badge = 1
n.sound = "1.aiff"
n.expiry = 1.day.to_i
n.attributes_for_device = {"question" => nil, "answer" => 42}
n.deliver_after = 1.hour.from_now
n.save!
  • sound defaults to 1.aiff. You can either set it to a custom .aiff file, or nil for no sound.
  • expiry is the time in seconds the APNs (not rapns) will spend trying to deliver the notification to the device. The notification is discarded if it has not been delivered in this time. Default is 1 day.
  • attributes_for_device is the NSDictionary argument passed to your iOS app in either didFinishLaunchingWithOptions or didReceiveRemoteNotification.
  • deliver_after is not required, but may be set if you'd like to delay delivery of the notification to a specific time in the future.

Assigning a Hash to alert

Please refer to Apple's documentation (Tables 3-1 and 3-2).

Not yet implemented!

Delivery Failures

The APN service provides two mechanism for delivery failure notification:

Immediately, when processing a notification for delivery.

Although rapns makes such errors highly unlikely due to validation, the APNs reports processing errors immediately after being sent a notification. These errors are all centred around the well-formedness of the notification payload. Should a notification be rejected due to such an error, rapns will update the following attributes on the notification and send a notification via Airbrake/Hoptoad (if enabled):

failed flag is set to true. failed_at is set to the time of failure. error is set to Apple's code for the error. error_description is set to a (somewhat brief) description of the error.

rapns will not attempt to deliver the notification again.

Via the Feedback Service.

Not implemented yet!

Contributing to rapns

Fork as usual and go crazy!

Contributors

Thank you to the following wonderful people for contributing to rapns:

About

Easy to use library for Apple's Push Notification Service with Rails 3

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages